【发布时间】:2021-05-15 14:43:06
【问题描述】:
我正在开发一个应用程序,其中一个页面显示以前的照片和我可以从应用程序拍摄的新照片。 我有一个 ObservableCollection,其中对象包含 ImageSource。
try
{
if (SDCard.Updated || SDCard.FirstLoad)
{
List<MyObject> myObjects = (List <MyObject> )await DataStore.GetItemsAsync(true);
MyObservableCollection.Clear();
foreach (var myObject in myObjects)
{
MyObservableCollection.Add(myObject);
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
finally
{
if(IsBusy==true)
IsBusy = false;
}
绑定在 CollectionView 中。
<CollectionView x:Name="ItemsListView" ItemsLayout="HorizontalList"
ItemsSource="{Binding MyObservableCollection}"
SelectionMode="None">
<CollectionView.ItemTemplate>
<DataTemplate>
<RelativeLayout x:DataType="model:MyObject">
<Image Source="{Binding PhotoSource}" BackgroundColor="AliceBlue" Aspect="AspectFill" RelativeLayout.WidthConstraint=
"{ConstraintExpression Type=RelativeToParent, Property=Width}" RelativeLayout.HeightConstraint=
"{ConstraintExpression Type=RelativeToParent, Property=Height}"/>
...
PhotoSource 是一个 ImageSource 属性。 从应用程序拍摄新照片后,我将其保存在应用程序中(在 Application.Current.Properties 中)。 然后,当我返回此页面时,“try{}”部分使用保存的数据重建了 ObservableCollection,因此 CollectionView 被更新(在照片加载期间有一点延迟/闪烁)。
问题是:在此之后,即使我不重新加载链接的 ObservableCollection,每当我进入显示总照片列表的页面时,该应用程序似乎总是“重新加载”照片。存在延迟(在我的 Android 手机上测试的 .APK 上)或闪烁(来自 Android 模拟器)。
有人遇到过这个问题吗?
- 当我打开应用程序时,照片页面会加载已保存的照片,并且只有 1 个“加载效果”(短暂延迟/闪烁)。如果我再回到那里,它不会加载并且直接显示图像。
- 我在我的重新加载列表函数中添加了断点,以确保在我添加新照片后,每次访问此页面时都不会重新加载列表,因此我可以确认 ObservableCollection 在我返回时没有被修改页面。
我重复一遍:问题是在使用应用程序期间,每次添加新的 PhotoSource 时,应用程序似乎都会刷新。如果我关闭应用程序,重新启动它,然后转到页面:有一个单一的加载效果,并且接下来的访问是流畅的(照片源已经加载)。
【问题讨论】:
-
也许你可以试试“单例模式”。创建一个视图单例以确保始终访问同一个视图实例,而不是创建一个新实例。
-
谢谢@KyleWang-MSFT。您是否考虑过在 Xamarin 中进行检查的简单方法?因为我认为实际上已经如此:从堆栈(App.Current.MainPage.Navigation.ModalStack 内部的东西)调用相同的视图。每次app访问页面,我都可以追踪IsAppearing方法。
-
您可以通过向实例添加 GUID 来检测它。
-
我在页面构造函数中添加了一个 GUID(带有随机数部分:00001ba6):00001ba6-0002-0003-0102-040501020405。添加新照片后,当应用程序再次访问页面时,就会显示这个。显然是同一个对象。
标签: c# android .net xamarin collectionview