【问题标题】:ImageSource already loaded blink in Collection ViewImageSource 已在 Collection View 中加载闪烁
【发布时间】: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


【解决方案1】:

在我详细查看了从内存加载的项目(以前的照片)和新的项目(从应用程序中获取)如何在 pined spy 迷你窗口中列出 Visual Studio 之后,我观察到了这一点:

从内存 ImageSource 属性加载的项目: Item.PhotoSource(ImageSource) 有一个 File 属性。

而最近添加的新项目没有“文件”属性。

还有解释:

我新添加的 item.ImageSource 属性是由构建的

ImageSource.FromStream(() => { return mediaFile.GetStream(); });

而我的 Loaded Item.ImageSource 构建者

ImageSource.FromPath(stringPath);

当我将新 item.ImageSource 初始化更改为 ImageSource.FromPath(stringPath) 时,“闪烁/加载延迟”消失了。

我不知道为什么 ImageSource.FromStream() 初始化会遇到这种行为并且没有构建新 ImageSource 对象的“文件”属性,但这是我的问题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 2012-02-05
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多