【问题标题】:ListView throws UnhandledException when ScrollToListView 在 ScrollTo 时抛出 UnhandledException
【发布时间】: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


【解决方案1】:

我发现,如果我将 SetEvents 从构造函数移到 OnAppearing 它可以工作

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2017-12-14
    • 2013-12-14
    • 1970-01-01
    相关资源
    最近更新 更多