【问题标题】:WPF TreeView in ScrollView: How to enable scrolling with mouse over TreeViewScrollView 中的 WPF TreeView:如何在 TreeView 上启用鼠标滚动
【发布时间】:2019-01-22 15:54:46
【问题描述】:

我在一个网格中有两个树视图。此网格位于 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 -->

【问题讨论】:

    标签: c# wpf xaml binding treeview


    【解决方案1】:

    如果我理解正确,问题是当鼠标悬停在 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}" />
    

    【讨论】:

      【解决方案2】:

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

      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. 通过ScrollViewer.VerticalScrollBarVisibility="Disabled"TreeViews 禁用ScrollViewers,并在此处添加WheelScrolling,如下所示:ScrollViewer mouse wheel not workingTreeView ScrollViewers 可能仍在处理您的滚动事件。

      【讨论】:

      • 我的情况是,两个视图不包含相同数量的节点。这意味着一个可能会滚动,而另一个则不会。在中间的视图中,有“连接”线,从“左索引到右索引”。
      • “一个可以滚动,另一个不能”是什么意思。你的意思是你真的需要 TreeViews 中的那 2 个 ScrollViewer 并且你不能禁用它们?
      • 对不起,我的意思是他们有不同数量的节点。因此,如果两者都有自己的滚动条 - 一个树视图可以有滚动,而另一个则没有。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多