2010-09-22 21 views
6

我有一個ListBox並希望擴展選擇模式。另外我想要實現拖放功能。現在的問題是,如果在選定的項目上單擊鼠標,它將立即被選爲單個選擇,而不是等待鼠標事件。從具有SelectionMode的列表框中拖放WPF = Extended

由於此行爲,開始拖動多個項目對於用戶來說幾乎是不可能的,因爲他總是單擊選擇開始拖動,選擇將更改爲鼠標下方的項目並開始使用此項目進行拖動操作。

是否有解決此問題的良好解決方法,或者甚至是否存在官方解決方案?

+0

你以後再次接受不同的答案。所以如果你更喜歡其他答案,那就接受吧。 – Rohit 2011-01-19 21:59:05

+0

我建議使用下面的鏈接。它效果很好。 http://stackoverflow.com/a/23151248 – Youngjae 2017-04-12 16:03:07

回答

8

這是我所做的。在您的DragDrop代碼中,訂閱PreviewMouseLeftButtonDown。如果選擇了您已經點擊的項目,則將e.Handled設置爲true。

在我下面的示例中,我將列表框項目的一部分標識爲拖動抓手(帶有凹凸),以便我可以區分該項目和拖動表面。我只需要獲取列表框項目數據模板和拖放行爲來同意拖動控制元素的名稱。

的的PreviewMouseLeftButtonDown從我的工作正在進行中:

private void ItemsControl_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    dragStartPoint = e.GetPosition(null); 

    ItemsControl itemsControl = this.AssociatedObject as ItemsControl; 
    if (itemsControl != null) 
    { 
     this.sourceItemContainer = itemsControl.ContainerFromElement((Visual)e.OriginalSource) as FrameworkElement; 
    } 

    // If this is an multiple or extended selection list box, and on a drag grip, then ensure the item being hit is selected 
    // This prevents the ItemsControl from using this MouseDown to change selection, except over a selected item's drag grip.    
    if ((this.IsMultipleSelectionListBox() == true) && (this.IsOriginalSourceDragGrip(e) != false) && (this.IsSourceListBoxItemSelected() == true)) 
    { 
     e.Handled = true; 
    } 
} 
+0

+1是的,最終我以類似的方式解決了這個問題。感謝你的回答。不過,我已經接受了MrDosu的回答。但我會建議你的方式給其他想解決同樣問題的人。 – HCL 2010-10-05 15:12:20

2

我能想到的最簡單的解決辦法是改變ListBoxItem中不下來,像這樣上的MouseUp選擇和更改ContainerGenerator服務於您的自定義ListBoxItems:

public class CustomListBoxItem : ListBoxItem 
{ 
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     //do nothing 
    } 

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) 
    { 
     base.OnMouseLeftButtonDown(e); 
    } 
} 

您可能需要一些鼠標離開/ LeftButtonDown邏輯如果您想要在按住鼠標按鈕的同時防止在列表中移動時選擇不同的項目。

+0

+1很好的解決方案。不過,我很擔心,因爲我不知道在調用方法中調用另一個事件是否會導致未來版本的FCL出現問題。 – HCL 2010-09-22 20:07:20

+0

當EventArgs預期會有所不同時(例如按鈕狀態),可能會有一些工作要做,但看到事件的處理程序只是被稱爲我無法想象的一個突破性更改場景。 – MrDosu 2010-09-22 21:03:51

+0

不幸的是,這太簡單了,因爲在某些情況下,鼠標會有選擇活動。正確的行爲是在鼠標向下選擇(或擴展選擇)項目時發生(如果已經選擇,則不會發生變化),而取消選擇已選項目僅在鼠標向上時發生,並且僅當沒有可感知的光標運動發生。 – CuriousKea 2013-09-19 22:33:54

0

使用PreviewMouseLeftButtonDown添加所選項目拖動操作。