Как отключить ScrollViewer в ListBox? - PullRequest
10 голосов
/ 16 ноября 2009

У меня есть ListBox. Он имеет внутренний ScrollViewer, поэтому я могу прокручивать содержимое ListBox с помощью колесика мыши. Он работает нормально, пока я не установлю шаблон элемента, который содержит другой ListBox (фактически, у меня есть 4 вложенных ListBoxes =)) Проблема заключается в том, что внутренний ScrollViewer ListBox крадет событие вращения. Есть ли простой способ предотвратить это поведение?


У меня был ListBox с ItemContainerStyle вот так:

<Style x:Key="ListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="BorderBrush" Value="Black"/>
     ... 
</Style>
<ListBox ItemContainerStyle="{StaticResource ListBoxItemStyle}" />

Как мне установить стиль для границы элемента ItemContainer в подобных ресурсах? Как я знаю, ContentPresenter является контейнером элементов ItemsControl. Но у него нет Границы, поэтому я не могу его стилизовать.

Ответы [ 4 ]

47 голосов
/ 16 ноября 2009

Вы можете удалить ScrollViewer из ListBox, изменив его шаблон управления на что-то гораздо более простое:

<ListBox>
    <ListBox.Template>
        <ControlTemplate>
            <ItemsPresenter />
        </ControlTemplate>
    </ListBox.Template>
    ...
</ListBox>

Однако я подвергаю сомнению ценность вложенности ListBoxes. Помните, что каждый ListBox является Селектором и имеет понятие о том, какой элемент «выбран». Действительно ли имеет смысл иметь выбранный элемент внутри выбранного элемента, внутри выбранного элемента?

Я бы предложил изменить "внутренний" ListBoxes на простой ItemsControls, чтобы во вложенных списках не было выделенных элементов. Это сделало бы для пользователя намного проще. Возможно, вам все равно придется повторить шаблон внутреннего ItemsControls таким же образом, чтобы удалить полосы прокрутки, но, по крайней мере, пользователь не будет смущен тем, какой элемент «выбран».

3 голосов
/ 30 декабря 2017

Вы можете отключить кражу событий прокрутки, перехватывая событие прокрутки в XAML:

<ListBox PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">

и переиздание в коде:

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

1 голос
/ 16 августа 2016

Извините, что разбудил такой старый пост. На самом деле, вы можете отключить ScrollViewer с помощью вложенного свойства ScrollViewer.

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         ScrollViewer.VerticalScrollBarVisibility="Disabled" ...
</ListBox>
0 голосов
/ 25 ноября 2017

Вы можете использовать это! Колесо не украдено.

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