繁体   English   中英

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

[英]WPF TreeView in ScrollView: How to enable scrolling with mouse over 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 -->

如果我理解正确,那么问题是鼠标悬停在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. 不要使用自定义的scrollViewer,而是通过ScrollChanged事件和ScrollToVerticalOffset方法在TreeViews之间同步滚动位置,例如以下问题: 在wpf中滚动任何两个时,同步滚动两个ScrollViewer您可以通过GetChildOfType从TreeView获取ScrollViewer: 如何获取a的子级WPF容器按类型?

  2. 禁用ScrollViewers两者TreeViews通过ScrollViewer.VerticalScrollBarVisibility="Disabled" ,并添加WheelScrolling喜欢在这里: ScrollViewer中鼠标滚轮不工作 可能TreeView ScrollViewers仍在处理您的滚动事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM