2015-04-14 51 views
3

我想爲擴展選擇模式WPF ListBox實施拖拽&拖放。到目前爲止,一切正常:改進WPF列表框多項拖拽

  1. 我可以發起拖動操作所選擇的項目
  2. 我能處理的拖放操作目標

我基本上實現了它as written here - 簡而言之:

  1. 手柄PreviewMouseLeftButtonDown存儲當前鼠標位置
  2. 手柄MouseMove發起拖動操作,如果距離已經覆蓋

現在我的問題是:通常情況下,在資源管理器中,例如,我會選擇我想拖的項目,然後我釋放鼠標按鍵, 再按一次來初始化拖動操作&。我想這就是大多數用戶會這麼做的。當我現在在我的應用程序中執行同樣的操作時,選擇將更改爲第二次按下鼠標按鈕的項目 - 多選不見了。

昨天我搜索了很多,但是我找到的所有解決方案都是在PreviewMouseLeftButtonDown中啓動了拖動操作。但是,這不允許我檢查鼠標是否移動得足夠遠以實際啓動拖動操作。

我的問題:有沒有人有一個簡單的解決方案(不涉及任何第三方庫)如何改變上面鏈接的示例,以便多選擇保持不變?

回答

3

的問題是,的ListBoxListView選擇模式是與用於資源管理器中一個不同:

對於ListBox具有擴展選擇模式:

用戶可以取消選擇項只有MouseDown;

而對於資源管理器:只的MouseDown

用戶無法取消選擇項目時,他們只能做它,直到的MouseUp。

所以這就是爲什麼落後在資源管理器中,用戶可以選擇一個項目,鬆開鼠標,然後再按下開始拖&下跌核心原因。

爲了實現類瀏覽器選擇並拖動效果,首先需要區分是否在MouseDown時選擇某個項目,因此當項目IsSelected時,您將推遲它的選擇更改,直到MouseUp。

您可以檢查this article更多的想法,這裏是一個原型爲你下手:

private void ListBox_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (VisualTreeHelper.GetParent(e.OriginalSource as UIElement) is ListBoxItem) 
    { 
     ListBoxItem item = (ListBoxItem)VisualTreeHelper.GetParent(e.OriginalSource as UIElement); 
     if (item == null) return; 
     if (item.IsSelected) 
     { 
      e.Handled = true; 
     } 
    }  
}