此功能不是內置的,爲實現此目的,您必須創建一個從TreeView
派生的新控件,然後再擴展TreeViewItem
。
實現這一點有一定的參與度,所以我希望你能跟上;我不會解釋所有的東西,所以提出問題或者在MSDN上閱讀任何你不懂的東西。
創建的TreeView
public class TreeViewEx : TreeView
{
protected override bool IsItemItsOwnContainerOverride(object item)
{
return (item is TreeViewItemEx);
}
protected override DependencyObject GetContainerForItemOverride()
{
return new TreeViewItemEx(this);
}
internal bool PreviewExpandTreeViewItem(TreeViewItemEx item)
{
// return true to allow expansion, false to cancel
return true;
}
}
public class TreeViewItemEx : TreeViewItem
{
private readonly TreeViewEx Owner;
static TreeViewItemEx()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(TreeViewItemEx),
new FrameworkPropertyMetadata(typeof(TreeViewItemEx)));
}
public TreeViewItemEx(TreeViewEx owner)
{
Owner = owner;
}
private void OnPreviewExpansionMouseDown(object sender, MouseButtonEventArgs e)
{
// we do not care if it already expanded
if (IsExpanded)
return;
e.Cancel = !Owner.PreviewExpandTreeViewItem(this);
}
}
現在,你要創建的默認樣式爲您的新TreeViewItemEx
。你可以找到base template on MSDN。
要做到這一點,你需要複製從MSDN的基本模板,改變TargetType
是{x:Type controls:TreeViewItemEx}
然後PreviewMouseDown
事件添加到ToggleButton
命名爲Expander
,並在項目類如使用事件處理程序PreviewMouseDown="OnPreviewExpansionMouseDown"
注意:這將只允許您攔截用戶點擊擴展按鈕[+]觸發的擴展事件。有幾個鍵盤快捷鍵需要你自己實現支持。
HTH,
您是否想知道如何做到這一點*,或者如何在沒有代碼隱藏的純MVVM中做到這一點? (做後者,如果你認爲它是值得的麻煩,將需要已經有辦法做前者。) – 2012-04-15 21:46:59