C# wpf中的屏幕事件
我有一个小的自定义控件,用于下载和显示联系人图像。它通过将自身添加到等待下载的静态图像队列中,确保一次只下载一个图像 可以得到相当长的联系人列表。因此,我希望它只在屏幕上实际可见时才进入下载队列(有一个默认图像) 我已经尝试将逻辑放入C# wpf中的屏幕事件,c#,.net,wpf,C#,.net,Wpf,我有一个小的自定义控件,用于下载和显示联系人图像。它通过将自身添加到等待下载的静态图像队列中,确保一次只下载一个图像 可以得到相当长的联系人列表。因此,我希望它只在屏幕上实际可见时才进入下载队列(有一个默认图像) 我已经尝试将逻辑放入Loaded事件中,覆盖OnRender和IsVisibleChanged事件,但似乎没有一个事件能满足我的需求 有什么建议吗 D.R 编辑: 这是一个WPF应用程序,很抱歉在此之前没有提及…如果您将某些系统控件(如ListView)的属性“VirtualMode”
Loaded
事件中,覆盖OnRender
和IsVisibleChanged
事件,但似乎没有一个事件能满足我的需求
有什么建议吗
D.R
编辑:
这是一个WPF应用程序,很抱歉在此之前没有提及…如果您将某些系统控件(如ListView)的属性“VirtualMode”设置为true并处理RetrieveVirtualItem事件,则该属性具有该属性。此事件调用当前可见的项目,您必须使用所需的数据(图像)填充这些项目。这样您就不需要一次填写所有项目。您是否考虑过使用a来提供该功能
<DataTemplate DataType="{x:Type vm:MyViewModel}">
<StackPanel Orientation="Horizontal">
<Image>
<Image.Source>
<PriorityBinding FallbackValue="{StaticResource ImgDownloading}">
<Binding Path="ImageSource" IsAsync="True" />
</PriorityBinding>
</Image.Source>
</Image>
<Label Content="{Binding Name}" />
</StackPanel>
</DataTemplate>
很抱歉,我应该更清楚地指定我正在使用的WPF标记。它不符合要求。WPF控件也支持虚拟模式。您在哪里显示此控件?如果它位于ListBox、ListView、ItemsControl等内部,则可以使用虚拟化items控件,并且在将项目滚动到视图中之前不会创建项目模板。如果它位于其他内容(如FlowDocument)中,则需要执行一些不同的操作。我将该功能封装在自定义控件中,这样我就可以更好地控制图像的下载方式,即如果我搜索“a”并返回500条联系人记录,当然,优先级绑定将尝试下载500个图像,而不仅仅是屏幕上当前可见的图像?您将让ImageSource
属性访问阻止资源以下载图像。该资源将一次处理一个加载。