WPF中treeview模版问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中treeview模版问题相关的知识,希望对你有一定的参考价值。

现在有一个需求:
需要在树中的每一项前面加一个checkbox,可以勾选
父亲节点勾选了以后所有的子节点都选中,撤销同理
子节点全部选中以后父节点选中,所有子节点都不选中同理。
有没有谁能给我个代码或者思路,感谢!

参考技术A 1、做一个UserControl控件,其中包含了CheckBox及响应Checked、UnChecked事件的节点遍历代码;
2、将这个控件作为TreeViewItem的Header的模板。
参考技术B 直接写有点麻烦,你先看下面的链接是否有帮助?
http://blog.csdn.net/szstephenzhou/article/details/8739510
http://social.msdn.microsoft.com/Forums/vstudio/en-US/9fd804d5-050c-4b94-b877-a23d81782fce/automatically-check-treeview-child-nodes-when-parent-is-checked本回答被提问者和网友采纳
参考技术C 重写模板,trigger 时间里面做

WPF 从 TreeView 中删除 ScrollViewer

【中文标题】WPF 从 TreeView 中删除 ScrollViewer【英文标题】:WPF Remove ScrollViewer from TreeView 【发布时间】:2011-03-30 17:55:06 【问题描述】:

我想知道是否可以轻松关闭 TreeView 的 ScrollViewer。

我有一个带有网格的用户控件。其中一个 Cell 在 Stackpanel 中有几个 TreeView。控件的高度会根据 TreeView 的高度自动调整,因此不需要滚动条。

问题是:我在带有自己的 ScrollViewer 的 ListBox 中有一堆这些,但是当我使用 MouseWheel 时,当您在 TreeView 上方时滚动停止。

这是因为 TreeView 有自己的 ScrollViewer,它窃取了 MouseWheel。我知道这可能通过覆盖控件模板来实现,但我希望有更简单的方法。

【问题讨论】:

【参考方案1】:

您可以使用此处描述的技术:http://serialseb.blogspot.com/2007/09/wpf-tips-6-preventing-scrollviewer-from.html 来防止 ScrollViewer 处理鼠标滚轮事件。将PreviewMouseWheel="HandlePreviewMouseWheel" 添加到您的 TreeView 并将 HandlePreviewMouseWheel 定义为:

private void HandlePreviewMouseWheel(object sender, MouseWheelEventArgs e)

    if (!e.Handled)
    
        e.Handled = true;
        var eventArg = new MouseWheelEventArgs(
            e.MouseDevice, e.Timestamp, e.Delta);
        eventArg.RoutedEvent = UIElement.MouseWheelEvent;
        eventArg.Source = sender;
        var parent = ((Control)sender).Parent as UIElement;
        parent.RaiseEvent(eventArg);
    

不过,将控件模板更改为不包含 ScrollViewer 并不难,因为 TreeView 的默认模板非常简单,而且大部分复杂性在于处理 ScrollViewer。尝试这样做:

<TreeView.Template>
    <ControlTemplate TargetType="TreeView">
        <Border BorderBrush="TemplateBinding BorderBrush"
                BorderThickness="TemplateBinding BorderThickness"
                SnapsToDevicePixels="true">
            <ItemsPresenter/>
        </Border>
    </ControlTemplate>
</TreeView.Template>

【讨论】:

嗯,看来我的最后一条评论不起作用。无论如何,谢谢!我都试过了。 xaml 控件模板运行良好,但 PreviewMouseWheel 在滚动时仍然“卡住”了几次。我将使用 xaml 解决方案。 +1 用于 XAML 解决方案(同样适用于同样的问题) 完美。我将这个处理程序与EventManager.RegisterClassHandler 一起使用,以摆脱订阅所有相同类型的控件来解决问题的需要。

以上是关于WPF中treeview模版问题的主要内容,如果未能解决你的问题,请参考以下文章

WPF 从 TreeView 中删除 ScrollViewer

wpf中怎么为treeview动态添加子菜单

WPF treeview扩展

WPF中TreeView控件的使用案例

treeview的问题

wpf treeview节点前面添加图标