我正在使用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;
}
}
}
答案 0 :(得分:0)
如果没有看到任何代码,很难确切地知道问题是什么,但请尝试调用DragDrop.DoDragDrop
处理程序中的MouseMove
以查看它是否可以解决您的问题。像这样:
修改强>
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);
}
}
我修改了你的KeyboardMouseMove
处理程序以显示我的意思。现在,这包含您可以删除的PreviewMouseLeftButtonDown处理程序中的代码。我假设您在目标Drop
上有一个Element
处理程序,它从DragDrop
操作中获取数据对象并对其进行处理。