2011-01-28 198 views
1

我試圖實現一個點擊和拖動選擇,如在Windows資源管理器(當你保持鼠標按下,你移動鼠標時發生的藍色選擇矩形)。鼠標輸入/鼠標離開和鼠標左鍵按下

所以基本上我有一個ListView,帶有樣式和模板ListViewItem。 我在我的ListViewItem上添加了MouseEnter和MouseLeave事件(使用EventSetter), 除了當鼠標左鍵關閉時,它工作正常。 在這種情況下,事件不會被解僱,這不利於我想實現的目標。

你知道嗎,如果有什麼好的解決方法,我想知道什麼時候我在某件物品上或者沒有按下鼠標左鍵時。

現在我已經嘗試了VisualTreeHelper.HitTest(),但我只知道當我穿過ListViewItem,並且我需要知道什麼時候離開它。

謝謝。

回答

0

即使您的MouseEnter和Leave事件被觸發,也不會提供一種很好的選擇方法,因爲這兩個事件最終都無關緊要:無論您的鼠標是否觸碰過該文件夾或文件,所有重要的事情都是如果它是在釋放按鈕的時間點在矩形中。這意味着Mouse Up & Down應該足夠了。根據您的列表,您甚至可以通過查看發生這些事件的兩個項目(例如,如果它僅僅是一維列表而不是二維網格)來推斷哪些項目應該被選擇。

如果你有一個網格,你需要更復雜的機制,比如跟蹤哪個區域被覆蓋,並檢查哪些項目位於內部或邊緣。

+0

這種方法的問題是,我的項目只有當用戶釋放鼠標按鈕時纔會被選中,在我的情況下,我想更接近Windows資源管理器的行爲,這意味着當鼠標/「藍色選擇矩形時選擇/取消選擇項目「是在一個項目。 如果我在完成作業後做了選擇,但外觀和用戶體驗不如預期好,我想盡可能保持與Windows默認行爲的一致性。 – StrAbZ 2011-01-28 17:24:43

+0

然後你可以在`ListView`上處理`MouseMove`,測試各個鼠標按鈕是否關閉,並檢查`Mouse.DirectlyOver`是否返回`ListViewItem`。如果是這樣,您可以選擇它並/或取消選擇鼠標放在最後的項目。有點複雜,但它只是一點邏輯交互。 – 2011-01-28 17:31:55

1

當按下按鈕時,您必須捕獲鼠標UIElement.CaptureMouse,然後在MouseUp事件期間釋放鼠標UIElement.ReleaseMouseCapture。您不必擔心任何其他事件,因爲捕捉過程中所有鼠標輸入都會傳送到您的UIElement。

這種選擇形式被稱爲「套索選擇」,Windows應用程序中的大多數小部件都支持它。實際上,ListView本身已經做到了。

0

所以我找到了一個不同的解決方案來處理這種行爲。

我已經開始,這個StackOverflow的答案Click and drag selection box in WPF

在鼠標移動,修改selectionBox尺寸後,我選擇了在該地區selectionBox的項目。

我做這種方式:

//Select all visible items in select region. 
Rect selectRect = new Rect(Canvas.GetLeft(selectionBox), Canvas.GetTop(selectionBox), 
       (Canvas.GetLeft(selectionBox) + selectionBox.Width), (Canvas.GetTop(selectionBox) + selectionBox.Height)); 

RectangleGeometry rr = new RectangleGeometry(selectRect); 
foreach (CustomElement elt in mainList.Items) 
{ 
    ListViewItem item = mainList.ItemContainerGenerator.ContainerFromItem(elt) as ListViewItem; 
    Rect r = LayoutInformation.GetLayoutSlot(item); 
    if (r.IntersectsWith(selectRect)) 
     item.IsSelected = true; 
    else 
     item.IsSelected = false; 
} 

我發現LayoutInformation可以給你,代表你的對象的矩形,這樣我就可以檢查它是否與selectionBox矩形相交。

相關問題