0

我正在使用 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;
                }
            }

  }
4

1 回答 1

0

在没有看到任何代码的情况下很难确切地知道问题出在哪里,但是请尝试DragDrop.DoDragDropMouseMove处理程序中调用它以查看它是否可以解决您的问题。像这样的东西:

编辑:

    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操作中取出并处理它。

于 2013-06-18T15:35:43.383 回答