我有一個WPF TreeView與HierarchicalDataTemplate。WPF展開TreeView單擊鼠標
目前我必須雙擊一個項目來展開/摺疊它。
我想將此行爲更改爲單擊,而不會失去其他功能。所以它應該在點擊時展開和摺疊。
這樣做的建議方法是什麼?
謝謝!
我有一個WPF TreeView與HierarchicalDataTemplate。WPF展開TreeView單擊鼠標
目前我必須雙擊一個項目來展開/摺疊它。
我想將此行爲更改爲單擊,而不會失去其他功能。所以它應該在點擊時展開和摺疊。
這樣做的建議方法是什麼?
謝謝!
您可以使用重新模板化複選框作爲您的節點(包含您當前使用的任何模板),並將其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>
只需更換與任何你需要的控件模板內容。
我很少有WPF工作經驗,所以我在這裏不是100%的確定。但是,您可能會檢出Treeview和TreeView Item的.HitTest方法(WPF Treeview基本上是Windows.Controls.Treeview,是嗎?或者派生它?)。
對於標準的Windows.Forms.Treeview(我使用的是VS 2008),直到鍵入大部分方法名稱後,Test方法並不總是自動出現在Intellisense菜單中。但它應該在那裏。你可能需要嘗試一下。
您可以使用.HitTest方法來處理MouseDown事件並返回對所選樹視圖項的引用。但是,如果用戶在不包含樹項目的控件區域中單擊,則必須測試空返回值。一旦你有一個特定項目的引用,你應該能夠將它的.expanded屬性設置爲與當前任何內容相反的屬性。再次,這裏可能需要一些實驗。
正如我所說,我還沒有實際使用WPF,所以我可能會有這個錯誤。 。 。
如果您使用的是標準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。
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
}
就在下列情況下使用選定的項目更改事件和使用,
private void treeview_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
TreeViewItem item = (TreeViewItem)treeview.SelectedItem;
item.IsExpanded = true;
}
其中treeview是你的TreeView的名稱,你可以包含一個if來根據它的當前狀態關閉/打開。