我已在ScrollViewer中的应用中启用了捕捉点,如此问题中所述:Enabling ScrollViewer HorizontalSnapPoints with bindable collection
我遇到的问题是,当我在全高清显示器(1920x1080)中尝试我的应用程序时,每个项目的宽度为1400像素。当我在项目#n-1中捕捉到滚动时,我无法滚动到最后一个,因为它没有捕捉...
我必须做的黑客是添加一个“假的”项目,最后是透明的,所以我可以滚动到我的收藏的最后一项:
<Page.Resources>
<Style x:Key="ItemsControlStyle" TargetType="ItemsControl">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ItemsControl">
<ScrollViewer Style="{StaticResource HorizontalScrollViewerStyle}" HorizontalSnapPointsType="Mandatory" HorizontalSnapPointsAlignment="Near">
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
<ItemsControl Style="{StaticResource ItemsControlStyle}">
<Border Background="Red" Height="1000" Width="1400"/>
<Border Background="Blue" Height="1000" Width="1400"/>
<Border Background="Green" Height="1000" Width="1400"/>
<Border Background="Yellow" Height="1000" Width="1400"/>
<Border Background="Magenta" Height="1000" Width="1400"/>
<Border Background="Transparent" Height="1000" Width="1000" />
</ItemsControl>
我甚至使用这个黑客的第二个问题是,从Metro应用程序我无法访问屏幕大小,所以我甚至无法添加具有可变宽度的最后一项,具体取决于屏幕解决这个问题。有什么建议吗?
谢谢!
答案 0 :(得分:1)
似乎以编程方式更改最后一项的宽度是最佳解决方案,使用Window.Current.Bounds.Width;
答案 1 :(得分:0)
我发现您可以使用LayoutAwarePage.cs
事件(WindowSizeChanged
)<{1}}从e.Size
内访问当前屏幕尺寸
尽管如此,我确信可能有更好的方式来访问此事件。
答案 2 :(得分:0)
之前提供的解决方案仅适用于少量案例(具有固定大小的项目)并且存在视觉观点问题。
<强>更新强> 请参阅此处示例Enabling ScrollViewer HorizontalSnapPoints with bindable collection
不需要“假”物品,第二种:您不需要屏幕尺寸ItemsPresenter.Parent.ActualHeight(或宽度,取决于列表的使用方向)和项目容器宽度 - 请参阅示例。
答案 3 :(得分:0)
chuanged HorizontalSnapPointsAlignment,如下所示:
private void sv_ViewChanging(object sender, ScrollViewerViewChangingEventArgs e)
{
if (e.NextView.HorizontalOffset <e.FinalView.HorizontalOffset)
{
sv.HorizontalSnapPointsAlignment = SnapPointsAlignment.Far;
}
else if (e.NextView.HorizontalOffset > e.FinalView.HorizontalOffset)
{
sv.HorizontalSnapPointsAlignment = SnapPointsAlignment.Near;
}
}