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

时间:2019-01-22 15:54:47

标签: c# wpf xaml binding treeview

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

我的问题现在是,当鼠标悬停在“树”上并使用鼠标滚轮时,“滚动”视图不滚动。当我将鼠标悬停在另一个内部视图(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 -->

2 个答案:

答案 0 :(得分:1)

如果我理解正确,那么问题是鼠标悬停在Treeview控件(TreeNodesLeft / TreeNodesLeft)上时滚动无法正常工作? 如果是这种情况,那是因为treeview有它自己的内部scrollviewer,所以当鼠标悬停在它上面时,scrollviewr就会起作用。您必须编辑树视图的模板才能删除滚动视图。

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

 <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}" />

答案 1 :(得分:0)

您可以采用以下两个选项之一:

  1. 不要使用自定义的scrollViewer,而是通过ScrollChanged事件和ScrollToVerticalOffset方法在TreeViews之间同步滚动位置,例如此问题: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. 通过ScrollViewers禁用TreeViews的{​​{1}}并添加ScrollViewer.VerticalScrollBarVisibility="Disabled",如下所示:ScrollViewer mouse wheel not working。可能WheelScrolling TreeView仍在处理您的滚动事件。