Колесо мыши 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>