我得到一个带有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事件。我可能不再认为问题只是拖延我。如果有人可以提供一些代码或帮助我朝正确的方向发展,我会很高兴。有没有快速的方式/修复我很乐意这样做。
(常规)按钮单击事件是路由事件。
只要它没有标记为已处理,事件就会传播可视树,任何订阅的处理程序都会将其提取出来。
你的描述有点令人困惑,因为你提到了一个未指定的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绑定。