我正在使用 xamdatagrid 开发拖放功能。我已经实现了如下所述的拖放功能。
1) 我创建了一个 PreviewMouseLeftButtonDown 事件,在这个事件中我调用了 DragDrop.DoDragDrop() 方法。2) 我还有一个 MouseMove 事件,我正在从网格中获取选定的行。我在上面的 PreviewMouseLeftButtonDown 事件中使用这个选定的行来创建放置数据。
我的问题是我在同一个网格中有一个下拉列表(组合框)。由于 DragDrop.DoDragDrop() 是一个同步方法并且它是从 PreviewMouseLeftButtonDown 调用的,所以它不会释放鼠标事件,直到拖放到目标并且下拉选择将无法正常工作。
我也尝试设置布尔标志,但我无法将拖放和控件选择(下拉选择)与 PreviewMouseLeftButtonDown 方法区分开来。只有当我执行拖放而不是选择网格行中的下拉菜单时,我才需要调用 DragDrop.DoDragDrop()。如何识别操作是拖放还是下拉选择?
是否有任何其他替代方法可以在不等待 DragDrop.DoDragDrop() 结果的情况下启用鼠标事件。
private void PreviewMouseLeftButtonDown (object sender, MouseButtonEventArgs e)
{
//record presenter I am setting PreviewMouseLeftButtonDown so I am doing the this
var grid = (sender as DataRecordCellArea).FieldLayout.DataPresenter as XamDataGrid;
if (grid != null)
{
itemName = variableViewModel.OriginalPrimaryKey, variableViewModel.Value, variableViewModel.Variable.GuiDisplayUnits;
var data = new DataObject();
data.SetData(DataFormats.StringFormat, itemName);
DragDrop.DoDragDrop(grid, data, DragDropEffects.Copy);
}
}
//这用于获取选定的行
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;
}
}
}