【问题标题】:DataGridDragDropTarget: Change Icon depending on the drop targetDataGrid 拖放目标:根据拖放目标更改图标
【发布时间】:2013-05-17 16:09:25
【问题描述】:

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

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

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

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、DragDropTarget 的AllowedSourceEffects 属性和底层ItemDragEventArgs 的AllowedEffects 和Effects 设置为DragDropEffects.None,但无济于事。谷歌搜索也没有产生任何有意义的结果,我没有想法。

【问题讨论】:

    标签: c# drag-and-drop silverlight-5.0 silverlight-toolkit


    【解决方案1】:

    这有助于使用 TextBox 和 FlowDocument 控件的情况,因此它应该适用于 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;
    }
    

    【讨论】:

    • 不幸的是,silverlight 中不存在Preview* 事件。不过,我会尝试将 e.Handled 设置为 true,看看是否有帮助。
    • 设置为Handled 有效吗? MS 对 XAML 的拖放操作确实很糟糕,而且我已经以多种方式遇到了这个问题,通常会带来很多痛苦 - 所以我试图减少其他人的痛苦。 (很抱歉错过了非常明显的Silverlight 标签)。
    • 哦,也许你应该编辑你的答案,让代码真正适用于 SL,适用于遇到同样问题的其他人。
    • 甜蜜!很高兴它奏效了!下班后我会对其进行修复。
    【解决方案2】:

    在OnDragOver 事件处理程序中更改DragEventArgs 的Effects 属性而不将Handled 属性设置为'true' 不起作用,因为您可以在DragDropTarget.cs 源代码中看到。如果OnDragOver 未在任何事件处理程序中处理 (args.Handled=true;),args.Effects 将恢复为 args.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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 2012-04-24
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      相关资源
      最近更新 更多