在宽屏幕中捕捉Windows 8 Metro中的ScrollViewer,而不是捕捉到最后一项

时间:2012-06-18 14:00:41

标签: windows xaml microsoft-metro

我已在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应用程序我无法访问屏幕大小,所以我甚至无法添加具有可变宽度的最后一项,具体取决于屏幕解决这个问题。有什么建议吗?

谢谢!

4 个答案:

答案 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)

当ViewChanging时,

chuanged 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;
        }
    }