3

この質問で説明されているように、ScrollViewer 内のアプリでスナップ ポイントを有効にしました:バインド可能なコレクションで ScrollViewer Horizo​​ntalSnapPoints を有効にする

私が抱えている問題は、アプリをフル HD モニター (1920x1080) で試しており、各アイテムの幅が 1400 px であることです。アイテム #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>

このハックを使用しても発生する2番目の問題は、メトロアプリから画面サイズにアクセスできないため、画面に応じて幅が可変の最後のアイテムを追加してこれを修正することさえできなかったことです問題。助言がありますか?

ありがとう!

4

4 に答える 4

1

Window.Current.Bounds.Width; を使用して、最後の項目の幅をプログラムで変更することが最善の解決策のようです。

于 2012-08-01T23:58:01.450 に答える
0

ViewChanging の場合、次のように Horizo​​ntalSnapPointsAlignment を chuanged します。

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 に答える
0

イベント ( )LayoutAwarePage.csを使用して、内部から現在の画面サイズにアクセスできることがわかりました。WindowSizeChangede.Size

そうは言っても、おそらくこのイベントにアクセスするためのより良い方法があると確信しています。

于 2012-06-19T13:07:29.447 に答える
0

以前に提供された解決策は、少量のケース (サイズが固定されたアイテム) に対してのみ正しく、視覚的なビューに問題がありました。

更新: こちらの例を参照してください。バインド可能なコレクションで ScrollViewer Horizo​​ntalSnapPoints を有効にする

2 つ目については、「偽の」アイテムは必要ありません。ItemsPresenter.Parent.ActualHeight (またはリストの使用方向に応じて幅) とアイテム コンテナーの幅だけの画面サイズは必要ありません。例を参照してください。

于 2016-01-18T11:34:39.410 に答える