我在WPF中遇到了一些意想不到的行为。这是我的情景:
这是窗口中“Surfaces”之间的一些拖放操作的全部设置。我首先单独连接Surface类上的所有拖放事件,一切正常。我可以正确检测鼠标下的PlayingCard UserControl并将其拖动,使用Adorners进行反馈等。
然后我将拖放的内容抽象为一个单独的静态类。突然,在鼠标点击下检测到的UIElement不再是PlayCard,而是Surface!
我目前有三个不同的事件处理程序连接到Surface的PreviewLeftMouseButtonDown事件,而且我正在覆盖Surface上的OnPreviewLeftMouseButtonDown方法。我希望所有这些方法之间的一致行为来处理这个方法,但我没有得到它。结果如下:
(1)我有一个名为Test的实例化类,它有一个连接到Surface的PreviewLeftMouseButtonDown事件的方法。这发生在Window的main方法中。它检测Surface而不是PlayingCard作为Source。
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
TestClass test = new TestClass();
_leftSurface.PreviewMouseLeftButtonDown += test.Test_PreviewMouseLeftButtonDown;
(2)我有一个名为DragDropManager的静态类,它也连接到Surface的事件,也在Window main方法中。它还会将Surface检测为源,而不是PlayCard。
public Window1()
{
InitializeComponent();
TestClass test = new TestClass();
_leftSurface.PreviewMouseLeftButtonDown += test.Test_PreviewMouseLeftButtonDown;
_leftSurface.PreviewMouseMove += DragDropManager.PreviewMouseMove;
(3)我正在覆盖Surface的OnPreviewLeftMouseButtonDown事件。它将Surface检测为源:
protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnPreviewMouseLeftButtonDown(e);
(4)Surface类有自己的事件处理程序,在XML中指定,并且它正确地将PlayingCard检测为源。
<UserControl x:Class="WpfTest.Surface"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<Border Name="_border" BorderThickness="4" BorderBrush="Blue">
<Canvas Name="_surface" Background="Black" AllowDrop="True"
ClipToBounds="True"
PreviewMouseMove="Surface_PreviewMouseMove"
PreviewMouseLeftButtonDown="Surface_PreviewMouseLeftButtonDown"
DragOver="Canvas_DragOver" DragLeave="Canvas_DragLeave">
</Canvas>
</Border>
</UserControl>
正确检测PlayingCard的唯一事件处理程序是MouseButtonEventArgs.Source,它是通过XML分配给Surface的事件处理程序。
为什么我会得到两个不同的结果?为什么其他事件处理程序没有正确报告PlayCard作为源?
答案 0 :(得分:1)
试试e.OriginalSource。