ListView 在 ScrollTo 时抛出 UnhandledException

Posted

技术标签:

【中文标题】ListView 在 ScrollTo 时抛出 UnhandledException【英文标题】:ListView throws UnhandledException when ScrollTo 【发布时间】: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 【参考方案1】:

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

【讨论】:

以上是关于ListView 在 ScrollTo 时抛出 UnhandledException的主要内容,如果未能解决你的问题,请参考以下文章

为啥进程列表时抛出 java.lang.UnsupportedOperationException [重复]

无法在 Flutter 中添加 ListView

std::getline 在遇到 eof 时抛出

DataAdapter 在填充 DataTable 时抛出错误

为啥 FtpWebRequest 恰好在长传输结束时抛出 WebException?

Spring / Hibernate - 删除实体时抛出 StaleStateException