ListView 在 ScrollTo 时抛出 UnhandledException
ListView throws UnhandledException when ScrollTo
我有一个像这样的带有 ListView 的简单页面
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ListViewDemo.MainPage">
<StackLayout>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label Text="From" />
<DatePicker x:Name="fromPicker" Grid.Row="1" />
<Label Text="To" Grid.Column="1" />
<DatePicker x:Name="toPicker" Grid.Column="1" Grid.Row="1" />
</Grid>
<ListView>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label Text="{Binding FromDate}" />
<Label Text="{Binding ToDate}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
当日期更改时,我想滚动到最接近当前日期的事件,但是当我在 UWP 上使用 ScrollTo
时,我得到一个 UnhandledException
,而 iOS 只是不要滚动。
我正在考虑使用 ItemAppearing,但如果列表中的事件足够多,它是否值得信赖?
如果我使用 await Task.Delay(500)
,我不会得到 UnhandledException
,而是内容会跳到我的屏幕上。
这个问题有什么解决办法吗?
public void SetEvents(params CalenderEventDto[] events)
{
var dateToScrollTo = DateTime.Now.Date;
var scrollToEvent = events?.OrderBy(x => x.Start.Date)?.FirstOrDefault(c => c.Start.Date >= dateToScrollTo || c.End.Date >= dateToScrollTo );
var orderedEvents = events.GroupBy(x => x.Start.Date).OrderBy(x => x.Key);
_calendarEvents.Clear();
foreach (var groupedEvents in orderedEvents)
{
foreach (var calendarEvent in groupedEvents)
{
_calendarEvents.Add(calendarEvent);
}
}
//await Task.Delay(450);
Device.BeginInvokeOnMainThread(() => lstCalendar.ScrollTo(scrollToEvent, ScrollToPosition.Start, false));
}
编辑
我想通了,问题也出在 iOS
我想通了,如果我将 SetEvents
从构造函数移到 OnAppearing
就可以了
我有一个像这样的带有 ListView 的简单页面
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ListViewDemo.MainPage">
<StackLayout>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label Text="From" />
<DatePicker x:Name="fromPicker" Grid.Row="1" />
<Label Text="To" Grid.Column="1" />
<DatePicker x:Name="toPicker" Grid.Column="1" Grid.Row="1" />
</Grid>
<ListView>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label Text="{Binding FromDate}" />
<Label Text="{Binding ToDate}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
当日期更改时,我想滚动到最接近当前日期的事件,但是当我在 UWP 上使用 ScrollTo
时,我得到一个 UnhandledException
,而 iOS 只是不要滚动。
我正在考虑使用 ItemAppearing,但如果列表中的事件足够多,它是否值得信赖?
如果我使用 await Task.Delay(500)
,我不会得到 UnhandledException
,而是内容会跳到我的屏幕上。
这个问题有什么解决办法吗?
public void SetEvents(params CalenderEventDto[] events)
{
var dateToScrollTo = DateTime.Now.Date;
var scrollToEvent = events?.OrderBy(x => x.Start.Date)?.FirstOrDefault(c => c.Start.Date >= dateToScrollTo || c.End.Date >= dateToScrollTo );
var orderedEvents = events.GroupBy(x => x.Start.Date).OrderBy(x => x.Key);
_calendarEvents.Clear();
foreach (var groupedEvents in orderedEvents)
{
foreach (var calendarEvent in groupedEvents)
{
_calendarEvents.Add(calendarEvent);
}
}
//await Task.Delay(450);
Device.BeginInvokeOnMainThread(() => lstCalendar.ScrollTo(scrollToEvent, ScrollToPosition.Start, false));
}
编辑
我想通了,问题也出在 iOS
我想通了,如果我将 SetEvents
从构造函数移到 OnAppearing
就可以了