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

时间:2017-11-22 15:32:32

标签: c# wpf mvvm

我将MVVM用于我的wpf项目,并希望将事件(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 x:Name="grid" AllowDrop="True" DragEnter="OnGrid_DragEnter">(并删除了Interaction.Triggers),则仅当我在按钮上拖动某些内容时,才会触发该事件。我非常确定我的鼠标在网格中,但只有当鼠标悬停在按钮上时才会触发。那是为什么?

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

1 个答案:

答案 0 :(得分:0)

<强> TargetObject

暴露方法的对象是。这不是Grid命名的&#34;网格&#34;,它是您的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");         
    }
    ....
}

设置网格背景

您需要在Background上设置Grid属性才能跟踪鼠标事件(这就是仅当鼠标位于Button时才会触发的原因)。如果需要透明,可以将其设置为Transparent(但请稍后注意,因为如果网格下方有元素,您可能会想知道为什么该元素不会对此类事件做出反应鼠标点击)。

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