如何在 UWP XAML/C# 中更改滚动查看器的滚动量?
How to change amount of scroll through Scroll Viewer in UWP XAML/C#?
我正在使用 ListView 来显示一些项目,假设高度为 100。如果项目很多,垂直滚动条将使用 ScrollViewer 属性显示。但是,当用户滚动列表时,它有时会滚动一半屏幕,因此一次滚动就会覆盖整个列表视图。
我想要一些代码来设置滚动量,比如当时100高度。
我尝试通过搜索 doc 但找不到任何东西。实际上,数据来自绑定,项目数量会有所不同,但每个项目都有一些固定高度是可以的。
示例代码:
<ListView Name="lvSummaryList" ScrollViewer.VerticalScrollMode="Enabled"
ScrollViewer.IsVerticalRailEnabled="True"
VerticalAlignment="Bottom"
SelectionMode="None" ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollMode="Disabled" ScrollViewer.IsVerticalScrollChainingEnabled="True"
Margin="0,5,10,0"
MaxHeight="600" >
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsWrapGrid Orientation="Horizontal" GroupPadding="1" Margin="1" MinHeight="100" MaxHeight="200" MaximumRowsOrColumns="4" VerticalAlignment="Center"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
我如何完成此操作,是否有 属性 或什至可以覆盖当前行为?
可以尝试设置SmallChange属性或者监听垂直ScrollBar的Scroll事件,根据实际需要调整ScrollBar的位置
PS:还有其他方法可以获取对 ListView 的滚动查看器的引用,如图所示。
public MainPage()
{
this.InitializeComponent();
var scrollViewer = GetDescendants(lvSummaryList).OfType<ScrollViewer>().FirstOrDefault();
var verticalScrollbar = GetDescendants(scrollViewer).OfType<ScrollBar>()
.FirstOrDefault(x => x.Orientation == Orientation.Vertical);
verticalScrollbar.SmallChange = 5;
//You can listen to the Scroll event of the vertical ScrollBar, and to pragmatically adjust the ScrollBar position
/*verticalScrollbar.Scroll += (o, e) =>
{
if (e.ScrollEventType != ScrollEventType.EndScroll)
scrollViewer.ScrollToVerticalOffset(100); // Scroll to the top
if (e.NewValue >= verticalScrollbar.Maximum)
scrollViewer.ScrollToVerticalOffset(0); // Scroll to the top
};*/
}
public static IEnumerable<DependencyObject> GetDescendants(DependencyObject start)
{
var queue = new Queue<DependencyObject>();
var count = VisualTreeHelper.GetChildrenCount(start);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(start, i);
yield return child;
queue.Enqueue(child);
}
while (queue.Count > 0)
{
var parent = queue.Dequeue();
var count2 = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count2; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
yield return child;
queue.Enqueue(child);
}
}
}
实现您想要达到的效果的一种更简单的方法是在 ScrollViewer 上启用捕捉点。
使用以下作为您的 ListView 的样式:
<Style TargetType="ListView"
x:Key="SnapListViewStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListView">
<Border BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}"
BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer x:Name="ScrollViewer"
TabNavigation="{TemplateBinding TabNavigation}"
HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}"
VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}"
IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
VerticalSnapPointsAlignment="Near"
VerticalSnapPointsType="MandatorySingle"
ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}"
IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}"
BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}"
AutomationProperties.AccessibilityView="Raw">
<ItemsPresenter Header="{TemplateBinding Header}"
HeaderTemplate="{TemplateBinding HeaderTemplate}"
HeaderTransitions="{TemplateBinding HeaderTransitions}"
Footer="{TemplateBinding Footer}"
FooterTemplate="{TemplateBinding FooterTemplate}"
FooterTransitions="{TemplateBinding FooterTransitions}"
Padding="{TemplateBinding Padding}" />
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如果这没有达到您想要的效果,请尝试 VerticalSnapPointsType and VerticalSnapPointsAlignment 的不同值。
我正在使用 ListView 来显示一些项目,假设高度为 100。如果项目很多,垂直滚动条将使用 ScrollViewer 属性显示。但是,当用户滚动列表时,它有时会滚动一半屏幕,因此一次滚动就会覆盖整个列表视图。
我想要一些代码来设置滚动量,比如当时100高度。 我尝试通过搜索 doc 但找不到任何东西。实际上,数据来自绑定,项目数量会有所不同,但每个项目都有一些固定高度是可以的。
示例代码:
<ListView Name="lvSummaryList" ScrollViewer.VerticalScrollMode="Enabled"
ScrollViewer.IsVerticalRailEnabled="True"
VerticalAlignment="Bottom"
SelectionMode="None" ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollMode="Disabled" ScrollViewer.IsVerticalScrollChainingEnabled="True"
Margin="0,5,10,0"
MaxHeight="600" >
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsWrapGrid Orientation="Horizontal" GroupPadding="1" Margin="1" MinHeight="100" MaxHeight="200" MaximumRowsOrColumns="4" VerticalAlignment="Center"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
我如何完成此操作,是否有 属性 或什至可以覆盖当前行为?
可以尝试设置SmallChange属性或者监听垂直ScrollBar的Scroll事件,根据实际需要调整ScrollBar的位置
PS:还有其他方法可以获取对 ListView 的滚动查看器的引用,如图所示。
public MainPage()
{
this.InitializeComponent();
var scrollViewer = GetDescendants(lvSummaryList).OfType<ScrollViewer>().FirstOrDefault();
var verticalScrollbar = GetDescendants(scrollViewer).OfType<ScrollBar>()
.FirstOrDefault(x => x.Orientation == Orientation.Vertical);
verticalScrollbar.SmallChange = 5;
//You can listen to the Scroll event of the vertical ScrollBar, and to pragmatically adjust the ScrollBar position
/*verticalScrollbar.Scroll += (o, e) =>
{
if (e.ScrollEventType != ScrollEventType.EndScroll)
scrollViewer.ScrollToVerticalOffset(100); // Scroll to the top
if (e.NewValue >= verticalScrollbar.Maximum)
scrollViewer.ScrollToVerticalOffset(0); // Scroll to the top
};*/
}
public static IEnumerable<DependencyObject> GetDescendants(DependencyObject start)
{
var queue = new Queue<DependencyObject>();
var count = VisualTreeHelper.GetChildrenCount(start);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(start, i);
yield return child;
queue.Enqueue(child);
}
while (queue.Count > 0)
{
var parent = queue.Dequeue();
var count2 = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count2; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
yield return child;
queue.Enqueue(child);
}
}
}
实现您想要达到的效果的一种更简单的方法是在 ScrollViewer 上启用捕捉点。
使用以下作为您的 ListView 的样式:
<Style TargetType="ListView"
x:Key="SnapListViewStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListView">
<Border BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}"
BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer x:Name="ScrollViewer"
TabNavigation="{TemplateBinding TabNavigation}"
HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}"
VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}"
IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
VerticalSnapPointsAlignment="Near"
VerticalSnapPointsType="MandatorySingle"
ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}"
IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}"
BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}"
AutomationProperties.AccessibilityView="Raw">
<ItemsPresenter Header="{TemplateBinding Header}"
HeaderTemplate="{TemplateBinding HeaderTemplate}"
HeaderTransitions="{TemplateBinding HeaderTransitions}"
Footer="{TemplateBinding Footer}"
FooterTemplate="{TemplateBinding FooterTemplate}"
FooterTransitions="{TemplateBinding FooterTransitions}"
Padding="{TemplateBinding Padding}" />
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如果这没有达到您想要的效果,请尝试 VerticalSnapPointsType and VerticalSnapPointsAlignment 的不同值。