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 -->
您可以选择以下两个选项之一:
不要使用自定义 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?
通过 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}" />
我在网格中有两个树视图。此网格位于 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 -->
您可以选择以下两个选项之一:
不要使用自定义 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?通过
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}" />