2017-04-06 4 views
2

私のContentPageでは、ItemsControl(https://github.com/xamarinhq/xamu-infrastructure/blob/master/src/XamU.Infrastructure/Controls/ItemsControl.cs)を使用して、ScrollView内のItemsSourceにバインドされたテンプレートアイテムの水平StackLayoutを表示します。Xamarin.Formsを使用してItemsSourceをビューモデル内で変更したときのScrollToAsyncの正しい場所

<ScrollView Orientation="Horizontal" x:Name="MyScrollView"> <userControls:ItemsControl ItemsSource="{Binding MyItems}" x:Name="MyItemsControl"> <userControls:ItemsControl.ItemTemplate> <DataTemplate> ... </DataTemplate> </userControls:ItemsControl.ItemTemplate> </userControls:ItemsControl> </ScrollView>

私は私のページに移動すると、私の見解モデルはのObservableCollectionにMyItemsを設定し、ItemsControlには、画面幅を超えてもよいです。このような場合は、ScrollViewの最後までスクロールしてMyItemの最後の要素を表示する必要があります。

私は、ページとItemsControlの両方でLayoutChildrenをオーバーライドしようとしましたが、時々動作しますが、矛盾していて、ときどきアイテムのスクロールビュー部分を停止します。 LayoutChildrenが複数回呼び出さ(およびプラットフォームによって異なります)を取得しますので

protected override async void LayoutChildren(double x, double y, double width, double height) 
{ 
    base.LayoutChildren(x, y, width, height); 
    if (_previousWidth != MyItemsControl.Width) 
    { 
    _previousWidth = MyItemsControl.Width; 
    if (MyItemsControl.Width > screenWidth) 
    { 
     //await Task.Yield(); 
     await BreadcrumbScrollView.ScrollToAsync(_previousWidth-screenWidth, 0, false); 
    } 
    } 
} 

、私は一度ScrollToAsyncを呼び出すことができるようにレイアウトが完了したときに知る方法はありますか?

答えて

1

キーボードの表示やページのポップインなどのアニメーションとの競合を避けるために、スクロールを少し遅らせることができます。これは過去に私のために働いていました。

スクロールの前にDebug.WriteLineを置いて、何らかの理由で2回以上呼び出されていないかどうかを確認することもできます。その場合は、フラグを1回だけ実行するように追加します。ここで

はハック確かに、スクロールを遅らせる方法は次のとおりです。

Device.BeginInvokeOnMainThread(async() => 
{ 
    if (MyItemsControl.Width > screenWidth) 
    { 
     await Task.Delay(25); 
     await BreadcrumbScrollView.ScrollToAsync(_previousWidth-screenWidth, 0, false); 
    } 
}); 
関連する問題