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

В настоящее время я работаю над своим первым проектом WPF и пытается сделать прокручиваемый список. Сначала я думал, что это можно легко сделать, просто ограничив ширину и высоту списка и, таким образом, заставляя полосу прокрутки появляться автоматически всякий раз, когда содержимое превышает его пространство. Сначала это выглядело отлично, но из-за обработанного 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 (в этом случае все еще работает прокрутка через колесико мыши). Должен ли я обрабатывать перетаскивание элементов по-разному (это сработало для меня, прежде чем вы захотите добавить панель прокрутки)? Или есть способ определить, находится ли курсор над полосой прокрутки (так что я мог бы отменить выбор элемента, который позволяет прокручивать)? Или есть другие предложения?

c#,.net,wpf,scrollviewer,mousewheel,

45

Ответов: 5


72 принят

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

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

14

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

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

<ScrollViewer Background="Transparent">

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


3

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

<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


0

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

<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>
C # ,. сеть, МОФ, ScrollViewer, MouseWheel,
Похожие вопросы