我有一个包含大图像的ScrollViewer。我希望用户能够按住鼠标并拖动图像以将其左右移动,并且我正在尝试使用行为实现此功能。问题在于,当用户按下鼠标按钮时,鼠标停止事件似乎无法在ScrollViewer上触发。有了后面的代码,我会在图像上处理该事件,但是只会附加到一个控件的行为,我不知道如何处理此问题。如何创建引用多个控件的WPF行为?
我应该使用什么方法创建一个System.Windows.Interactivity.Behavior连接到两个对象?
我有一个包含大图像的ScrollViewer。我希望用户能够按住鼠标并拖动图像以将其左右移动,并且我正在尝试使用行为实现此功能。问题在于,当用户按下鼠标按钮时,鼠标停止事件似乎无法在ScrollViewer上触发。有了后面的代码,我会在图像上处理该事件,但是只会附加到一个控件的行为,我不知道如何处理此问题。如何创建引用多个控件的WPF行为?
我应该使用什么方法创建一个System.Windows.Interactivity.Behavior连接到两个对象?
在ScrollViewer上引发了MouseLeftButtonDown事件。问题在于ScrollViewer正在处理事件本身(e.Handled = true)。而且由于它已经被处理,你的行为不会收到它。
根据你在做什么,你可能只能使用PreviewMouseLeftButtonDown事件。这种方式无关紧要,因为行为首先接收它,ScrollViewer会处理它。
您也可以尝试直接使用拖放&拖放事件。但我不确定这是否会奏效。
您的意思是图像在它到达滚动查看器之前处理事件本身? – 2011-04-29 13:16:36
否... ScrollViewer正在处理事件,如果我记得正确。通过MouseLeftButtonDown覆盖。不完全确定如何以及为什么,但最终在订阅该活动时不会收到通知,因为它已由某人处理。 – harri 2011-04-29 14:45:47
@harri好的。我假设它是由Image控件以类似于Javascript事件冒泡的方式处理的。 – 2011-04-29 15:28:27
您不需要附加到元素就可以添加事件处理程序。如果您AssociatedObject
是ScrollViewer
那么你可能能够得到这样对图像的引用:
var image = AssociatedObject.Content as Image;
,然后你可以添加鼠标事件处理程序:
image.MouseLeftButtonDown += (s, e) => Debug.WriteLine("Clicked!");
所以您是对象附加到您的相关对象,是您的“家庭基地”,但您可以使用任何可以让您掌握的对象,包括使用VisualTreeHelper
来行走视觉树。
只是为了澄清:你是否说你要开始图像拖动,即使当用户鼠标不在图像上,但在滚动查看器? – 2011-04-28 20:52:07
图像应该占据ScrollViewer的全部内容,所以除了滚动条以外,是的。 – 2011-04-28 21:03:37