WPF запускает событие click из одного пользовательского элемента управления в другое событие click

#c# #wpf #button #user-controls #routedeventargs

#c# #wpf #кнопка #пользовательские элементы управления #routedeventargs

Вопрос:

Я получил пользовательский элемент управления с событием щелчка, которое я хочу запускать событием щелчка другой кнопки внутри другого пользовательского элемента управления. Это не работает. 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 и представлениями.
Однако это код в его текущем состоянии, но я пробовал использовать разные примеры в Интернете. Но я не заставляю это работать, даже пытался выполнить пользовательский ClickRoutedEventArgs. Событие Click может запускаться только непосредственно в UserControl2. Возможно, я больше не могу ясно мыслить, проблема просто тянет меня вниз. Если кто-нибудь может предоставить мне какой-нибудь код или помочь мне в правильном направлении, я был бы рад. Есть ли быстрый способ / исправление, я был бы рад это сделать.

Комментарии:

1. Жаль, что вы отказались от подхода MVVM и вернулись к использованию событий в стиле WinForms. Правильно реализованный шаблон MVVM очень легко решит ваши проблемы. Есть ли причина для этого изменения?

2. Ну, причина этого в том, что это панорамный вид изображения, и я слишком новичок в C #, чтобы иметь возможность заставить эту часть работать с MVVM.

3. пожалуйста, уточните: «потому что это панорамный вид изображения»

Ответ №1:

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

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

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

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

Затем событие должно «всплыть», и вы также можете обработать его на уровне UC1. ОБРАТИТЕ внимание, что это происходит не на какой-либо кнопке в UC1, а на уровне UC1.

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

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

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

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

Комментарии:

1. Что-то вроде в US2: <Пользовательский элемент управления. DataContext> cmdClickData </UserControl. DataContext>? или я просто публикую его там как ICommand, проверил много вещей

2. UC1: Command=»{Привязка RelativeSource={Поиск источника RelativeSource, AncestorType={x:Тип UserControl}}, Путь=DataContext.cmdClickData}»

3. Ancestortype должен быть конкретным типом пользовательского элемента управления, таким как local:UserControl1 или 2. Если вы просто используете usercontrol, он найдет внутренний usercontrol.

4. в принципе, в этом случае я хочу нажать кнопку в UserControl 1 и выполнить событие в UserControl 2. итак, x:введите UserControl2