我将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),则仅当我在按钮上拖动某些内容时,才会触发该事件。我非常确定我的鼠标在网格中,但只有当鼠标悬停在按钮上时才会触发。那是为什么?
代码很容易重现,希望有人帮我解决这个问题。
答案 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。