2013-08-02 22 views
3

在WPF应用程序中,假设有'n'个图片类型的图片,并且如果点击任何图片(即图片类型),其可见性应该会崩溃。现在一个正常的方法是编写代码来为每个图片的每个“Click”事件折叠。
是否有另一种方式,以便应用程序可以理解,只要单击图像类型的任何UI元素(图片),然后该特定元素(图片)应该折叠?
我想减少代码,我该如何实现这一目标?如何为同一类型的UIElement编写通用事件处理程序?

回答

3

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

这允许单个事件处理程序来处理子控件的所有事件。事件参数的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; 
} 
+0

我仍然对C#感兴趣,请给出一个简短的代码示例吗? –

+0

@ Sidsec9添加了代码示例 –

+0

此解决方案的工作方式与我想要的最接近!为什么选择RoutesEventArgs上的MouseButtonEventArgs?它有什么好处? –

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; 
} 
+0

你能不能请ela用一个例子硼酸盐?更新了 –

+0

以显示示例。 –

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; 
    } 
+0

这完美的作品!我有一个问题,但如果我想让一张照片和其他照片的功能不同,我该怎么办? –

+0

你的处理程序中有'sender'。您可以检查图像名称或其他一些属性,并为需要专门处理的图像进行工作。 –

相关问题