无法在 ScrollViewer 中滚动 TreeView

Can't scroll TreeView inside a ScrollViewer

我在 ScrollViewer 中有一个 TreeView。 当我在 treeview 上转动鼠标滚轮 时,treeview 没有滑动,而是停留在同一点。但是当我移动滚动条时,我可以滑动树视图。

我很确定 treeview 有一个 scrollviewer,但我的意思是使用另一个 scrollviewer,我有一个 scrollviwer 模板,我在我的整个应用程序中都使用了这个模板。这就是为什么我想再次使用这个模板。

代码如下:

<ScrollViewer Template="{DynamicResource AppleStyleScrollBarStyle}">
    <TreeView>
        <TreeViewItem Header="TreeViewItem"/>
        <TreeViewItem Header="TreeViewItem"/>
        <TreeViewItem Header="TreeViewItem"/>
        <TreeViewItem Header="TreeViewItem"/>
      </TreeView>
</ScrollViewer>

TreeView 默认模板已包含 ScrollViewer。当你用另一个 ScrollViewer 包装它时, TreeView 里面的那个什么都不做,但仍然处理一些鼠标事件,比如鼠标滚轮。相反,您可以在 TreeView.Resources

中为 ScrollViewer 创建隐式 Style
<TreeView>
    <TreeView.Resources>
        <Style TargetType="{x:Type ScrollViewer}">
            <Setter Property="Template" Value="{DynamicResource AppleStyleScrollBarStyle}"/>
        </Style>
    </TreeView.Resources>
    <TreeViewItem Header="TreeViewItem"/>
    <TreeViewItem Header="TreeViewItem"/>
    <TreeViewItem Header="TreeViewItem"/>
    <TreeViewItem Header="TreeViewItem"/>
</TreeView>

这个答案帮助了我: WPF Remove ScrollViewer from TreeView

https://serialseb.com/blog/2007/09/03/wpf-tips-6-preventing-scrollviewer-from/

只需订阅您的 treeView 的 PreviewMouseWheel 事件:

    // https://serialseb.com/blog/2007/09/03/wpf-tips-6-preventing-scrollviewer-from/
    private void treeView_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        if (sender is TreeView && !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);
        }
    }