WPF 从 TreeView 中删除 ScrollViewer

Posted

技术标签:

【中文标题】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 中删除 ScrollViewer的主要内容,如果未能解决你的问题,请参考以下文章

WPF TreeView保持屏幕上可见的元素列表

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

WPF TreeView - 如何在添加/删除节点后刷新树?

WPF的TreeView通过数据库动态添加修改删除节点功能

treeview的问题

wpf treeview 怎么获取节点的值