Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ImageSource已在集合视图中加载_C#_Android_.net_Xamarin_Collectionview - Fatal编程技术网

C# ImageSource已在集合视图中加载

C# ImageSource已在集合视图中加载,c#,android,.net,xamarin,collectionview,C#,Android,.net,Xamarin,Collectionview,我正在开发一个应用程序,其中一个页面显示以前的照片和新照片,我可以从应用程序中拍摄。 我有一个可观察的集合,其中对象包含ImageSource try { if (SDCard.Updated || SDCard.FirstLoad) { List<MyObject> myObjects = (List <MyObject> )awai

我正在开发一个应用程序,其中一个页面显示以前的照片和新照片,我可以从应用程序中拍摄。 我有一个可观察的集合,其中对象包含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;
        }
试试看
{
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)。在添加新照片后,当应用程序再次访问页面时,会显示这张照片。显然是同一个物体。