XAML Xamarin表单集合视图滚动到加载时不工作

wz1wpwve  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(169)

我有一个使用CollectionView的XAML表单。我将视图绑定到一个日期对象集合。我在代码隐藏中设置SelectedItem,它按预期工作。然后我尝试在代码隐藏中使用ScrollTo,但它总是在页面加载后显示集合中的第一个项目。页面加载后,我连接了一个图像以激发ScrollTo事件,它按预期工作。以下是我的代码。提前感谢您的帮助!

'''
        for (int i = 0; i < 31 ; i++)
        {
            ScheduleDate date = new ScheduleDate();
            date._Date = dt.AddDays(i);
            colDates.Add(date);
        }

        cvDate.ItemsSource = colDates;
        cvDate.SelectedItem = colDates[10];
        cvDate.ScrollTo(cvDate.SelectedItem, null, ScrollToPosition.Start, true)
'''

XAML表单

'''
            <CollectionView x:Name="cvDate" Grid.Row="0" Grid.Column="1" 
                SelectionMode="Single" >
                <CollectionView.ItemsLayout>
                    <LinearItemsLayout Orientation="Horizontal"  />
                </CollectionView.ItemsLayout>
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <Label Text="{Binding Description}"
                                            FontAttributes="Bold"
                                            FontSize="Large"
                                            HorizontalOptions="Center"
                                            VerticalOptions="Center"
                                            />
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
'''

编辑:
我连接了OnCollectionViewScrolled事件,当从OnAppearing()执行以下代码行时
cvDate.滚动到(cvDate.选定项,空,滚动到位置.开始,假);
OnCollectionViewScrolled没有被调用。但是,当我从按钮单击事件执行同一行代码时,OnCollectionViewScrolled被激发。

bis0qfac

bis0qfac1#

我不知道你的Description_Date是什么,我举个简单的例子供你参考。
1.触发OnAppearing重写方法中的ScrollTo:

protected override void OnAppearing()
 {
    cvDate.ScrollTo(cvDate.SelectedItem, null, ScrollToPosition.Start, false);
 }

1.使用按钮单击方法触发ScrollTo:

private void Button_Clicked(object sender, EventArgs e)
 {
     cvDate.ScrollTo(cvDate.SelectedItem, null, ScrollToPosition.Start, false);
 }

完整代码:

public partial class Page4 : ContentPage
{
    public ObservableCollection<ScheduleDate> colDates { get; set; }
    public Page4()
    {
        InitializeComponent();

        colDates = new ObservableCollection<ScheduleDate>();
        for (int i = 0; i < 31; i++)
        {
            ScheduleDate date = new ScheduleDate();
            date.Description = i.ToString();
            colDates.Add(date);
        }

        cvDate.ItemsSource = colDates;
        cvDate.SelectedItem = colDates[10];
      

    }
    protected override void OnAppearing()
    {
       cvDate.ScrollTo(cvDate.SelectedItem, null, ScrollToPosition.Start, false);

    }
    private void Button_Clicked(object sender, EventArgs e)
    {
        //cvDate.ScrollTo(cvDate.SelectedItem, null, ScrollToPosition.Start, false);
    }
}
public class ScheduleDate
{
    public string Description { get; set; }
}

截图:

更新日期:

<ContentPage.Content>

    <StackLayout>
        <CollectionView
        x:Name="cvDate"
        ItemsSource="{Binding colDates}"
        SelectionMode="Single">
            <CollectionView.ItemsLayout>
                <LinearItemsLayout Orientation="Horizontal" />
            </CollectionView.ItemsLayout>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Label
                    FontAttributes="Bold"
                    FontSize="Large"
                    HorizontalOptions="Center"
                    Text="{Binding Description}"
                    VerticalOptions="Center" />
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
        <Button Clicked="Button_Clicked"></Button>
    </StackLayout>

</ContentPage.Content>
pn9klfpd

pn9klfpd2#

我相信至少在UWP上,你不能滚动到一个元素,直到它实际上被UI加载。
在这种情况下,您可以使用CollectionView自定义呈现器来解决此问题。
你可以覆盖ItemsViewRenderer.ScrollTo函数并延迟滚动直到目标元素被加载,要知道何时发生,你可以注册到ListViewBase.ContainerContentChanging事件。

相关问题