此功能不是内置的,要实现此功能,您必须创建一个新控件TreeView
,然后从扩展TreeViewItem
.
实现这一目标涉及相当多的工作,所以我希望你能跟进;我不会解释所有内容,因此请提出问题或在 MSDN 上阅读您不了解的任何内容。
创建树视图
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
. 您可以在 MSDN 上找到基本模板。
为此,您需要从 MSDN 复制基本模板,将其更改TargetType
为{x:Type controls:TreeViewItemEx}
,然后将PreviewMouseDown
事件添加到ToggleButton
命名Expander
并使用项目类中的事件处理程序,例如PreviewMouseDown="OnPreviewExpansionMouseDown"
注意:这将只允许您拦截由用户单击展开按钮 [+] 触发的展开事件。您需要几个键盘快捷键来为自己实现支持。
高温下,