WPF 触发从一个 UserControl 到另一个点击事件的点击事件
WPF trigger a click event from one UserControl to another click event
我有一个带有 Click 事件的 UserControl,我想通过另一个 UserControl 中的另一个 Button 的点击事件来触发该事件。它不起作用。 UserControl2 在 UserControl1 的内部。我遇到这个问题已经有一段时间了,之前我在应用程序的其余部分使用了 RelayCommand class 和 MVVM,直到我遇到想通过单击按钮交换图片的场景。但是按钮和图像交换发生的地方应该被分成两个不同的用户控件。无论如何,我在 Usercontrol 2 上得到以下 XAML,其中图像交换是:
<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 一起使用。
但是,这是当前状态下的代码,但我一直在尝试使用 Internet 上的不同示例。但我没有让它工作,甚至尝试做一个自定义的 ClickRoutedEventArgs。只能在 UserControl2 中直接触发 Click 事件。我可能不再想清楚这个问题只是拖累我。如果有人可以为我提供一些代码或帮助我朝着正确的方向前进,我会很高兴。有没有快的way/fix我很乐意做
(常规)按钮单击事件是路由事件。
只要未标记为已处理,事件就会向上传播可视化树,任何订阅的处理程序都会将其拾取。
你的描述有点混乱,因为你提到了一个未指定的 UserControl,Usercontrol 1 和 2。但我在 UC2 中收集了用户点击,那是 "inside" UC1,你想在 UC1 中处理点击事件.
通过显式设置 e.handled = false 来做到这一点;在您在 UC2 中订阅的任何处理程序中。
然后事件应该 "bubble up",您也可以在 UC1 级别处理它。注意这不是在 UC1 中的某个按钮,而是在 UC1 级别。
https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/routed-events-overview
因此,您可以在 UC1 标记中连接您的处理程序,而不是在 uc1 中连接按钮。
请记住,您可以将按钮模板化为您可以定义的任何 UI 片段。所以 Button 可以被模板化为图像、用户控件或其他任何东西。因此无论按钮和 click/command.
的行为如何
我不明白为什么你不能只绑定一个命令。您可以将命令放在 UC2 的数据上下文中,并使用来自 UC1 的 relativesource 绑定。
我有一个带有 Click 事件的 UserControl,我想通过另一个 UserControl 中的另一个 Button 的点击事件来触发该事件。它不起作用。 UserControl2 在 UserControl1 的内部。我遇到这个问题已经有一段时间了,之前我在应用程序的其余部分使用了 RelayCommand class 和 MVVM,直到我遇到想通过单击按钮交换图片的场景。但是按钮和图像交换发生的地方应该被分成两个不同的用户控件。无论如何,我在 Usercontrol 2 上得到以下 XAML,其中图像交换是:
<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 一起使用。 但是,这是当前状态下的代码,但我一直在尝试使用 Internet 上的不同示例。但我没有让它工作,甚至尝试做一个自定义的 ClickRoutedEventArgs。只能在 UserControl2 中直接触发 Click 事件。我可能不再想清楚这个问题只是拖累我。如果有人可以为我提供一些代码或帮助我朝着正确的方向前进,我会很高兴。有没有快的way/fix我很乐意做
(常规)按钮单击事件是路由事件。
只要未标记为已处理,事件就会向上传播可视化树,任何订阅的处理程序都会将其拾取。
你的描述有点混乱,因为你提到了一个未指定的 UserControl,Usercontrol 1 和 2。但我在 UC2 中收集了用户点击,那是 "inside" UC1,你想在 UC1 中处理点击事件.
通过显式设置 e.handled = false 来做到这一点;在您在 UC2 中订阅的任何处理程序中。
然后事件应该 "bubble up",您也可以在 UC1 级别处理它。注意这不是在 UC1 中的某个按钮,而是在 UC1 级别。
https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/routed-events-overview
因此,您可以在 UC1 标记中连接您的处理程序,而不是在 uc1 中连接按钮。
请记住,您可以将按钮模板化为您可以定义的任何 UI 片段。所以 Button 可以被模板化为图像、用户控件或其他任何东西。因此无论按钮和 click/command.
的行为如何我不明白为什么你不能只绑定一个命令。您可以将命令放在 UC2 的数据上下文中,并使用来自 UC1 的 relativesource 绑定。