从父控件拖动到子控件时,我收到DragLeave事件。我只希望在移出控件的边界时得到此事件。我该如何实施?
请参考这个简单的示例应用程序。
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<TextBox Height="50" >Hilight and Drag this text</TextBox>
<Border BorderBrush="Blue" BorderThickness="2">
<StackPanel AllowDrop="True" Name="Stack" >
<Label >If I drag text across the gray line, Stack.DragLeave will fire.</Label>
<Separator></Separator>
<Label>I only expect to get this event when leaving the blue rectangle. </Label>
</StackPanel>
</Border>
<TextBlock >Stack.DragLeave Count: <Label x:Name="countLabel" /></TextBlock>
</StackPanel>
</Window>
并在后面的代码中
Class MainWindow
Private Sub Stack_DragLeave(ByVal sender As Object, ByVal e As System.Windows.DragEventArgs) Handles Stack.PreviewDragLeave
countLabel.Content = countLabel.Content + 1
End Sub
End Class
最佳答案
我最近一直在开发自己的应用程序,该应用程序广泛使用WPF拖放,并且花了半天时间(调试,谷歌搜索,重新阅读文档)解决了您所看到的完全相同的问题,我只能得出结论:“未来增强”埋在WPF库中。
拖放系统中似乎有一个怪癖。当用户将对象拖到我们的控件上时,系统似乎经常向我们发送DragLeave
事件,紧接着是DragEnter
事件。因此,当我们得到DragLeave
时,我们无法确定拖放操作实际上已终止。因此,我们安排立即在以后执行清理,而不是立即执行清理,如果在这段时间内我们收到另一个DragEnter
或DragOver
事件,则我们不进行清理。
这是我的解决方案:
protected virtual void OnTargetDragLeave(object sender, DragEventArgs e)
{
_dragInProgress = false;
_target.Dispatcher.BeginInvoke( new Action( ()=>
{
if( _dragInProgress == false ) OnRealTargetDragLeave( sender, e );
} ) );
}
protected virtual void OnTargetDragOver(object sender, DragEventArgs e)
{
_dragInProgress = true;
OnQueryDragDataValid( sender, e );
}
关于.net - WPF拖放-DragLeave何时触发?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5447301/