c# 同様の質問が寄せられています: AddHandler の使用は Event += Method と機能的に異なりますか?
しかし、私の調査では、そこで与えられた答えとは異なる結果が得られました。
http://manaspatnaik.com/blog/index.php/technology/wpf/routed-event-in-wpf-introduction/244に基づいて、IronPython で小さなデモを作成しました。
コードは次のとおりです。
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
誰でも状況を明確にできますか?違いはどこにありますか?
編集: mouse_move_event の代わりに Control.MouseMoveEvent を使用すると、EventManager から抽出されたコードを次の 2 行で削減できます。
#self.routed_events = EventManager.GetRoutedEvents()
#mouse_move_event = [ev for ev in self.routed_events if ev.Name =='MouseMove'][0]
本当に違いがわかりません。