2011-03-04 57 views
5

我有一個WPF TreeView與HierarchicalDataTemplate。WPF展開TreeView單擊鼠標

目前我必須雙擊一個項目來展開/摺疊它。

我想將此行爲更改爲單擊,而不會失去其他功能。所以它應該在點擊時展開和摺疊。

這樣做的建議方法是什麼?

謝謝!

回答

2

您可以使用重新模板化複選框作爲您的節點(包含您當前使用的任何模板),並將其IsChecked屬性綁定到TreeViewItem的IsExpanded屬性。

這是我剛剛測試,似乎做的工作模板:

<HierarchicalDataTemplate ItemsSource="{Binding Items}"> 
    <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}, Path=IsExpanded}"> 
     <CheckBox.Template> 
      <ControlTemplate> 
       <TextBlock Text="{Binding Header}"></TextBlock> 
      </ControlTemplate> 
     </CheckBox.Template> 
    </CheckBox> 
</HierarchicalDataTemplate> 

只需更換與任何你需要的控件模板內容。

0

我很少有WPF工作經驗,所以我在這裏不是100%的確定。但是,您可能會檢出Treeview和TreeView Item的.HitTest方法(WPF Treeview基本上是Windows.Controls.Treeview,是嗎?或者派生它?)。

對於標準的Windows.Forms.Treeview(我使用的是VS 2008),直到鍵入大部分方法名稱後,Test方法並不總是自動出現在Intellisense菜單中。但它應該在那裏。你可能需要嘗試一下。

您可以使用.HitTest方法來處理MouseDown事件並返回對所選樹視圖項的引用。但是,如果用戶在不包含樹項目的控件區域中單擊,則必須測試空返回值。一旦你有一個特定項目的引用,你應該能夠將它的.expanded屬性設置爲與當前任何內容相反的屬性。再次,這裏可能需要一些實驗。

正如我所說,我還沒有實際使用WPF,所以我可能會有這個錯誤。 。 。

3

如果您使用的是標準TreeViewItem,那麼你就可以捕獲點擊事件:

private void OnTreeViewMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    var tv = sender as TreeView; 
    var item = tv.SelectedItem as TreeViewItem; 

    if(item != null) 
     item.IsExpanded = !item.IsExpanded; 

    e.Handled = true; 
} 

private void OnTreeViewPreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 
} 

最有可能在你的情況,你需要與你的綁定和視圖模型的東西。這是來自CodePlex的一篇很好的文章:Simplifying the WPF TreeView by Using the ViewModel Pattern

0

Metro Smurf的答案(感謝我得到了我想要的地方)提出了正確的方法。您可以簡單地連接到Treeview的SelectedItemChanged事件。然後將在事件處理程序中傳遞的e.NewValue轉換爲TreeViewItem,並訪問其IsExpanded屬性以將其設置爲true。

void MyFavoritesTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    ((TreeViewItem)e.NewValue).IsExpanded = true; 
} 

然後進行最後的觸摸,還可以通過鑄造他們爲樹型視圖鉤住你的樹形目錄中的項目的建議,然後你就可以連接到各種操縱事件,如:

var item = tv.SelectedItem as TreeViewItem; 
item.Expanded += item_Expanded; 

然後做任何你需要在事件處理程序做

void item_Expanded(object sender, RoutedEventArgs e) 
{ 
// handle your stuff 
} 
0

就在下列情況下使用選定的項目更改事件和使用,

private void treeview_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     TreeViewItem item = (TreeViewItem)treeview.SelectedItem; 
     item.IsExpanded = true; 


    } 

其中treeview是你的TreeView的名稱,你可以包含一個if來根據它的當前狀態關閉/打開。