У меня есть простая страница с таким 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>
Когда дата изменена, я хочу прокрутить до события, которое ближе всего к текущей дате, но я получаю UnhandledException
, когда использую ScrollTo
в UWP, а 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));
}
EDIT
Я выяснил, что проблема и в iOS.
async void
без крайней необходимости. Он предназначен для событий и методов, подобных событиям. Вы не можете перехватывать исключения из методаasync void
. На самом деле асинхронного кода вообще нет, поэтому удалите модификаторasync
или заставьте его возвращатьTask
, и вы сможете перехватить исключение. - person Krumelur   schedule 14.10.2016ScrollTo
). Был использованasync
, когда я использовалTask.Delay
- person Lasse Madsen   schedule 17.10.2016