此功能不是内置的,为实现此目的,您必须创建一个从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