WPF触发从一个UserControl到另一个点击事件的点击事件

时间:2019-03-15 10:20:37

标签: c# wpf button user-controls routedeventargs

我有一个带Click事件的UserControl,我想由另一个UserControl中的另一个Button的click事件触发。没用UserControl2在UserControl1内部。我遇到这个问题已有一段时间了,之前在应用程序的其余部分中仅使用了MVVM的RelayCommand类,直到出现想单击按钮交换图片的场景为止。但是按钮和图像交换发生的位置应分为两个不同的UserControl。无论如何,我在用户控件2上获得了以下XAML,其中imageswapping是:

<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);
}

该应用程序内置了许多具有不同视图的UserControl和按钮。就像我说的那样,我之前在ViewModels和Views中使用了MVVM。 但是,这是当前状态的代码,但是我一直在尝试使用Internet上的其他示例。但是我什至没有尝试,甚至尝试做一个自定义的ClickRoutedEventArgs。只能直接在UserControl2中触发Click事件。我可能不会再想清楚了,问题只是把我拖了下来。如果外面有人可以为我提供一些代码或在正确的方向上帮助我,我将很高兴。有一种快速的方法/修复方法,我很乐意这样做。

1 个答案:

答案 0 :(得分:0)

(常规)按钮单击事件是路由事件。

只要未将其标记为已处理,该事件就会提升视觉树,任何订阅的处理程序都会将其拾取。

您的描述有点混乱,因为您提到了未指定的UserControl,Usercontrol 1和2。但是我收集了UC2中的用户点击,而这是在UC1内,并且您想处理UC1中的click事件。

通过显式使e.handled = false来实现;您在UC2中订阅的任何处理程序中。

该事件随后应“冒泡”,您也可以在UC1级别进行处理。注意这不是在UC1的某个按钮上,而是在UC1级别。

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

因此,您需要在UC1标签中而不是uc1中的按钮连接处理程序。

请记住,您可以将按钮模板化为可定义的任何UI。因此,可以将Button模板化为图像,用户控件等。因此,无论按钮和单击/命令的行为如何。

我不理解为什么您不能只绑定命令。您可以将命令放在UC2的数据上下文中,并使用来自UC1的相对源绑定。