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.