如何为相同类型的UIElement编写通用事件处理程序
本文关键字:事件处理 程序 UIElement 同类型 | 更新日期: 2023-09-27 18:26:14
在WPF应用程序中,假设有'n'个图像类型的图片,如果单击任何图片(即图像类型),其可见性应该会崩溃。现在,一种正常的方法是为每张图片的每个"点击"事件编写折叠代码
是否有另一种方法可以让应用程序理解,无论何时单击图像类型的任何UI元素(图片),都应该折叠该特定元素(照片)
我想减少代码,我该如何实现?
您可以利用这些是路由事件的事实,并在父元素上设置单个处理程序。
这允许单个事件处理程序处理子控件的所有事件。例如,如果您订阅了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;
}