WPF запускает событие click из одного UserControl в другое событие click

Я получил UserControl с событием Click, которое я хочу вызвать по событию click другой кнопки внутри другого UserControl. Не работает UserControl2 находится внутри UserControl1. У меня была эта проблема некоторое время, раньше я использовал класс RelayCommand с только MVVM в остальной части приложения до того момента, когда у меня был сценарий, когда я хотел поменять изображения одним нажатием кнопки. Но кнопка и место, где происходит перезапись изображений, должны быть разделены на два различных элемента управления пользователя. Во всяком случае, я получил следующий XAML на Usercontrol 2, где это wawapping изображения:

<Button x:Name="button" VerticalAlignment="Bottom" Height="48" Click="ClickData" />

Код позади UserControl2:

private bool switchimgbool = true;
public void ClickData(object sender, RoutedEventArgs e)
{
  if (switchimgbool == true)
  { switchimgbool = false; }
  else if (switchimgbool == false)
  { switchimgbool = true; }
  switch (switchimgbool)
  {
    case false:
    {
      //some code
    }
    case true:
    {
      //some code
    }
  }
}

В UserControl1 xaml:

<Viewbox Stretch="Fill" Height="270" VerticalAlignment="Top">
<local:UserControl2></local:UserControl2>
</Viewbox>
///
<Button x:Name="executebutton" Click="executebutton_Click" />

Код позади UserControl1:

public static RoutedEvent SetClickData = EventManager.RegisterRoutedEvent("ClickData", RoutingStrategy.Bubble, typeof(RoutedEventhandler), typeof(UserControl2));
public event RoutedEventHandler ClickData
{
  add { AddHandler(SetClickData, value);}
  remove { RemoveHandler(SetClickData, value);}
}

UserControl2 us2 = new UserControl2();

private void executebutton_Click(object sender, RoutedEventArgs e)
{
  us2.RaiseClickedEvent(sender);
}

Приложение построено с множеством пользовательских элементов управления и кнопок с различными представлениями. Как я уже сказал, я использовал MVVM ранее с ViewModels и Views. Тем не менее, это код в его текущем состоянии, но я пробовал разные примеры в Интернете. Но я не заставляю его работать, даже пытался сделать пользовательский ClickRoutedEventArgs. Может запускать только событие Click непосредственно в UserControl2. Возможно, я больше не думаю, что проблема в том, чтобы просто потянуть меня вниз. Если кто-нибудь сможет предоставить мне какой-нибудь код или помочь мне в правильном направлении, я буду счастлив. Есть ли быстрый способ / исправить, я был бы счастлив сделать это.

1 ответ

(Обычное) событие нажатия кнопки является перенаправленным событием.

Пока оно не помечено как обработанное, событие будет распространяться по визуальному дереву, и любой подписанный обработчик будет его забирать.

Ваше описание немного сбивает с толку, потому что вы упоминаете неопределенный UserControl, Usercontrol 1 и 2. Но я собираю пользовательские клики в UC2, и это "внутри" UC1, и вы хотите обработать событие click в UC1.

Сделайте это, явно сделав e.handled = false; в любом обработчике вы подписываетесь в UC2.

Событие должно "всплыть", и вы также можете обработать его на уровне UC1. ПРИМЕЧАНИЕ: это не какая-то кнопка в UC1, а на уровне UC1.

https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/routed-events-overview

Таким образом, вы бы подключили свой обработчик в тег UC1, а не кнопку в uc1.

Имейте в виду, что вы можете создать шаблон кнопки как любой элемент пользовательского интерфейса, который вы можете определить. Таким образом, кнопка может быть шаблонизирована как изображение, пользовательский контроль или что-то еще. Таким образом, давая что бы ни было поведение кнопки и щелчка / команды.

Я не понимаю, почему вы не можете просто связать команду, хотя. Вы можете поместить команду в текстовый текст UC2 и использовать привязку к родственному источнику из UC1.

Другие вопросы по тегам