我在尝试使用新的 CollectionView 时遇到了一些棘手的错误
在 Xamarin Forms 4 中实现的功能。在 Android
项目中它非常有效
在 MainActivity.cs 中启用实验性功能后:
global::Xamarin.Forms.Forms.SetFlags(new[] { "CollectionView_Experimental", "Shell_Experimental" });
但是 xamarin
文档没有提供任何关于 UWP 项目的信息
所以首先当我尝试编译 UWP 项目时,它抛出了这个异常
当它尝试呈现使用 CollectionView 的页面时
System.InvalidOperationException:
'The class, property, or method you are attempting to use ('VerifyCollectionViewFlagEnabled') is part of CollectionView; to use it, you must opt-in by calling Forms.SetFlags("CollectionView_Experimental") before calling Forms.Init().'
所以我在调用之前尝试在UWP项目的App.xaml.cs中调用SetFlags
初始化组件() 方法。所以这次它抛出了这个异常
它尝试加载包含 CollectionView
的页面:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
就像这个例子:
await Navigation.PushAsync(new PageWithCollectionView());
成功执行 PageWithCollectionView 构造函数后抛出异常。
谁能帮我解决这个问题?
更新
好的,所以在 UWP 项目的 App.xaml.cs 中添加 SetFlags 是可行的,并且 CollectionView 得到正确初始化。但是 NRE 仍然存在 (在 Android 上,CollectionView 可以正常工作),同时尝试获取 摆脱这个问题我注意到它是在我尝试以这种方式嵌套 XAML 布局时引起的:
<CollectionView SelectionMode="Single">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Horizontal"
Span="2"/>
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<StackLayout Orientation="Vertical"
Grid.Column="0"
Grid.Row="0">
<Label Text="{Binding Title}"/>
</StackLayout>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
如果我从 CollectionView.ItemTemplate 中删除所有 DataTemplate,只需 像这样留空:
<CollectionView SelectionMode="Single">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Horizontal"
Span="2"/>
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
页面呈现为 CollectionView
,显示 ItemSource 元素杂乱无章
布局(没有边距和填充,并调用元素的 ToString()
方法
使其在细胞内可视化)。
[更新]
更新到 Xamarin Forms
4 pre 8 后,异常消失了。
最佳答案
我创建了一个包含 CollectionView
的代码示例.根据文档,我们需要在 App.xaml.cs 文件中的 Xamarin.Forms.Forms.Init(e)
之前调用 SetFlag
,如下所示。
........
Xamarin.Forms.Forms.SetFlags("CollectionView_Experimental");
Xamarin.Forms.Forms.Init(e);
........
实现 CollectionView
<CollectionView>
<CollectionView.ItemsSource>
<x:Array Type="{x:Type x:String}">
<x:String>Baboon</x:String>
<x:String>Capuchin Monkey</x:String>
<x:String>Blue Monkey</x:String>
<x:String>Squirrel Monkey</x:String>
<x:String>Golden Lion Tamarin</x:String>
<x:String>Howler Monkey</x:String>
<x:String>Japanese Macaque</x:String>
</x:Array>
</CollectionView.ItemsSource>
</CollectionView>
而且效果很好,对于NullReferenceException
问题,你需要检查后面的代码中是否有空对象。 CollectionView 的简单实现不会导致此类错误。
更新
请尝试将 Xamarin Forms 4 更新到最新的预版本。
关于c# - 在 UWP 项目中使用 CollectionView 的 Xamarin Forms 4(pre 4)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54960815/