首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF TreeView in ScrollView:如何在TreeView上启用鼠标滚动

WPF TreeView in ScrollView:如何在TreeView上启用鼠标滚动
EN

Stack Overflow用户
提问于 2019-01-22 15:54:46
回答 2查看 1.4K关注 0票数 0

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

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

我的观点:

代码语言:javascript
复制
  <!-- 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 -->
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-22 20:24:16

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

在树视图中添加以下内容

代码语言:javascript
复制
 <TreeView.Template>
      <ControlTemplate>
          <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness=" 
           {TemplateBinding BorderThickness}" SnapsToDevicePixels="true">
              <ItemsPresenter/>
          </Border>
      </ControlTemplate>
 </TreeView.Template>

或者将其作为静态资源添加并重用它。

代码语言:javascript
复制
<ControlTemplate x:Key="NoScrollViewerTemplate">
        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true">
            <ItemsPresenter/>
        </Border>
    </ControlTemplate>


<TreeView Template="{StaticResource NoScrollViewerTemplate}" />
票数 1
EN

Stack Overflow用户

发布于 2019-01-22 16:15:43

您可以遵循以下两种选择之一:

  1. 不要使用自定义scrollViewer,而是通过TreeViews事件和ScrollToVerticalOffset方法同步滚动位置,如:Synchronized scrolling of two ScrollViewers whenever any one is scrolled in wpf,您可以通过GetChildOfType:How to get children of a WPF container by type?从TreeView获得ScrollViewer。
  2. 通过ScrollViewersTreeViews禁用ScrollViewer.VerticalScrollBarVisibility="Disabled",并在此处添加WheelScrollingScrollViewer mouse wheel not working。可能TreeView ScrollViewers仍在处理滚动事件。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54311985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档