3

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

4

3 回答 3

3

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

这允许单个事件处理程序处理子控件的所有事件。事件 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;
}
于 2013-08-02T19:45:01.523 回答
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;
    }
于 2013-08-02T19:52:21.723 回答
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;
}
于 2013-08-02T19:43:28.607 回答