如何为相同类型的UIElement编写公共事件处理程序?

时间:2013-08-02 19:42:01

标签: c# wpf xaml wpf-controls uielement

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

3 个答案:

答案 0 :(得分:3)

您可以利用这些是路由事件的事实,并设置single handler on a parent element

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


您可以在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;
}

答案 1 :(得分:2)

您可以使用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;
    }

答案 2 :(得分:1)

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

myControl.Click += new EventHandler(myGenericClickMethod);

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