4

私たちが持っている場合

<ScrollViewer Name="scroll_viewer" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <Canvas Name="canvas" Height="200" Width="200">
        <Rectangle Fill="AliceBlue" Width="100" Height="100"/>  
    </Canvas>
</ScrollViewer> 

ハンドラー付き:

scroll_viewer.PreviewMouseLeftButtonDown
scroll_viewer.MouseLeftButtonDown
canvas.PreviewMouseLeftButtonDown

次に、長方形をクリックすると、scroll_viewer_PreviewMouseLeftButtonDown最初に呼び出されますcanvas_PreviewMouseLeftButtonDownが、scroll_viewer_MouseLeftButtonDown呼び出されません。
キャンバスで最初にクリックイベントを処理したい-オブジェクトがクリックされた場合、イベントを処理したい(オブジェクトドラッグの場合)。キャンバスオブジェクトがクリックされていない場合は、scroll_viewerでイベントを処理します(マウスでスクロールビューのパンを管理するため)。
呼び出し順序が私が望むものの反対であり、非表示バージョンscroll_viewer.MouseLeftButtonDownが呼び出されない場合、これをどのように管理しますか?

更新:
この投稿から:Silverlightフォーラム

((FrameworkElement)scroll_viewer.GetValue(ScrollViewer.ContentProperty)).MouseLeftButtonDown += scroll_viewer_MouseLeftButtonDown;

動作しますか?つまり、プレビューイベントの後に呼び出されます-なぜこれが明白ではない構文が必要なのかを説明できますか?

4

2 に答える 2

6

問題は、次のように、ScrollViewerすでにMouseLeftButtonDownイベントを内部で処理していることです。

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    if (base.Focus())
        e.Handled = true;
    base.OnMouseLeftButtonDown(e);
}

次のように、カスタム クラスを使用してこれを「修正」できます。

public class MyScrollViewer : ScrollViewer {

    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
        base.OnMouseLeftButtonDown(e);
        e.Handled = false;
    }
}

補足:x:Nameではなく、XAML で使用する必要がありますName。そうしないと、上記のクラスを使用してコンパイル エラーが発生する可能性があります。

MouseLeftButtonDownまたは、処理されたものを含むすべてのイベントにハンドラーをアタッチすることもできます。したがって、代わりに:

this.scroll_viewer.MouseLeftButtonDown += new MouseButtonEventHandler(scroll_viewer_MouseLeftButtonDown);

あなたが使用するだろう:

this.scroll_viewer.AddHandler(ScrollViewer.MouseLeftButtonDownEvent, new MouseButtonEventHandler(this.scroll_viewer_MouseLeftButtonDown), true);
于 2011-10-28T14:10:06.787 に答える
2

Previewイベントは、戦略と同様のルーティング戦略に従います。Tunnelingつまり、イベントは要素ツリーの最上部から始まり、下に移動します。したがって、最初に ScrollViewer にヒットし、次に Canvas にヒットします。

非プレビュー イベントは、戦略と同様のルーティング戦略に従いますBubbling。つまり、イベントは発生したオブジェクトで開始し、要素ツリーを上に移動します。この場合、Canvas が最初にヒットし、次に ScrollViewer がヒットします。

ルーティング戦略の詳細については、こちらをご覧ください

補足として、キャンバス オブジェクトが HitTest イベントで表示されるようにするには、非透明の背景が必要です。したがって、背景色が指定されていない Canvas がある場合、デフォルトで透明になり、HitTests では表示されません。

于 2011-10-28T14:11:27.470 に答える