Con*_*cer 19 c# wpf listbox scrollviewer
我有一个滚动查看器,里面有几个列表框.问题是如果用户使用鼠标中键滚动滚动查看器,而鼠标位于列表视图上方.列表视图将其内部滚动查看器滚动到底部,然后继续捕获鼠标,防止包含滚动查看器滚动.
关于如何处理这个问题的任何想法?
Kos*_*Kos 44
发生这种情况是因为ListView
's(ListBox
实际上)的内容模板用自己的东西包装了它的项目ScrollViewer
.
最简单的方法是通过放弃自己Template
的内部来禁用它ListView
,一个不创建ScrollViewer
:
<ListView>
<ListView.Template>
<ControlTemplate>
<ItemsPresenter></ItemsPresenter>
</ControlTemplate>
</ListView.Template>
...
</ListView>
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果你在ListView中有一个ListView(这是我的情况),也会发生同样的情况.
IMO,处理这种情况的最佳方法是创建一个自定义控件:
class MyScrollViewer : ScrollViewer
{
protected override void OnPreviewMouseWheel(MouseWheelEventArgs e)
{
base.OnPreviewMouseWheel(e);
if (!e.Handled)
{
e.Handled = true;
this.RaiseEvent(new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
{
RoutedEvent = UIElement.MouseWheelEvent,
Source = this
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
你有没有尝试禁用ListView's
ScrollBars
?
<ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled" />
Run Code Online (Sandbox Code Playgroud)
受到一些 有用 答案的启发,我有一个实现,当内部滚动视图(包括来自 ListView、ListBox、DataGrid)滚动经过其顶部/底部时,滚动祖先 ScrollViewers。
我将附加属性应用于 App.xaml 中的所有 ScrollViewers:
<Style TargetType="ScrollViewer" BasedOn="{StaticResource {x:Type ScrollViewer}}">
<Setter Property="local:ScrollViewerHelper.FixMouseWheel" Value="True" />
</Style>
Run Code Online (Sandbox Code Playgroud)
附加属性检测滚动超过顶部/底部,当发生这种情况时,会在 ScrollViewer 的父级上引发鼠标滚轮事件。事件路由将其获取到外部 ScrollViewer:
<Style TargetType="ScrollViewer" BasedOn="{StaticResource {x:Type ScrollViewer}}">
<Setter Property="local:ScrollViewerHelper.FixMouseWheel" Value="True" />
</Style>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17526 次 |
最近记录: |