Wpf 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()是一个同步方法

我正在使用xamdatagrid开发拖放功能。我已经实现了下面提到的拖放功能

1) 我已经创建了PreviewMouseLeftButtonDown事件,在这个事件中,我调用了DragDrop.DoDragDrop()方法。 2) 我还有一个MouseMove事件,我正在从网格中获取所选行。我在上面的PreviewMouseLeftButtonDown事件中使用所选行来创建放置数据

我的问题是在同一个网格中有一个下拉列表(组合框)。由于DragDrop.DoDragDrop()是一个同步方法,并且它是从PreviewMouseLeftButtonDown调用的,因此它不会释放鼠标事件,直到drop to target和下拉选择无法正常工作

我还尝试设置布尔标志,但无法区分dragdrop和控件选择(下拉选择)与PreviewMouseLeftButtonDown方法。只有在执行拖放而不是选择网格行中的下拉列表时,我才需要调用DragDrop.DoDragDrop()。如何识别操作是拖放还是下拉选择

是否有其他方法可以在不等待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);
        }
    }