Колесо мыши ScrollViewer не работает

В настоящее время я работаю над своим первым проектом WPF и пытаюсь сделать ListView прокручиваемым. Сначала я подумал, что это можно легко сделать, просто ограничив ширину и высоту listview и, таким образом, заставив полосу прокрутки автоматически появляться всякий раз, когда содержимое превышает ее пространство. Сначала это казалось прекрасным, но из-за обработанного PreviewMouseDown-Event (который позволяет перетаскивать элементы списка) он не работает после выбора элемента.

вторая попытка (с помощью ScrollViewer)

<ScrollViewer>
    <ListView ItemsSource="{Binding FileViewModels}"
              PreviewMouseDown="ListView_MouseMove"
              Height="450" Width="200"/>
</ScrollViewer>

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

третий (совсем глупо) попытка (отключение дубликата полосы прокрутки)

<ScrollViewer>
    <ListView ItemsSource="{Binding FileViewModels}"
              PreviewMouseDown="ListView_MouseMove"
              Height="450" Width="200"
              ScrollViewer.VerticalScrollBarVisibility="Disabled"
              ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
</ScrollViewer>

это удалило дубликат полосы прокрутки и включило прокрутку с помощью колеса мыши, но отключило полосу прокрутки, поэтому вы не могли двигаться, нажав и тащить его.

четвертая попытка (постоянный размер ScrollViewer)

<ScrollViewer Height="450" Width="200">
    <ListView ItemsSource="{Binding FileViewModels}"
              PreviewMouseDown="ListView_MouseMove"/>
</ScrollViewer>

удалил ограничение ширины / высоты из ListView и переместил его в ScrollViewer. Это включает полосу прокрутки и удаляет дубликат. К сожалению, колесо мыши больше не работает (перетаскивание полосы прокрутки работает нормально).

может кто-нибудь объяснить мне, почему колесо мыши больше не работает и как исправить это?

редактировать Может, мне стоит вернуться к моему первому решению. Очевидно, что шаблон ListView уже содержит ScrollViewer. Оставшаяся проблема заключается в том, что я не могу перетащить полосу прокрутки после выбора элемента из-за обработанного события PreviewMouseDown (прокрутка через mousewheel все еще работает в этом случае). Должен ли я обрабатывать перетаскивание элементов по-разному (это отлично сработало для меня, прежде чем добавлять полосу прокрутки)? Или есть способ определить, если курсор находится над полосой прокрутки (чтобы я мог отменить выбор элемента, который включает прокрутку)? Или есть другие предложения?

5 ответов


Это может помочь вам..

private void ListViewScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
   ScrollViewer scv = (ScrollViewer)sender;
   scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
   e.Handled = true;
 }

Это, вероятно, было бы самым удобным решением:

        <ListView.Template>
            <ControlTemplate>
                <ScrollViewer>
                    <ItemsPresenter></ItemsPresenter>
                </ScrollViewer>
            </ControlTemplate>
        </ListView.Template>

<ScrollViewer Background="Transparent">

Если Background равен null, колесо мыши не будет работать на ScrollViewer. Вы можете установить фон на прозрачный или какое-либо другое значение.


в моем случае :

<ScrollViewer ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Auto" >
    <DataGrid x:Name="dataGrid" SelectionMode="Single" ItemsSource="{Binding}"  SelectedValuePath="{Binding Item}" AutoGenerateColumns="True">
    </DataGrid>
</ScrollViewer>

дизайн состоял в отключении атрибута VerticalScrollBarVisibility во внешней области, т. е. в ScrollViewer


для меня это работает:

<ListView.Template>
    <ControlTemplate>
        <!-- Empty template to allow ScrollViewer to capture mouse scroll -->
        <ItemsPresenter />
    </ControlTemplate>
</ListView.Template>

вместо этого:

<ListView.Template>
    <ControlTemplate>
        <ScrollViewer>
            <ItemsPresenter></ItemsPresenter>
        </ScrollViewer>
    </ControlTemplate>
</ListView.Template>