ScrollViewer中的画布(预览)MouseButtonDown事件顺序

Ric*_*bob 3 wpf scrollviewer mouseleftbuttondown

如果我们有

<ScrollViewer Name="scroll_viewer" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <Canvas Name="canvas" Height="200" Width="200">
        <Rectangle Fill="AliceBlue" Width="100" Height="100"/>  
    </Canvas>
</ScrollViewer> 
Run Code Online (Sandbox Code Playgroud)

与处理程序:

scroll_viewer.PreviewMouseLeftButtonDown
scroll_viewer.MouseLeftButtonDown
canvas.PreviewMouseLeftButtonDown
Run Code Online (Sandbox Code Playgroud)

然后,如果我们点击我们得到的矩形scroll_viewer_PreviewMouseLeftButtonDown称为第一则canvas_PreviewMouseLeftButtonDown,但scroll_viewer_MouseLeftButtonDown不叫.
我想首先在画布中处理click事件 - 如果单击一个对象我想处理事件(对象拖动).如果没有单击画布对象,我想在scroll_viewer中处理事件(使用鼠标管理scrollview平移).
考虑到呼叫顺序是我想要的对话scroll_viewer.MouseLeftButtonDown并且不调用非perview版本,如何管理这个?

更新:
从这篇文章:Silverlight论坛

((FrameworkElement)scroll_viewer.GetValue(ScrollViewer.ContentProperty)).MouseLeftButtonDown += scroll_viewer_MouseLeftButtonDown;
Run Code Online (Sandbox Code Playgroud)

是否工作即在预览事件后调用 - 有人可以解释为什么需要这种不太明显的语法吗?

Cod*_*ked 5

问题是ScrollViewer已经在MouseLeftButtonDown内部处理事件,如下所示:

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    if (base.Focus())
        e.Handled = true;
    base.OnMouseLeftButtonDown(e);
}
Run Code Online (Sandbox Code Playgroud)

你可以使用自定义类"修复"这个,如下所示:

public class MyScrollViewer : ScrollViewer {

    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
        base.OnMouseLeftButtonDown(e);
        e.Handled = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

侧面注意:您应该x:Name在XAML中使用,而不是Name.否则,您可能会使用上面的类遇到编译错误.

或者,您可以为所有MouseLeftButtonDown事件附加处理程序,包括已处理的事件.所以代替:

this.scroll_viewer.MouseLeftButtonDown += new MouseButtonEventHandler(scroll_viewer_MouseLeftButtonDown);
Run Code Online (Sandbox Code Playgroud)

你用的是:

this.scroll_viewer.AddHandler(ScrollViewer.MouseLeftButtonDownEvent, new MouseButtonEventHandler(this.scroll_viewer_MouseLeftButtonDown), true);
Run Code Online (Sandbox Code Playgroud)