PreviewLeftMouseButtonDown监听器为同一事件报告不同的MouseButtonEventArgs.Source

时间:2009-03-18 23:05:21

标签: c# wpf events mouse

我在WPF中遇到了一些意想不到的行为。这是我的情景:

  1. 我在一个窗口上有一个UserControl。我们称之为“表面”。它上面有一个Canvas。
  2. 我有第二个UserControl。我们称之为“PlayingCard”。
  3. 我将PlayingCard UserControl添加为Surface的Canvas的Child。在视觉上它可以在Surface顶部显示。
  4. 这是窗口中“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作为源?

1 个答案:

答案 0 :(得分:1)

试试e.OriginalSource。

相关问题