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。
上一篇: WPF CallMethodAction doesn't work in Drop, DragOver, DragEnter event