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)
是否工作即在预览事件后调用 - 有人可以解释为什么需要这种不太明显的语法吗?
问题是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)