已针对 c# 类似的问题提出了问题:使用 AddHandler 在功能上与 Event += Method 不同吗?
但我的研究给出了与那里给出的答案相反的不同结果。
这是代码:
import wpf
from System.Windows import Application, Window
from System.Windows.Media import Brushes
from System.Windows import EventManager
from System.Windows import RoutedEventHandler, RoutedEventArgs
class MyWindow(Window):
    def __init__(self):
        wpf.LoadComponent(self, 'WpfTestApplication1.xaml')
        #self.MyPanel.MouseMove += self.Mouse_Move_Handler
        delegate = RoutedEventHandler(self.Mouse_Move_Handler)
        self.routed_events = EventManager.GetRoutedEvents()
        mouse_move_event = [ev for ev in self.routed_events if ev.Name =='MouseMove'][0]
        self.MyPanel.AddHandler(mouse_move_event,delegate)
        self.MyPanel.MouseLeave += self.Mouse_Leave_Handler
        self.MyButton.MouseMove += self.Button_Handler
        self.MyButton.Click += self.Button_Click
        self.MyButton.Click += self.Button_Click
    def Mouse_Move_Handler(self, sender, e):
        self.MyPanel.Background = Brushes.Red
        self.MyLabel.Content = 'Inside Panel'
    def Mouse_Leave_Handler(self,sender,e):
        self.MyPanel.Background = Brushes.Cyan
        self.MyLabel.Content = 'Outside Panel'
    def Button_Handler(self, sender, e):
        self.MyPanel.Background = Brushes.DarkBlue
        e.Handled = True
    def Button_Click(self, sender, event):
        self.MyLabel.Background = Brushes.SaddleBrown
if __name__ == '__main__':
    win = MyWindow()
    Application().Run(win)
现在行为似乎完全相同。AddHandler 例程是否有原因?也有人可能会考虑尝试这样做:
 AddHandler(self.MouseMove,delegate) or AddHandler(Window.MouseMove,delegate)
导致错误:
ArgumentTypeException was unhandled by user code
expected RoutedEvent, got BoundEvent
任何人都可以澄清情况吗?区别在哪里?
编辑:通过使用 Control.MouseMoveEvent 而不是 mouse_move_event 从 EventManager 中提取代码可以通过这两行来减少:
    #self.routed_events = EventManager.GetRoutedEvents()
    #mouse_move_event = [ev for ev in self.routed_events if ev.Name =='MouseMove'][0]
我真的看不出有什么区别。