Можно ли программно прокручивать список списков WPF? Я знаю, что winforms этого не делает, правильно?
Я говорю о прокрутке 50 единиц вверх или вниз и т.д. Не прокручивая сразу всю высоту элемента.
Можно ли программно прокручивать список списков WPF? Я знаю, что winforms этого не делает, правильно?
Я говорю о прокрутке 50 единиц вверх или вниз и т.д. Не прокручивая сразу всю высоту элемента.
Да, вам придется захватить ScrollViwer из ListView, или, как только у вас есть доступ к нему, вы можете использовать методы, открытые им или переопределить прокрутку. Вы также можете прокручивать, получив основную область содержимого и используя ее реализацию интерфейса IScrollInfo.
Здесь немного помощника, чтобы получить компонент ScrollViwer чего-то вроде ListBox, ListView и т.д.
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;
}
И тогда вы можете просто использовать .LineUp() и .LineDown() следующим образом:
private void OnScrollUp(object sender, RoutedEventArgs e)
{
var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer;
if (scrollViwer != null)
{
// Logical Scrolling by Item
// scrollViwer.LineUp();
// Physical Scrolling by Offset
scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3);
}
}
private void OnScrollDown(object sender, RoutedEventArgs e)
{
var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer;
if (scrollViwer != null)
{
// Logical Scrolling by Item
// scrollViwer.LineDown();
// Physical Scrolling by Offset
scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3);
}
}
<DockPanel>
<Button DockPanel.Dock="Top"
Content="Scroll Up"
Click="OnScrollUp" />
<Button DockPanel.Dock="Bottom"
Content="Scroll Down"
Click="OnScrollDown" />
<ListView x:Name="uiListView">
<!-- Content -->
</ListView>
</DockPanel>
Логическая прокрутка, открытая LineUp и LineDown, все еще прокручивается по элементу, если вы хотите прокручивать заданную величину, вы должны использовать ScrollToHorizontal/VerticalOffset, который я использовал выше. Если вам нужна еще более сложная прокрутка, взгляните на ответ, который я предоставил в этом другом вопросе.
Вы пробовали ScrollIntoView? В качестве альтернативы, если это не определенный элемент, который вы указали, а смещение от текущей позиции, вы можете использовать BringIntoView.