После DragDrop.DoDragDrop другие элементы управления в сетках не могут выбирать (не отвечает)
Я работаю над функцией перетаскивания с помощью 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;
}
}
}
1 ответ
Не видя никакого кода, довольно сложно точно понять, в чем проблема, но попробуйте вызвать 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
операция и обрабатывает ее.