Подтвердить что ты не робот

Колесо мыши 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. Это позволяет использовать полосу прокрутки и удаляет дубликат. К сожалению, колесико мыши больше не работает (перетаскивание полосы прокрутки отлично работает).

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

<ScrollViewer Background="Transparent">

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

Ответ 4

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

<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

Ответ 5

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

<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>

Ответ 6

Я хочу добавить некоторые комментарии к решению, предоставленному Rocky. Это работало нормально для меня, но позже мне нужно было использовать его в другом окне для прокрутки Grid. Я столкнулся с проблемой: прокрутка не прокручивается до нижнего конца. Причина была в попытках установить недопустимое значение VerticalOffset. Приведенный ниже код отлично работает для меня (просто нужно изменить обработчик PreviewMouseWheel:

private void UIElement_OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        ScrollViewer scroll = (ScrollViewer)sender;
        if (e.Delta < 0)
        {
            if (scroll.VerticalOffset - e.Delta <= scroll.ExtentHeight - scroll.ViewportHeight)
            {
                scroll.ScrollToVerticalOffset(scroll.VerticalOffset - e.Delta);
            }
            else
            {
                scroll.ScrollToBottom();
            }
        }
        else
        {
            if (scroll.VerticalOffset + e.Delta > 0)
            {
                scroll.ScrollToVerticalOffset(scroll.VerticalOffset - e.Delta);
            }
            else
            {
                scroll.ScrollToTop();
            }
        }
        e.Handled = true;
    }

Ответ 7

попробуйте, работает ли ваша мышь или нет, следуя методу private void timerRefresh_Tick(object sender, EventArgs e) { txtbtnhead.Text=Cursor.Position.ToString(); }