在DragDrop.DoDragDrop之后,网格中的其他控件无法选择(不响应)

时间:2013-06-18 15:21:51

标签: wpf c#-4.0 wpfdatagrid

我正在使用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 个答案:

答案 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操作中获取数据对象并对其进行处理。