6

Windows 8 Metro アプリで、ビューの最後の項目に到達するとビューの最初の項目にループバックする ScrollViewer を作成することは可能ですか? もしそうなら、どうすればこの効果を達成できますか?

4

2 に答える 2

3

それは間違いなく可能です。私は現在問題を解決しており、完了したら作業を投稿します。これまでのところ、以下のようになります。

アイデアは、バーを移動するたびに発生するスクロール ビューアの viewchanged イベントにフックすることです。そこに着いたら、オフセットのどこにいるかと項目のサイズを計算し、それを使用して、リストボックス コンテナーの実際のサイズまたは何を持っているかを測定できます。

オフセットのどこにいるのか、リストボックスの実際の高さとアイテムの高さがわかれば、現在表示されているアイテムと表示されていないアイテムがわかります。オブジェクトにバインドされたリストが、双方向バインディングで INotifyChanged インターフェイスを実装する監視可能なコレクションであることを確認してください。次に、スクロールのどこにいるかに基づいて前後に回転する一連のオブジェクトを定義できます。

もう 1 つのオプションは、別の開始点を試すことです。おそらく、マーキーとその下にスクロールバーがある単一のコントロールでしょうか?

XAML

</UserControl.Resources>
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
<ScrollViewer x:Name="ScrollViewer1">
    <ListBox x:Name="SampleListBox" Background="White" ItemsSource="{Binding Path=sampleItems}" ItemTemplate="{StaticResource sampleTemplate}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Row="0" Grid.RowSpan="2">

    </ListBox>
</ScrollViewer>
</Grid>

コードビハインド

    public sealed partial class MainPage : Page
{
    List<SampleItem> sampleItems;
    const int numItems = 15;
    public MainPage()
    {
        sampleItems = new List<SampleItem>();
        for (int i = 0; i < numItems; i++)
        {
            sampleItems.Add(new SampleItem(i));
        }
        this.InitializeComponent();
        SampleListBox.ItemsSource = sampleItems;
        ScrollViewer1.ViewChanged += ScrollViewer1_ViewChanged;
    }
    void ScrollViewer1_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
    {
        ScrollViewer viewer = sender as ScrollViewer;
        ListBox box = viewer.Content as ListBox;
        ListBoxItem lbi = box.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
        double elementSize;
        if (lbi == null)
            return;
        elementSize = lbi.ActualHeight;

    }        /// <summary>
    /// Invoked when this page is about to be displayed in a Frame.
    /// </summary>
    /// <param name="e">Event data that describes how this page was reached.  The Parameter
    /// property is typically used to configure the page.</param>
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
    }
}

public class SampleItem
{
    public String ItemCount { get; set; }
    public SampleItem(int itemCount)
    {
        ItemCount = itemCount.ToString();
    }
}
于 2012-07-05T15:32:03.060 に答える
1

WinRT/XAML にそのようなコントロールがあるとは思わないので、カスタム コントロールを実装する必要があります。さまざまな方法がありますが、ScrollViewer の動作を要件に合わせるのは簡単ではない可能性があるため、ScrollViewer の使用を避け、操作イベントを直接処理することをお勧めします。操作イベントとスクロール オフセットに基づいてスクロール オフセットを制御します。たとえば、Canvas コントロールを使用して、要素をビューに配置します。スクロール オフセットに応じてアイテム パネル内の要素を再配置する必要があります。たとえば、一方の端でビュー ポートを超えるアイテムがもう一方の端に移動されるようにします。これには、カスタムの依存関係プロパティ、アイテム コンテナーなどが含まれます。これらの API をすべて知っていれば、おそらく少なくとも数時間の作業が必要です。

于 2012-07-05T15:02:33.697 に答える