我正在为我正在编写的项目写一个小的拖放功能。我之前几次完成了这种类型的功能,并且我总是使用PreviewLeftMouseButtonDown
和PreviewMouseMove
的组合来检测拖动的开始。它以前一直很有用。WPF:按鼠标左键时PreviewMouseMove不会触发?
虽然在这个项目中,我发现PreviewMouseMove
在点击鼠标左键时不会触发,即使鼠标在屏幕上移动。我已经从来没有之前见过这,这让我很难过。
这是我使用的XAML:
<Grid Background="{StaticResource BGGradientBrush}"
Margin="1"
PreviewMouseLeftButtonDown="Grid_PreviewMouseLeftButtonDown"
PreviewMouseMove="Grid_PreviewMouseMove">
<!-- snip -->
</Grid>
这是我的代码背后:
private Point _startDragPoint;
private bool _isDragging;
private void Grid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_startDragPoint = e.GetPosition(null);
System.Diagnostics.Trace.WriteLine("Test => (PreviewMouseLeftButtonDown) left click at " + _startDragPoint);
}
private void Grid_PreviewMouseMove(object sender, MouseEventArgs e)
{
System.Diagnostics.Trace.WriteLine("Test => (PreviewMouseMove) enter, e.LeftButton: " + e.LeftButton + ", _isDragging: " + _isDragging);
if (e.LeftButton == MouseButtonState.Pressed && !_isDragging)
{
System.Diagnostics.Trace.WriteLine(
"Test => (PreviewMouseMove) well, the left mouse button is pressed");
var position = e.GetPosition(null);
if (Math.Abs(position.X - _startDragPoint.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(position.Y - _startDragPoint.Y) > SystemParameters.MinimumVerticalDragDistance)
{
StartDrag();
}
}
}
private void StartDrag()
{
System.Diagnostics.Trace.WriteLine("Test => (StartDrag) started drag!");
}
我通过DebugView中监测这些跟踪语句和时间之间Grid_PreviewMouseLeftButtonDown
是直到释放鼠标左键,Grid_PreviewMouseMove
就是从来没有开除。
我完全困惑,任何人都可以发现我做错了什么?只是为了理智检查自己,我一直指的是Jaime Rodriquez的Drag & Drop in WPF Explained End to End文章,我清楚地使用了与他相同的技术,那么可能导致这种情况的原因是什么?我真的很希望这只是我错过的一些愚蠢的东西。有任何想法吗?