【问题标题】:WPF trigger a click event from one UserControl to another click eventWPF 触发从一个 UserControl 到另一个单击事件的单击事件
【发布时间】:2019-08-06 09:37:29
【问题描述】:

我得到了一个带有 Click 事件的 UserControl,我希望在另一个 UserControl 中由另一个 Button 的 click 事件触发该事件。它不起作用。 UserControl2 在 UserControl1 内。我遇到这个问题已经有一段时间了,之前在应用程序的其余部分中使用了一个 RelayCommand 类,只有 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。 但是,这是当前状态的代码,但我一直在尝试在互联网上使用不同的示例。但我没有让它工作,甚至尝试做一个自定义的 ClickRoutedEventArgs。只能在 UserControl2 中直接触发 Click 事件。我可能不再想清楚了,问题只是拖累了我。如果有人可以为我提供一些代码或帮助我朝着正确的方向前进,我会很高兴。有没有一种快速的方法/修复我很乐意这样做。

【问题讨论】:

  • 很遗憾您已经抛弃了 MVVM 方法并回到了 WinForms 式的事件处理方式。正确实现的 MVVM 模式将非常轻松地解决您的问题。这种变化有原因吗?
  • 嗯,它背后的原因是因为它是全景图片视图,而且我对 C# 来说太新了,无法使该部分与 MVVM 一起使用。
  • 请详细说明:“因为是全景图”

标签: c# wpf button user-controls routedeventargs


【解决方案1】:

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

只要它没有被标记为已处理,该事件就会向上传播可视化树,并且任何订阅的处理程序都会将其拾取。

您的描述有点令人困惑,因为您提到了一个未指定的 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。因此,可以将 Button 模板化为图像、用户控件或其他任何东西。因此,无论按钮和单击/命令的行为如何。

我不明白为什么你不能只绑定一个命令。您可以将命令放在 UC2 的数据上下文中,并使用 UC1 的相对源绑定。

【讨论】:

  • 类似于 US2 中的内容: cmdClickData ?或者我只是把它作为 ICommand 公开,测试了很多东西
  • UC1: Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.cmdClickData}"
  • Ancestortype 应该是具体的用户控件类型,例如local:UserControl1 或2。如果你只是使用用户控件,它会找到内部的用户控件。
  • ait 基本上在这种情况下我想按下 UserControl 1 中的按钮并在 UserControl 2 中执行事件。所以 x:Type UserControl2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2011-04-03
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多