4

我目前正在编写一个工具,通过拖放将实体从一个分配DataGrid到另一个实体。 经过一番摆弄,我让一切顺利运行,但有一个小烦恼:一些实体不能分配给其他一些实体,这还没有反映在 UI 上。DataGrid

所以,我想要实现的行为如下:当用户将受让人拖到另一个实体上时,如果实体不兼容,图标应该变为“你不能把它放在这里”图标。

这是我的代码(附加到DataGridDragDropTarget.DragOver目标的事件DataGrid):

private void DragDropTarget_OnDragOver(object sender, Microsoft.Windows.DragEventArgs e)
{
    var sw = sender as DataGridDragDropTarget;

    if (sw == null)
    {
        return;
    }

    if(GetAssignmentCondition(e))
    {
        // TODO: Show link-icon
    }
    else
    {
        // TODO: Show drop-disabled-icon
    }
}

到目前为止我已经尝试过:

我已经设置e.Effects了 ,DragDropTargetAllowedSourceEffects属性和底层ItemDragEventArgs的 'sAllowedEffectsEffectsto DragDropEffects.None,但无济于事。谷歌搜索也没有产生任何有意义的结果,我没有想法。

4

2 回答 2

2

这有助于在有TextBoxFlowDocument控制的情况下,所以它应该与DataGrid.

这里的关键是将事件设置Handled为防止控件进行恶作剧。

像这样:

后面的代码(仅用于演示 - 最好使用对 MVVM 更友好的解决方案):

private void DragDropTarget_DragEnter(object sender, Microsoft.Windows.DragEventArgs e)
{
    var sw = sender as DataGridDragDropTarget;

    if (sw == null)
    {
        return;
    }

    if(GetAssignmentCondition(e))
    {
        // TODO: Show link-icon
        e.Effects = DragDropEffects.Link;
    }
    else
    {
        // TODO: Show drop-disabled-icon
        e.Effects = DragDropEffects.None;
    }

    // Add this
    e.Handled = true;
}
于 2013-05-24T23:20:10.680 回答
1

在不将属性设置为“true”的情况下更改事件处理程序中的Effects属性不起作用,因为您可以在DragDropTarget.cs源代码中看到。如果未在任何事件处理程序中处理 (),则将恢复为.DragEventArgsOnDragOverHandledOnDragOverargs.Handled=true;args.Effectsargs.AllowedEffects

    protected virtual void OnDragOver(SW.DragEventArgs args)
    {
        foreach (SW.DragEventHandler handler in _dragOver)
        {
            handler(this, args);
            if (args.Handled)
            {
                return;
            }
        }

        OnDragEvent(args);
    }

    protected virtual void OnDragEvent(SW.DragEventArgs args)
    {
        SW.DragDropEffects effects = args.AllowedEffects;

        ///removed for clarity

        if (!args.Handled && effects != args.AllowedEffects)
        {
            args.Effects = effects;  // revert back to args.AllowedEffects
            args.Handled = true;
        }
    }
于 2013-05-28T14:11:11.617 回答