私の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を呼び出すことができるようにレイアウトが完了したときに知る方法はありますか?