2011-04-28 42 views
1

我有一个包含大图像的ScrollViewer。我希望用户能够按住鼠标并拖动图像以将其左右移动,并且我正在尝试使用行为实现此功能。问题在于,当用户按下鼠标按钮时,鼠标停止事件似乎无法在ScrollViewer上触发。有了后面的代码,我会在图像上处理该事件,但是只会附加到一个控件的行为,我不知道如何处理此问题。如何创建引用多个控件的WPF行为?

我应该使用什么方法创建一个System.Windows.Interactivity.Behavior连接到两个对象?

+0

只是为了澄清:你是否说你要开始图像拖动,即使当用户鼠标不在图像上,但在滚动查看器? – 2011-04-28 20:52:07

+0

图像应该占据ScrollViewer的全部内容,所以除了滚动条以外,是的。 – 2011-04-28 21:03:37

回答

1

在ScrollViewer上引发了MouseLeftButtonDown事件。问题在于ScrollViewer正在处理事件本身(e.Handled = true)。而且由于它已经被处理,你的行为不会收到它。

根据你在做什么,你可能只能使用PreviewMouseLeftButtonDown事件。这种方式无关紧要,因为行为首先接收它,ScrollViewer会处理它。

您也可以尝试直接使用拖放&拖放事件。但我不确定这是否会奏效。

+0

您的意思是图像在它到达滚动查看器之前处理事件本身? – 2011-04-29 13:16:36

+0

否... ScrollViewer正在处理事件,如果我记得正确。通过MouseLeftButtonDown覆盖。不完全确定如何以及为什么,但最终在订阅该活动时不会收到通知,因为它已由某人处理。 – harri 2011-04-29 14:45:47

+0

@harri好的。我假设它是由Image控件以类似于Javascript事件冒泡的方式处理的。 – 2011-04-29 15:28:27

1

您不需要附加到元素就可以添加事件处理程序。如果您AssociatedObjectScrollViewer那么你可能能够得到这样对图像的引用:

var image = AssociatedObject.Content as Image; 

,然后你可以添加鼠标事件处理程序:

image.MouseLeftButtonDown += (s, e) => Debug.WriteLine("Clicked!"); 

所以您是对象附加到您的相关对象,是您的“家庭基地”,但您可以使用任何可以让您掌握的对象,包括使用VisualTreeHelper来行走视觉树。

相关问题