如何在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。

我发现这个解决方案:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/3a3bb6b0-e088-494d-8ef2-60814415fd89/swallowing-mouse-scroll?forum=wpf

另一答案

很抱歉醒来这么老的帖子。实际上,您可以使用ScrollViewer的附加属性来禁用ScrollViewer。

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         ScrollViewer.VerticalScrollBarVisibility="Disabled" ...
</ListBox>
另一答案

你可以用这个!没有车轮被盗。

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
     ScrollViewer.VerticalScrollBarVisibility="Disabled" ...
</ListBox>

以上是关于如何在ListBox中禁用ScrollViewer?的主要内容,如果未能解决你的问题,请参考以下文章

如何在WPF ListBox中禁用水平滚动?

每次我在 WPF 中加载时如何使 Listbox 的 ScrollViewer 滚动到顶部

wpf 中scrollviewer 中放置个LISTBOX,当焦点在LISTBOX时候,滚动鼠标不响应Scrollviewer的鼠标滚动

ListBox有个滚动条,ScrollViewer 有个滚动条

ListBox 的 Scrollviewer 根据项目数可见

WPF自定义控件与样式-ScrollViewer与ListBox自定义样式