mogmo .NET

C#/XAML/VB6たまにC++についてメモ程度に書いていく。あくまで自分用。責任は取れません。

ThumbコントロールのMouseDownイベントを発生させる

social.msdn.microsoft.com

確かに,Thumbコントロールの MouseDown は,
イベントは起きないというか,
正確には,論理ツリーをbuble upして伝播していくんですが,
その時にハンドラメソッドが呼ばれないように,
Thumbコントロールが実装時にUIElement.MouseDownを
クラスハンドリング(class handling)して,handled = true してしまっていますね。
(handled == true だと,イベントが伝播してきても,
ふつうのやり方で登録されたハンドラメソッドは呼び出されない)


例えば,そのクラスハンドリング処理からの抜け道を作るため

public Window1()

{

InitializeComponent();


AddHandler(System.Windows.Controls.Primitives.Thumb.MouseDownEvent, new RoutedEventHandler(MyMouseDown), true);

}

void MyMouseDown(object sender, RoutedEventArgs e)

{

MessageBox.Show(string.Format("MyMouseDown: handled == {0}", e.Handled));

}


のように AddHandler してやる
と,
"MyMouseDown: handled == true"
となるので,クラスハンドリング(class handling)していることを確認できます。

なので,bublingイベントが発生してしなかったのですね。

回避方法は,Preview系(tunneling系)イベントを使うか,AddHandler(..., ..., true) を使うか
が,ヘルプによると,推薦のようですね。

# 私もかなり勉強になりました。
# 他のコントロールでもクラスハンドリングしているイベントが多々あると思うので,
# きっと,みんなこれがわからずに,嵌りますね...