Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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# WinRT、ISupportIncrementalLoading、组和自适应行为_C#_Listview_Windows Runtime - Fatal编程技术网

C# WinRT、ISupportIncrementalLoading、组和自适应行为

C# WinRT、ISupportIncrementalLoading、组和自适应行为,c#,listview,windows-runtime,C#,Listview,Windows Runtime,我需要一些关于WinRT(UWP)、ISupportIncrementalLoading、ListView和自适应控件的帮助 我有一个带有属性“Items”的ViewModel,它是一个IncrementalLoadingCollection(一个从ObservableCollection继承并实现ISupportIncrementalLoading的类)。此集合通过调用Web服务来增加其项。集合中的项目数量很多,因此我希望我的ListView有一个虚拟化面板 webservice返回一个具有2

我需要一些关于WinRT(UWP)、ISupportIncrementalLoading、ListView和自适应控件的帮助

我有一个带有属性“Items”的ViewModel,它是一个IncrementalLoadingCollection(一个从ObservableCollection继承并实现ISupportIncrementalLoading的类)。此集合通过调用Web服务来增加其项。集合中的项目数量很多,因此我希望我的ListView有一个虚拟化面板

webservice返回一个具有2个属性的Foo对象:

string GroupName { get; }
string Content { get; }
我需要具有以下行为的自适应ListView:

在电话模式下(如果全局宽度小于600),我希望每个项目都有一个宽度拉伸,并为电话指定一个特定的ItemTemplate(Template1):

在tablet/pc模式下(如果全局宽度大于600),我希望每个标题都有一个宽度拉伸,并使用tablet的特定ItemTemplate(Template2)逐行显示多个项目。每个项目的宽度和行中项目的数量取决于全局宽度。如果全局宽度介于600和800之间,我希望按行拉伸两个项目。如果全局宽度大于800,我希望按行拉伸3个项目:

为了解决自适应问题,主ListView将ItemsWrapGrid作为ItemsPanel。我在名为AdaptiveItemWidth的静态计算属性上绑定每个项的宽度。此属性的计算取决于应用程序的宽度。如果应用程序处于手机模式,则AdaptiveItemWidth等于设备宽度。在平板电脑模式下,它更复杂,但它要么是设备宽度的一半、三分之一或四分之一。 以下是装订:

Width="{Binding AdaptiveItemWidth, Source={StaticResource LayoutAdapter}}"
我尝试了一些解决方案,但没有一个是好的

第一种解决方案 我有另一个名为GroupedItems的属性,每次项目向自身添加项目时都会刷新该属性。GroupedItems的定义如下:

return this.Items.GroupBy(i => i.GroupName);
然后我使用一个CollectionView,其IsGrouped=true

此解决方案不起作用,因为分组集合禁用ItemsWrapGrid的虚拟化

第二种解决方案 my ViewModel的属性项是一个IncrementalLoadingCollection。GroupedFoo有两个属性: 字符串组名{get;} ObservableCollection项{get;}

在每次调用LoadMoreItemsAsync时,我都创建GroupedFoo。如果集合中已经存在GroupName,我将在现有GroupedFoo中添加生成的GroupedFoo的所有项。例子: 如果我有:

现有项目:

{ GroupName: group1, Items: { Foo01, Foo02, Foo03 }}
{ GroupName: group2, Items: { Foo04, Foo05, Foo06 }}
{ GroupName: group1, Items: { Foo01, Foo02, Foo03 }}
{ GroupName: group2, Items: { Foo04, Foo05, Foo06, Foo07, Foo08, Foo09 }}
{ GroupName: group3, Items: { Foo10, Foo11, Foo12 }}
生成的项目:

{ GroupName: group2, Items: { Foo07, Foo08, Foo09 }}
{ GroupName: group3, Items: { Foo10, Foo11, Foo12 }}
我只回来 {GroupName:group3,项:{Foo10,Foo11,Foo12} 我将{Foo07,Foo08,Foo09}添加到GroupedFoo中GroupName为“group2”的现有项中。那么,我要这个:

现有项目:

{ GroupName: group1, Items: { Foo01, Foo02, Foo03 }}
{ GroupName: group2, Items: { Foo04, Foo05, Foo06 }}
{ GroupName: group1, Items: { Foo01, Foo02, Foo03 }}
{ GroupName: group2, Items: { Foo04, Foo05, Foo06, Foo07, Foo08, Foo09 }}
{ GroupName: group3, Items: { Foo10, Foo11, Foo12 }}
在XAML中,我有一个GroupedFoo模板,其中一个TextBlock用于GroupName属性,一个列表用于Items属性

这个解决方案有效,自适应也有效,但速度慢得令人难以置信

第三种解决方案 my ViewModel的属性项是一个IncrementalLoadingCollection。此集合可以有两种类型: 字符串表示标题,Foo表示项

然后,我在ListView上设置ItemTemplateSelector,根据这些类型为标题设置一个模板,为项目设置另一个模板

此解决方案比第二个更简单、更快,但它仅在电话模式下工作,并且仅在我将ItemsPanel更改为VirtualzingStackPanel时工作。在这个解决方案中,我不能有一个自适应行为

我尝试使用ItemsWrapGrid,但所有项目的大小都与电话模式下的标题相同。VariableSizedWrapGrid不能用作ListView的ItemsPanel,只能用于固定的项目大小

有什么想法吗