如果我使用两个事件处理程序,PreviewMouseLeftButtonDown和PreviewMouseMove。我遇到的问题是触发PreviewMouseLEftButtonDown时一切正常,但由于它是一个拖放操作,左按钮保持不动。因此,当他们按住左键时,PreviewMouseMove EventHandler应该处理它,但是在它们释放鼠标左键之后才会被调用
这是首先被称为
的内容 private void FieldItemGrid_PreviewMouseLeftButtonDown(object sender, MouseEventArgs e)
{
down = e.GetPosition(this);
Grid fieldItemGrid = (Grid)sender;
fieldItemGrid.Background = Brushes.White;
_isDown = true;
_startPoint = e.GetPosition(this);
_originalElement = fieldItemGrid;
this.CaptureMouse();
e.Handled = true;
_selectedElement = fieldItemGrid;
DragStarted(e.GetPosition(this));
}
这里的一切工作正常,但问题是,如果他们在按住时移动鼠标,则不会执行以下的PreviewMouseMove处理程序
private void FieldItemGrid_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (_isDown)
{
if (_selectedElement != null)
{
DragDrop.DoDragDrop(_selectedElement, _selectedElement, DragDropEffects.Move);
}
if (_isDragging)
{
DragMoved(e.GetPosition(this));
}
}
}
有解决方法吗?因此,在释放鼠标左键之前,我没有被阻止其他事件处理程序?
答案 0 :(得分:2)
除非this
是Grid
,否则this.CaptureMouse()
会阻止包括Grid
在内的任何其他元素接收鼠标事件。对于拖放,您可能根本不需要捕获鼠标,但是如果捕获鼠标,则需要使用fieldItemGrid.CaptureMouse()
以便在捕获之前调用鼠标移动处理程序释放。
答案 1 :(得分:0)
看起来这个问题已经回答了一段时间,所以我不太精心解决,但为了遇到同样的问题,你也可以使用DragDrop.DoDragDrop实现拖放。单击鼠标按钮时源代码隐藏中的()方法。在目标上,您设置" AllowDrop"在XAML中为true并处理" Drop"方法。您的实现会有所不同,但看起来会像:
private void MyUIElement_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
//find the clicked row
var tempObject = e.Source as [whatever];
if (tempObject == null) return;
DragDrop.DoDragDrop(tempObject, tempObject.PropertyToBePassed, DragDropEffects.Copy);
}
然后在" Drop"你会在目标中使用事件处理程序(为了示例而传递一个字符串属性):
private void MyTarget_Drop(object sender, DragEventArgs e)
{
string myNewItem = (string)e.Data.GetData(DataFormats.StringFormat);
Debug.WriteLine("I just received: " + myNewItem);
}
你仍然没有抓住鼠标事件,但在很多情况下,它是一种快速简便的方法来完成同样的事情。