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

问题描述 投票:0回答:1

我得到一个带有Click事件的UserControl,我希望由另一个UserControl中的另一个Button的click事件触发。它不起作用。 UserControl2位于UserControl1内部。我已经有一段时间遇到这个问题,之前在应用程序的其余部分使用了一个只有MVVM的RelayCommand类,直到我想要在按钮点击时交换图片的情况。但按钮和图像发生的位置应分为两个不同的UserControl。无论如何,我在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);
}

该应用程序构建了许多UserControls和具有不同视图的按钮。就像我说的,我之前使用过ViewModels和Views的MVVM。但是,这是当前状态下的代码,但我一直在尝试使用互联网上的不同示例。但我没有让它工作,甚至尝试做一个自定义ClickRoutedEventArgs。只能直接在UserControl2中触发Click事件。我可能不再认为问题只是拖延我。如果有人可以提供一些代码或帮助我朝正确的方向发展,我会很高兴。有没有快速的方式/修复我很乐意这样做。

c# wpf button user-controls routedeventargs
1个回答
0
投票

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

只要它没有标记为已处理,事件就会传播可视树,任何订阅的处理程序都会将其提取出来。

你的描述有点令人困惑,因为你提到了一个未指定的UserControl,Usercontrol 1和2.但是我收集用户在UC2中的点击,那是“内部”UC1,你想要处理UC1中的点击事件。

通过明确地使e.handled = false来做到这一点;在您在UC2中订阅的任何处理程序中。

然后事件应该“冒泡”,你也可以在UC1级别处理它。注意这不是UC1中的某个按钮,而是UC1级别。

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

因此,您可以在UC1标记中连接处理程序,而不是uc1中的按钮。

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

我不遵循为什么你不能只是绑定命令。您可以将命令放在UC2的datacontext中,并使用UC1的relativesource绑定。

© www.soinside.com 2019 - 2024. All rights reserved.