programing

ScrollViewer 마우스 휠이 작동하지 않습니다.

projobs 2021. 1. 18. 07:28
반응형

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 이벤트로 인해 항목을 선택한 후 스크롤바를 드래그 할 수 없다는 것입니다 (이 경우 마우스 휠을 통한 스크롤은 여전히 ​​작동 함). 항목 드래그를 다르게 처리해야합니까 (스크롤 막대를 추가하기 전에 잘 작동했습니다)? 또는 커서가 스크롤 막대 위에 있는지 감지하는 방법이 있습니까 (그러면 스크롤을 활성화하는 항목을 선택 취소 할 수 있음)? 아니면 다른 제안이 있습니까?


이것은 당신을 도울 수 있습니다 ..

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>

디자인은 외부 범위, 즉 ScrollViewer에서 VerticalScrollBarVisibility 속성을 비활성화했습니다.


나를 위해 이것은 일했습니다.

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

Rocky가 제공 한 솔루션에 몇 가지 의견을 추가하고 싶습니다. 그것은 나를 위해 잘 작동했지만 나중에 다른 창에서 그리드를 스크롤하기 위해 사용해야했습니다. 문제가 발생했습니다. scrollviewer가 맨 아래로 스크롤되지 않았습니다. 그 이유는 잘못된 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;
    }

참조 URL : https://stackoverflow.com/questions/16234522/scrollviewer-mouse-wheel-not-working

반응형