2010-02-05 12 views
6

Tôi đang thử nghiệm một cửa sổ trông giống như sau:Trong Gtk, khi sử dụng Kéo và Thả trong TreeView, làm thế nào để tôi không bị rơi giữa các hàng?

alt text

Kéo một thẻ vào một liên kết Thẻ Tag với Card. Do đó, hãy kéo Thẻ vào Thẻ.

Việc bỏ thẻ giữa hai thẻ hoặc thẻ giữa hai thẻ là vô nghĩa. Tôi có thể bỏ qua những kết quả trong hàm Handle...DataReceived như thế này:

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

Tuy nhiên, khi kéo, người dùng vẫn nhìn thấy tùy chọn để chèn:

alt text

Làm thế nào để ngăn chặn điều này xảy ra?

Trả lời

3

Bạn cần phải kết nối với tín hiệu drag-motion và thay đổi hành vi mặc định để nó không bao giờ thấy một trước/sau thả:

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 
+0

Cảm ơn - Tôi đã chuyển hầu hết những điều này, nhưng tôi đang gặp khó khăn trong việc tìm kiếm Gtk # tương đương với DragContext.drag_status của pygtk. Đây là tài liệu: http://www.go-mono.org/docs/index .aspx? link = T: Gdk.DragContext/* –

+0

Liên kết đó là bro ken - the * được cho là một phần của nó. –

+1

Hãy cho tôi một thời gian để tìm thấy nó, quá: rõ ràng đó là Gdk.Drag.Status trong Gtk # (gdk_drag_status trong C). –

1

Bạn có thể xác định các mục tiêu khác nhau cho thẻ và thẻ và tiện ích con bên trái chỉ chấp nhận mục tiêu đại diện cho thẻ. Sử dụng phương pháp Gtk.Drag.DestSet. Có lẽ cái gì đó như:

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

tôi đã cố gắng để làm cho nơi phát ra sự kiện chuyển động với:

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

về mặt lý thuyết, nếu tôi hiểu nó một cách chính xác, nó sẽ làm việc. Nhưng tôi không thể làm cho nó cháy, sự kiện chuyển động :(

+0

Cảm ơn - tôi có thể không rõ ràng: Vấn đề của tôi không phải là tôi không muốn phía bên trái chấp nhận cả thẻ và thẻ (tôi đã sử dụng các mục tiêu khác nhau). Tôi chỉ muốn có thể thả trực tiếp vào thẻ, thay vì ở giữa –