WPF CallMethodAction在Drop,DragOver和DragEnter事件中不起作用

我为我的wpf项目使用了MVVM,并且想要将事件(Drop,DragOver,DragEnter)移动到我的viewmodel中。 我在网格中使用了事件,但不管我如何设置TargetObject或其他属性,该方法都不会执行。 不过,我做了另一个项目来重现这种情况。 代码如下:

XAML

<Window x:Class="WpfApplication2.MainWindow"
                  .
                  .
                  .
        Title="MainWindow" Height="350" Width="525">
    <Grid x:Name="grid" AllowDrop="True" >
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="110,57,0,0"/>
        <i:Interaction.Triggers>
            <!--<i:EventTrigger EventName="Drop">
                <ie:CallMethodAction MethodName="OnGrid_Drop" TargetObject="{Binding}" />
            </i:EventTrigger>
            <i:EventTrigger EventName="DragOver">
                <ie:CallMethodAction MethodName="OnGrid_DragOver" TargetObject="{Binding }" />
            </i:EventTrigger>-->
            <i:EventTrigger EventName="DragEnter">
                <ie:CallMethodAction MethodName="OnGrid_DragEnter" TargetObject="{Binding ElementName=grid}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Grid>
</Window>

代码隐藏

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            AllocConsole();
        }

        private void OnGrid_Drop(object sender, DragEventArgs e)
        {
            Console.WriteLine("00000");          
        }
        private void OnGrid_DragEnter(object sender, DragEventArgs e)
        {
            Console.WriteLine("11111");      
        }
        private void OnGrid_DragOver(object sender, DragEventArgs e)
        {
            Console.WriteLine("22222");         
        }

        ...... //The code in here is to make the console pop up.
    }

我有两个问题:

(1)我在网格上拖动一些东西,该方法没有被执行。 当嘴移动到按钮上时,鼠标光标确实发生了变化,但该方法也未被执行。 这是为什么?

(2)如果将grid属性更改为<Grid x:Name="grid" AllowDrop="True" DragEnter="OnGrid_DragEnter"> (并删除Interaction.Triggers),只有当我在按钮上拖动某些东西时,事件才会触发。 我很确定我的鼠标在网格中,但只有当鼠标移动到按钮上时才会触发。 这是为什么?

代码很容易重现,希望任何人都能帮我解决这个问题。


TargetObject

它是公开该方法的对象。 这不是名为“网格”的Grid格,而是您的MainWindow 。 所以给它一个名称x:Name="MyMainWindow" ,并更改您的TargetObject属性。

<i:EventTrigger EventName="DragEnter">
    <ie:CallMethodAction MethodName="OnGrid_DragEnter" //
                         TargetObject="{Binding ElementName=MyMainWindow}" />
</i:EventTrigger>

方法可达性

OnGrid_DragEnter不会从您的MainWindow类中调用,因此它必须公开。

public partial class MainWindow : Window
{
    ....
    public void OnGrid_DragEnter(object sender, DragEventArgs e)
    {
        Console.WriteLine("11111");         
    }
    ....
}

设置网格的背景

您需要在Grid上设置Background属性以便能够跟踪鼠标事件(这就是为什么只有在鼠标悬停在Button时才触发)。 如果它需要透明,可以将其设置为Transparent (但稍后注意,因为如果网格下有元素,最终可能会想知道为什么该元素不会对鼠标点击等事件做出反应)。

假设拖动源元素实现它应该(你没有把它放在你的XAML中),你的OnGrid_DragEnter将被执行。 如果您需要实现拖放功能的详细信息,请查看Microsoft Docs。

链接地址: http://www.djcxy.com/p/39549.html

上一篇: WPF CallMethodAction doesn't work in Drop, DragOver, DragEnter event

下一篇: WPF mouse events update performance