WPF 목록 뷰에서 부드러운 스크롤을 구현할 수 있습니까?
WPF에 스무스 스크롤을 실장할 수 있습니까?listview
파이어폭스에서의 동작에 대해 어떻게 생각하십니까?
Firefox 브라우저에 모두 포함되었을 때listview
마우스 가운데 버튼(해제하지 않음)을 누르고 드래그하면 부드럽게 스크롤할 수 있습니다.listview
아이템을 공개하면 멈춰야 합니다.
winform에서는 불가능할 것 같습니다만, WPF에서는 사용할 수 있을까요?
원활한 스크롤은 가능하지만 아이템 가상화는 손실되므로 기본적으로 목록에 요소가 거의 없는 경우에만 이 기술을 사용해야 합니다.
정보 여기: 목록 상자에서 부드러운 스크롤
설정해 본 적이 있습니까?
ScrollViewer.CanContentScroll="False"
목록 상자에?
이 방법으로 스크롤은 listBox가 아닌 패널에 의해 처리됩니다.그러나 이렇게 하면 가상화가 손실되기 때문에 콘텐츠가 많을 경우 가상화 속도가 느려질 수 있습니다.
고객님이 원하시는 대로 할 수 있지만, 상당한 양의 커스텀 코드가 필요합니다.
보통 WPF에서는 ScrollViewer는 Logical Scrolling이라고 하는 것을 사용합니다.이것은 오프셋량이 아니라 항목별로 스크롤하는 것을 의미합니다.다른 답변에서는 논리 스크롤 동작을 물리 스크롤 동작으로 변경할 수 있는 방법에 대해 설명합니다.다른 방법은 ScrollViwer와 IScrollInfo에 의해 공개되는 ScrollToVertialOffset 및 ScrollToHorizontalOffset 메서드를 사용하는 것입니다.
마우스 휠을 눌렀을 때 스크롤하는 큰 부분을 구현하려면 MouseDown 이벤트와 MouseMove 이벤트를 사용해야 합니다.
<ListView x:Name="uiListView"
Mouse.MouseDown="OnListViewMouseDown"
Mouse.MouseMove="OnListViewMouseMove"
ScrollViewer.CanContentScroll="False">
....
</ListView>
MouseDown(마우스 아래로)에서 현재 마우스 위치를 기록합니다. 이 위치를 상대 포인트로 사용하여 스크롤할 방향을 결정합니다.마우스 이동 시 ListView의 ScrollViwer 컴포넌트를 가져와 그에 따라 스크롤합니다.
private Point myMousePlacementPoint;
private void OnListViewMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.MiddleButton == MouseButtonState.Pressed)
{
myMousePlacementPoint = this.PointToScreen(Mouse.GetPosition(this));
}
}
private void OnListViewMouseMove(object sender, MouseEventArgs e)
{
ScrollViewer scrollViewer = ScrollHelper.GetScrollViewer(uiListView) as ScrollViewer;
if (e.MiddleButton == MouseButtonState.Pressed)
{
var currentPoint = this.PointToScreen(Mouse.GetPosition(this));
if (currentPoint.Y < myMousePlacementPoint.Y)
{
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - 3);
}
else if (currentPoint.Y > myMousePlacementPoint.Y)
{
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + 3);
}
if (currentPoint.X < myMousePlacementPoint.X)
{
scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset - 3);
}
else if (currentPoint.X > myMousePlacementPoint.X)
{
scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + 3);
}
}
}
public static DependencyObject GetScrollViewer(DependencyObject o)
{
// Return the DependencyObject if it is a ScrollViewer
if (o is ScrollViewer)
{ return o; }
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++)
{
var child = VisualTreeHelper.GetChild(o, i);
var result = GetScrollViewer(child);
if (result == null)
{
continue;
}
else
{
return result;
}
}
return null;
}
개념 증명일 뿐이므로 부족한 부분도 있지만, 올바른 방향으로 시작할 수 있을 것입니다.마우스를 처음 MouseDown 포인트에서 멀어지면 스크롤 로직이 DispatcherTimer 또는 이와 유사한 포인트로 이동하면 스크롤 로직접 스크롤 로직은 DispatcherTimer에 들어갑니다.
Scroll Viewer를 설정해 보겠습니다.CanContentScroll이 연결된 속성을 ListView에서 false로 설정합니다.그러나 Pop Catalin이 말했듯이 아이템 가상화는 손실됩니다.즉, 목록 내의 모든 아이템이 동시에 로드되고 입력됩니다.이 때문에, 리스트가 큰 경우, 메모리와 퍼포먼스의 문제가 발생할 가능성이 있습니다.
이 게시물이 13년 된 것은 알지만, 새로운 버전에서는 여전히 사람들이 원하는 작업입니다.이렇게 설정하면 가상화를 잃지 않고 아이템이 아닌 픽셀 단위로 스크롤할 수 있습니다.
이 솔루션이 도움이 되었습니다.
ScrollViewer.CanContentScroll="False"
VirtualizingPanel.ScrollUnit="Pixel"
팝 카탈린과 다크덕 감사합니다.
목록 뷰의 높이를 자동으로 설정하고 스크롤 뷰어로 감아 보십시오.
<ScrollViewer IsTabStop="True" VerticalScrollBarVisibility="Auto">
<ListView></ListView>
</ScrollViewer>
Scroll Viewer Hope의 높이에 대해 언급하는 것을 잊지 마십시오.
언급URL : https://stackoverflow.com/questions/1033841/is-it-possible-to-implement-smooth-scroll-in-a-wpf-listview
'programing' 카테고리의 다른 글
정규식을 사용하여 bash에서 검색 및 바꾸기 (0) | 2023.04.17 |
---|---|
Swift에서 일련의 취약한 참조를 선언하려면 어떻게 해야 합니까? (0) | 2023.04.17 |
Swift로 현재 언어 코드를 얻는 방법은 무엇입니까? (0) | 2023.04.17 |
Bash에 TRY CATCH 명령어가 있습니까? (0) | 2023.04.17 |
SQL Management Studio의 시작/끝 블록에서 "스키마 생성"을 사용할 수 없는 이유는 무엇입니까? (0) | 2023.04.17 |