Wpf DragDrop.DoDragDrop后,网格中的其他控件无法选择(无响应)
我正在使用xamdatagrid开发拖放功能。我已经实现了下面提到的拖放功能 1) 我已经创建了PreviewMouseLeftButtonDown事件,在这个事件中,我调用了DragDrop.DoDragDrop()方法。 2) 我还有一个MouseMove事件,我正在从网格中获取所选行。我在上面的PreviewMouseLeftButtonDown事件中使用所选行来创建放置数据 我的问题是在同一个网格中有一个下拉列表(组合框)。由于DragDrop.DoDragDrop()是一个同步方法,并且它是从PreviewMouseLeftButtonDown调用的,因此它不会释放鼠标事件,直到drop to target和下拉选择无法正常工作 我还尝试设置布尔标志,但无法区分dragdrop和控件选择(下拉选择)与PreviewMouseLeftButtonDown方法。只有在执行拖放而不是选择网格行中的下拉列表时,我才需要调用DragDrop.DoDragDrop()。如何识别操作是拖放还是下拉选择 是否有其他方法可以在不等待DragDrop.DoDragDrop()结果的情况下启用鼠标事件 //此选项用于获取所选行Wpf DragDrop.DoDragDrop后,网格中的其他控件无法选择(无响应),wpf,c#-4.0,wpfdatagrid,Wpf,C# 4.0,Wpfdatagrid,我正在使用xamdatagrid开发拖放功能。我已经实现了下面提到的拖放功能 1) 我已经创建了PreviewMouseLeftButtonDown事件,在这个事件中,我调用了DragDrop.DoDragDrop()方法。 2) 我还有一个MouseMove事件,我正在从网格中获取所选行。我在上面的PreviewMouseLeftButtonDown事件中使用所选行来创建放置数据 我的问题是在同一个网格中有一个下拉列表(组合框)。由于DragDrop.DoDragDrop()是一个同步方法
private void KeywordMouseMove(object sender, MouseEventArgs e)
{
var grid = (sender as DataRecordCellArea).FieldLayout.DataPresenter as XamDataGrid;
if (grid != null)
{
//we have editable and not ediable columns.previously we faced issue with noe editable column drag so this added
//Cell area will get for editable and presenter will get for non editable fields.This will get the selected row
var drcellarea = e.Source as DataRecordCellArea;
var drpresenter = e.Source as CellValuePresenter;
DataRecord dataRecord = null;
if (drcellarea != null)
{
dataRecord = drcellarea.DataContext as DataRecord;
}
else if (drpresenter != null)
{
dataRecord = drpresenter.DataContext as DataRecord;
}
if (dataRecord != null)
{
var selectedItem = dataRecord.DataItem as VariableViewModel;
viewmodel.SelectedItem = selectedItem;
}
}
}
在没有看到任何代码的情况下,很难确切地知道问题是什么,但请尝试调用
MouseMove
处理程序中的DragDrop.DoDragDrop
,查看它是否解决了您的问题。大概是这样的:
编辑:
private void KeywordMouseMove(object sender, MouseEventArgs e)
{
var grid = (sender as DataRecordCellArea).FieldLayout.DataPresenter as XamDataGrid;
if (grid != null && e.LeftButton == MouseButtonState.Pressed)
{
itemName = variableViewModel.OriginalPrimaryKey, variableViewModel.Value, variableViewModel.Variable.GuiDisplayUnits;
var data = new DataObject();
data.SetData(DataFormats.StringFormat, itemName);
DragDrop.DoDragDrop(grid, data, DragDropEffects.Copy);
}
}
我已经修改了你的
键盘mousemove
处理程序来说明我的意思。这现在包含PreviewMouseLeftButtonDown处理程序中的代码,您现在可以删除这些代码。我假设您在目标元素上有一个Drop
处理程序,该处理程序从DragDrop
操作中获取数据对象并对其进行处理。我有两种情况。当拖放一个cpolumn时,这是可以的,它应该会退出下面的代码。但是如果我在网格中有dropown,那么相同的代码将被执行和删除由于我们使用的是异步DragDrop.DoDragdrop(),因此它不会在下拉列表中提供所选项目。我应该仅在拖动时调用DoDragdrop。下拉列表选择不应调用。您能够发布相关代码吗?(好的,在我打字时弹出)我有两个场景。拖放网格列/行时,可以调用DoDragdrop,但从网格列中选择下拉列表时不应调用DoDragdrop。如果它调用DoDragdrop,则下拉选择将不起作用,因为DragDrop.DoDragdrop()是一个同步调用,在拖放对象之前,它不会保留鼠标事件。如果在MouseMove处理程序中启动拖放并检查是否按下左键,则在从网格列选择下拉时不会触发,但仍然适用于拖动网格/列。所以你是说我需要调用你评论中提到的dodragdropas,对吗?
private void KeywordMouseMove(object sender, MouseEventArgs e)
{
var grid = (sender as DataRecordCellArea).FieldLayout.DataPresenter as XamDataGrid;
if (grid != null && e.LeftButton == MouseButtonState.Pressed)
{
itemName = variableViewModel.OriginalPrimaryKey, variableViewModel.Value, variableViewModel.Variable.GuiDisplayUnits;
var data = new DataObject();
data.SetData(DataFormats.StringFormat, itemName);
DragDrop.DoDragDrop(grid, data, DragDropEffects.Copy);
}
}