WPF запускает событие click из одного UserControl в другое событие click - PullRequest
0 голосов
/ 15 марта 2019

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

<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 Ответ

0 голосов
/ 15 марта 2019

Событие обычного нажатия кнопки является перенаправленным событием.

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

Ваше описание немного сбивает с толку, потому что вы упоминаете неопределенный 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.

...