ScrollView 中的 WPF TreeView:如何使用鼠标在 TreeView 上滚动

WPF TreeView in ScrollView: How to enable scrolling with mouse over TreeView

我在网格中有两个树视图。此网格位于 ScrollView 中。 (这样做的原因是让 ob 视图的两个树节点始终处于相同的相对深度)。

我现在的问题是,当我的鼠标悬停在树上然后使用鼠标滚轮时,滚动视图不滚动。当我将鼠标悬停在另一个内部视图 (ConnectionView) 上时,它工作正常。

我的看法:

  <!-- Window -->
  <ScrollViewer VerticalScrollBarVisibility="Visible">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <TreeView Grid.Column="0" ItemsSource="{Binding Path=TreeNodesLeft}" >                  
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}" >
                        <local:TreeNodeView />
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
                <!--styles -->
            </TreeView>

            <Grid Grid.Column="1" >
                <local:ConnectionView DataContext="{Binding Path=Connections}" />
            </Grid>

            <TreeView Grid.Column="2" ItemsSource="{Binding Path=TreeNodesRight}">                    
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}" >
                        <local:TreeNodeView />
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>      
                <!--styles -->                  
            </TreeView>
        </Grid>
    </ScrollViewer>
    <!-- Window -->

您可以选择以下两个选项之一:

  1. 不要使用自定义 scrollViewer,而是通过 ScrollChanged 事件和 ScrollToVerticalOffset 方法在 TreeView 之间同步滚动位置,就像这个问题中的那样:Synchronized scrolling of two ScrollViewers whenever any one is scrolled in wpf 您可以通过 GetChildOfType 从 TreeView 获取 ScrollViewer:How to get children of a WPF container by type?

  2. 通过 ScrollViewer.VerticalScrollBarVisibility="Disabled"TreeViews 禁用 ScrollViewers 并添加 WheelScrolling 就像这里: ScrollViewer mouse wheel not working 。可能 TreeView ScrollViewers 仍在处理您的滚动事件。

如果我理解正确,问题是当鼠标悬停在 Treeview 控件上时滚动不工作 (TreeNodesLeft/TreeNodesLeft)? 如果是这种情况,那是因为树视图有它自己的内部滚动查看器,所以当鼠标悬停在它上面时,滚动查看器正在工作。您必须编辑树视图的模板以删除滚动查看器。

在您的树视图中添加以下内容

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

或者将其添加为静态资源并重复使用

<ControlTemplate x:Key="NoScrollViewerTemplate">
        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true">
            <ItemsPresenter/>
        </Border>
    </ControlTemplate>


<TreeView Template="{StaticResource NoScrollViewerTemplate}" />