【问题标题】:How to write a common Event Handler for a UIElement of same type?如何为相同类型的 UIElement 编写通用事件处理程序?
【发布时间】:2013-08-02 19:42:00
【问题描述】:

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

【问题讨论】:

    标签: c# wpf xaml wpf-controls uielement


    【解决方案1】:

    您可以利用这些是路由事件这一事实,并设置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;
    }
    

    【讨论】:

    • 我还在学习 C#,你能给出一个简短的代码示例吗?
    • 这个解决方案最接近我想要的!为什么选择 MouseButtonEventArgs 而不是 RoutedEventArgs?它有什么好处?
    • @Sidsec9 在这种情况下,没有任何好处。但是,MouseLeftButtonDown 事件是以这种方式声明的,因此它可以传递额外的信息。由于该特定事件使用 MouseButtonEventArgs,因此我的方法也是如此。 (MouseButtonEventArgs 派生自 RoutedEventArgs,但提供了额外信息)
    【解决方案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;
        }
    

    【讨论】:

    • 这完美!不过我有一个问题,如果我想让一张图片的功能与其他图片不同,该怎么办?
    • 您的处理程序中有sender。您可以在其中检查图像名称或其他一些属性,并为需要特殊处理的图像做您的工作。
    【解决方案3】:

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

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

    【讨论】:

    • 你能举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多