3

我已在 ScrollViewer 内的应用程序中启用捕捉点,如以下问题所述:使用可绑定集合启用 ScrollViewer Horizo​​ntalSnapPoints

我遇到的问题是,当我在全高清显示器(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>

我什至使用此 hack 的第二个问题是,我无法通过 Metro 应用程序访问屏幕尺寸,因此我什至无法根据屏幕添加宽度可变的最后一项来解决此问题问题。有什么建议么?

谢谢!

4

4 回答 4

1

似乎以编程方式更改最后一项的宽度是最好的解决方案,使用 Window.Current.Bounds.Width;

于 2012-08-01T23:58:01.450 回答
0

LayoutAwarePage.cs我发现您可以使用WindowSizeChanged事件 ( e.Size)从内部访问当前屏幕大小

也就是说,我确信可能有更好的方法来访问此事件。

于 2012-06-19T13:07:29.447 回答
0

之前提供的解决方案仅适用于少量案例(具有固定尺寸的物品)并且存在视觉问题。

更新: 请参阅此处的示例Enabling ScrollViewer Horizo​​ntalSnapPoints with bindable collection

不需要“假”项目,至于第二个:您不需要屏幕大小,只需要 ItemsPresenter.Parent.ActualHeight(或宽度,取决于列表的使用方向)和项目容器宽度 - 请参见示例。

于 2016-01-18T11:34:39.410 回答
0

ViewChanging 时更改 Horizo​​ntalSnapPointsAlignment ,如下所示:

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;
        }
    }
于 2016-06-12T10:51:38.210 回答