WPF RoutedEvent(通过 EventManager.RegisterClassHandler)

标签 wpf routedevent

我正在尝试找到一种通用方法来跟踪当前窗口中任何控件(数据绑定(bind)与否)的“修改”(例如,在典型的“选项”窗口中启用或禁用“应用”按钮。)事实上,我只需要连接一些事件处理程序,例如 ComboBox.SelectionChanged 或 TextBox.TextChanged。在 WinForms 中,我必须循环遍历表单中的所有控件并将这些事件一一连接起来,并且它起作用了。在 WPF 中,我认为我可以用更少的代码来完成它,例如

EventManager.RegisterClassHandler( typeof(MyCtrl)
                                 , ComboBox.SelectionChangedEvent
                                 , new RoutedEventHandler(OnChanged));

通过这一行代码,我将能够为 MyCtrl 中的所有组合框连接 comobobox 的选择更改事件。然而,我遇到的问题是,如果我正确地看到它,当窗口中存在另一个不是组合框但也派生自“Selector”的控件时,也会触发此事件。例如,我在同一窗口上也有一个数据网格(实际上数据网格中没有组合框列),当我选择不同的行时也会触发此事件。

因此,上面的代码行似乎为从 Selector 基派生的所有控件(而不仅仅是组合框) Hook 了 SelectionChanged 事件。

这是对的吗?如何为所有组合框连接 SelectionChanged 事件?

编辑更多示例:在同一个控件上,我有一个组合框和一个按钮,我想跟踪 Button.Click 和 ComboBox.SelectionChanged 事件,如下所示

EventManager.RegisterClassHandler( typeof(MyCtrl)
                                 , ComboBox.SelectionChangedEvent
                                 , new RoutedEventHandler(OnChanged));
EventManager.RegisterClassHandler( typeof(MyCtrl)
                                 , Button.ClickEvent
                                 , new RoutedEventHandler(OnChanged));

问题是我在单击 ComboBox 下拉按钮后立即收到 Button.Click 事件。我怎样才能防止这种情况发生?

以下是此事件的一些额外信息:

?e.OriginalSource
{System.Windows.Controls.Primitives.ToggleButton Content: 
            IsChecked:True}
    base {System.Windows.Controls.Primitives.ButtonBase}: 
            {System.Windows.Controls.Primitives.ToggleButton Content: IsChecked:True}
    IsChecked: true
    IsThreeState: false
?e.RoutedEvent
{ButtonBase.Click}
    HandlerType: {Name = "RoutedEventHandler" 
                  FullName = "System.Windows.RoutedEventHandler"}
    Name: "Click"
    OwnerType: {Name = "ButtonBase" 
                FullName = "System.Windows.Controls.Primitives.ButtonBase"}
    RoutingStrategy: Bubble

最佳答案

我认为您无法阻止这种情况,因为这些控件重用相同的事件,这通常是一件好事。您可以尝试根据发送者进行过滤,并忽略来自您不感兴趣的控件的调用。

关于WPF RoutedEvent(通过 EventManager.RegisterClassHandler),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4279286/

相关文章:

wpf - 奇怪的 KeyUp 行为(主窗体处理来自子进程的事件?!)

c# - 已处理的 RoutedEvent 继续冒泡树

WPF FrameworkElement 不接收鼠标输入

Wpf 垂直进度条样式

c# - WPF 改变窗口模式状态

c# - Caliburn.Micro View 切换

c# - 数据绑定(bind)到不同 UserControl 中的 ObservableCollection - 如何保留当前选择?

c# - 使用 MVVM 模式在 WPF 中创建对话框时如何实例化对话框并记录用户输入

c# - 如何对 CanExecute RoutedEventHandler 进行单元测试?