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
'programing' 카테고리의 다른 글
Android : 라디오 버튼을 가로로 배치 (0) | 2021.01.18 |
---|---|
해당 div로 스크롤 한 후 div를 수정하는 방법은 무엇입니까? (0) | 2021.01.18 |
교리 배열 대 simple_array 대 json_array (0) | 2021.01.18 |
변수가 여러 문자열 값과 같지 않은지 확인하는 더 간단한 방법은 무엇입니까? (0) | 2021.01.18 |
matplotlib (python)에서 글꼴을 변경하는 방법은 무엇입니까? (0) | 2021.01.18 |