2010-01-11 42 views
1

爲了一個非常具體的原因,我想在鼠標按鈕上選擇ListViewItem s,而不是實際上按下鼠標按鈕。我希望將此行爲嵌入到控件中。是否有可能實現這一目標?任何人都可以提示嗎?WPF Listview modification

回答

2

阿維亞德P.的回答是一個很好的,並巧妙地利用附加屬性,但我傾向於使用不同的技術大部分的時間:

  1. 子類的ListViewItem。
  2. 重寫OnMouseLeftButtonDown和OnMouseRightButton不執行任何操作。
  3. 重寫OnMouseLeftButtonUp/OnMouseRightButtonUp來調用base.OnMouseLeftButtonDown/base.OnMouseRightButtonDown。
  4. 子類ListView。
  5. 覆蓋GetContainerForItemOverride()返回你的ListViewItem的覆蓋

這似乎不是訂閱ItemContainer事件和動態增加處理程序更容易給我。

這是什麼樣子:

public class MouseUpListViewItem : ListViewItem 
{ 
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {} 
    protected override void OnMouseRightButtonDown(MouseButtonEventArgs e) {} 

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) 
    { 
    base.OnMouseLeftButtonDown(e); 
    } 
    protected override void OnMouseRightButtonUp(MouseButtonEventArgs e) 
    { 
    base.OnMouseRightButtonDown(e); 
    } 
} 
public class MouseUpListView : ListView 
{ 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
    return new MouseUpListViewItem(); 
    } 
} 

我喜歡這個技術,因爲這牽涉更少的代碼。

+0

好的答案,我設法實現了我的附屬屬性解決方案,但結果只是一點點太複雜和棘手比我希望的! :) – 2010-01-12 05:11:42

3

是的,這是絕對有可能使用附加屬性。定義一個名爲SelectOnMouseUp的附加屬性,並將其設置爲true時,掛鉤到ItemsContainerGenerator事件以發現添加新項目容器的時間。然後,當您收到新物品容器的事件時,掛鉤其PreviewMouseDown並忽略它(將e.Handled設置爲true),並掛鉤到其MouseUp事件並執行選擇(設置IsSelectedtrue)。

+0

感謝您的回覆,是否有可能在XAML中使用它? – 2010-01-11 19:32:51

+0

您無法在純XAML中「掩蓋」正常的「MouseDown」行爲。 – 2010-01-11 19:37:25

+0

+1爲聰明的使用附加屬性和'ItemContainerGenerator',但也看到我的答案,更簡單地使用'GetContainerForItemOverride'解決問題 – 2010-01-11 23:46:46