如何在ListBox中禁用ScrollViewer?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在ListBox中禁用ScrollViewer?相关的知识,希望对你有一定的参考价值。
我有一个ListBox。它有内部ScrollViewer,所以我可以用鼠标滚轮滚动ListBox内容。它工作正常,直到我设置包含另一个ListBox的项目模板(事实上,我有4个嵌套的ListBoxes =))。问题是内部ListBox的ScrollViewer窃取了转动事件。有没有简单的方法可以防止这种行为?
我有ListBox和ItemContainerStyle,如下所示:
<Style x:Key="ListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
<Setter Property="BorderBrush" Value="Black"/>
...
</Style>
<ListBox ItemContainerStyle="{StaticResource ListBoxItemStyle}" />
如何在这样的资源中为ItemContainer的项边框设置样式?据我所知,ContentPresenter是ItemsControl的项容器。但它没有边框,所以我无法设计它。
您可以通过将控件模板更改为更简单的方式从ScrollViewer
中删除ListBox
:
<ListBox>
<ListBox.Template>
<ControlTemplate>
<ItemsPresenter />
</ControlTemplate>
</ListBox.Template>
...
</ListBox>
但是,我质疑嵌套ListBoxes的价值。请记住,每个ListBox
都是一个选择器,并且具有“选择”项目的概念。在所选项目内的所选项目中选择项目是否真的有意义?
我建议将“内部”ListBoxes
更改为简单的ItemsControls
,以便嵌套列表不能选择项目。这将使用户体验更加简单。您可能仍需要以相同的方式重新模拟内部ItemsControls
以移除滚动条,但至少用户不会对哪个项目被“选中”感到困惑。
您可以通过在XAML中捕获滚动事件来禁用窃取滚动事件:
<ListBox PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">
并在Code中重新发布它:
private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
if (sender is ListBox && !e.Handled)
{
e.Handled = true;
var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
eventArg.RoutedEvent = UIElement.MouseWheelEvent;
eventArg.Source = sender;
var parent = ((Control)sender).Parent as UIElement;
parent.RaiseEvent(eventArg);
}
}
解决方案完全适用于ListBox,它帮助我使用ListView。
我发现这个解决方案:
很抱歉醒来这么老的帖子。实际上,您可以使用ScrollViewer的附加属性来禁用ScrollViewer。
<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled" ...
</ListBox>
你可以用这个!没有车轮被盗。
<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled" ...
</ListBox>
以上是关于如何在ListBox中禁用ScrollViewer?的主要内容,如果未能解决你的问题,请参考以下文章
每次我在 WPF 中加载时如何使 Listbox 的 ScrollViewer 滚动到顶部
wpf 中scrollviewer 中放置个LISTBOX,当焦点在LISTBOX时候,滚动鼠标不响应Scrollviewer的鼠标滚动
ListBox有个滚动条,ScrollViewer 有个滚动条