【发布时间】:2017-02-23 23:44:19
【问题描述】:
我有一个像这样的 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 上
【问题讨论】:
-
“未处理的异常”仅表示您没有捕获异常 - 如果您捕获了异常,它可能会提供问题描述。
-
我尝试用 try-catch 包围它,但没有成功。
-
除非真的有必要,否则不要使用
async void。它适用于事件和事件之类的方法。您无法从async void方法中捕获异常。事实上,根本没有异步代码,所以删除async修饰符或让它返回一个Task,您将能够捕获异常。 -
我在方法中添加了捕获(sorrunding
ScrollTo)。当我使用Task.Delay时,使用了async
标签: c# xamarin xamarin.ios uwp xamarin.uwp