如何为相同类型的UIElement编写通用事件处理程序

本文关键字:事件处理 程序 UIElement 同类型 | 更新日期: 2023-09-27 18:26:14

在WPF应用程序中,假设有'n'个图像类型的图片,如果单击任何图片(即图像类型),其可见性应该会崩溃。现在,一种正常的方法是为每张图片的每个"点击"事件编写折叠代码
是否有另一种方法可以让应用程序理解,无论何时单击图像类型的任何UI元素(图片),都应该折叠该特定元素(照片)
我想减少代码,我该如何实现?

如何为相同类型的UIElement编写通用事件处理程序

您可以利用这些是路由事件的事实,并在父元素上设置单个处理程序。

这允许单个事件处理程序处理子控件的所有事件。例如,如果您订阅了UIElement.MouseLeftButtonDown或类似的"共享"事件,则事件参数的OriginalSource属性将提供单击的UIElement。


您可以通过在XAML中向容器中添加来实现这一点

<Grid UIElement.MouseLeftButtonDown="CommonClickHandler">
    <!-- Your elements here -->

然后,在你的代码后面:

private void CommonClickHandler(object sender, MouseButtonEventArgs e)
{
    Image picture = e.OriginalSource as Image;  //OriginalSource is the original element
    if (picture != null)
        picture.Visibility = Visibility.Collapsed;
}

您可以使用EventManager.RegisterClassHandler添加全局处理程序,如下所示-

    public MainWindow()
    {
        InitializeComponent();
        EventManager.RegisterClassHandler(typeof(Image), Image.MouseDownEvent,
              new RoutedEventHandler(OnMouseDown));
    }
    private void OnMouseDown(object sender, RoutedEventArgs e)
    {
        (sender as Image).Visibility = System.Windows.Visibility.Collapsed;
    }

您可以注册在多个事件处理程序上使用的方法,并通过使用Object sender参数并将其强制转换为正在使用的控件类型来访问特定控件。

myControl.Click += new EventHandler(myGenericClickMethod);
public void myGenericClickMethod(Object sender, EventArgs e)
{
  Image myImage = (Image) sender;
  myImage..Visibility = System.Windows.Visibility.Collapsed;
}