C# ImageSource已在集合视图中加载
我正在开发一个应用程序,其中一个页面显示以前的照片和新照片,我可以从应用程序中拍摄。 我有一个可观察的集合,其中对象包含ImageSourceC# ImageSource已在集合视图中加载,c#,android,.net,xamarin,collectionview,C#,Android,.net,Xamarin,Collectionview,我正在开发一个应用程序,其中一个页面显示以前的照片和新照片,我可以从应用程序中拍摄。 我有一个可观察的集合,其中对象包含ImageSource try { if (SDCard.Updated || SDCard.FirstLoad) { List<MyObject> myObjects = (List <MyObject> )awai
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;
}
试试看
{
if(SDCard.Updated | | SDCard.FirstLoad)
{
List myObjects=(List)wait DataStore.GetItemsAsync(true);
MyObservableCollection.Clear();
foreach(myObjects中的var myObject)
{
MyObservableCollection.Add(myObject);
}
}
}
捕获(例外情况除外)
{
Debug.WriteLine(ex);
}
最后
{
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没有被修改
我重复一遍:问题是,每次在应用程序使用过程中添加新的光源时,应用程序似乎都会刷新。如果我关闭应用程序,重新启动它,然后转到页面:只有一个加载效果,nexts访问是流动的(已经加载了photosources)。在我详细观看了从内存加载的项目(以前的照片)和新项目(从应用程序中拍摄)如何在pined spy mini windows中列出Visual Studio后,我观察到: 从内存ImageSource属性加载的项: PhotoSource(ImageSource)具有文件属性。 最近添加的新项目没有“文件”属性。 解释如下: 我新添加的item.ImageSource属性是由生成的
ImageSource.FromStream(() => { return mediaFile.GetStream(); });
在何处使用我加载的Item.ImageSource生成依据
ImageSource.FromPath(stringPath);
当我将新item.ImageSource初始化更改为ImageSource.FromPath(stringPath)时,“闪烁/加载延迟”消失
我不知道ImageSource.FromStream()初始化为什么会遇到这种行为,并且不会构建新ImageSource对象的“File”属性,但这是我的问题的原因。也许您可以尝试“Singleton模式”。创建视图单例以确保始终访问同一视图实例,而不是创建新实例。谢谢@KyleWang MSFT。你认为在Xamarin中有一个简单的方法来检查这一点吗?因为我认为事实上已经是这样了:从堆栈中调用相同的视图(App.Current.MainPage.Navigation.ModalStack中的内容)。每次应用程序访问页面时,我都可以跟踪IsAppearing方法。您可以通过向实例添加GUID来检测它。我在页面构造函数00001ba6-0002-0003-0102-0405010020405中添加了GUID(带有随机数部分:这里是00001ba6)。在添加新照片后,当应用程序再次访问页面时,会显示这张照片。显然是同一个物体。