【问题标题】:In Gtk, when using Drag and Drop in a TreeView, how do I keep from dropping between rows?在 Gtk 中,当在 TreeView 中使用拖放时,如何避免在行之间拖放?
【发布时间】:2010-02-05 19:07:21
【问题描述】:

我正在测试一个看起来像这样的窗口:

将标签拖动到卡片将标签链接到卡片。将卡片拖到标签也是如此。

在两张卡片之间放置一个标签,或者在两个标签之间放置一张卡片是没有意义的。我可以像这样在Handle...DataReceived 函数中忽略这些结果:

if (dropPos != TreeViewDropPosition.IntoOrAfter &&
    dropPos != TreeViewDropPosition.IntoOrBefore)
    return;

但是,在拖动时,用户仍然会看到插入选项:

如何防止这种情况发生?

【问题讨论】:

    标签: c# drag-and-drop gtk gtk# gtktreeview


    【解决方案1】:

    您需要连接到drag-motion 信号并更改默认行为,使其永远不会指示之前/之后的丢弃:

    def _drag_motion(self, widget, context, x, y, etime):
        drag_info = widget.get_dest_row_at_pos(x, y)
        if not drag_info:
            return False
        path, pos = drag_info
        if pos == gtk.TREE_VIEW_DROP_BEFORE:
            widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_BEFORE)
        elif pos == gtk.TREE_VIEW_DROP_AFTER:
            widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_AFTER)
        context.drag_status(context.suggested_action, etime)
        return True
    

    【讨论】:

    • 谢谢——我已经移植了大部分内容,但是我很难找到与 pygtk 的 DragContext.drag_status 等效的 Gtk#。这是文档:go-mono.org/docs/index.aspx?link=T:Gdk.DragContext*
    • 那个链接坏了——*应该是它的一部分。
    • 我也花了一段时间才找到它:显然它是 Gtk# 中的 Gdk.Drag.Status(C 中的 gdk_drag_status)。
    【解决方案2】:

    您可以为标签和卡片定义不同的目标,左侧小部件仅接受代表标签的目标。使用Gtk.Drag.DestSet 方法。可能是这样的:

            Gtk.Drag.DestSet (widget, DestDefaults.All,
                          new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
                          DragAction.Default);
    

    我试图让目的地发出 Motion 事件:

            Gtk.Drag.DestSet (widget, DestDefaults.Motion,
                          new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
                          DragAction.Default);
    

    理论上,如果我理解正确,它应该可以工作。但我不能让它触发运动事件:(

    【讨论】:

    • 谢谢——我可能不太清楚:我的问题不是我不希望左侧同时接受卡片和标签(我已经使用了不同的目标)。这是我只想能够直接放在标签上,而不是在它们之间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多