【问题标题】:WPF CallMethodAction doesn't work in Drop, DragOver, DragEnter eventWPF CallMethodAction 在 Drop、DragOver、DragEnter 事件中不起作用
【发布时间】:2017-11-22 15:32:31
【问题描述】:

我将 MVVM 用于我的 wpf 项目,并希望将事件(Drop、DragOver、DragEnter)移动到我的视图模型中。我在网格中使用了事件,但是无论我如何设置 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) 如果将网格属性更改为&lt;Grid x:Name="grid" AllowDrop="True" DragEnter="OnGrid_DragEnter"&gt;(并删除Interaction.Triggers),只有当我在按钮上拖动某些东西时,才会触发该事件。我相当确定我的鼠标在网格中,但只有当鼠标悬停在按钮上时才会触发。这是为什么呢?

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

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    目标对象

    它是暴露方法的对象。那不是名为“网格”的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

    【讨论】:

    • 我已经用你的回答解决了我的问题,非常有帮助。非常感谢。
    猜你喜欢
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2010-10-08
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多