您好,我在尝试使用Xamarin Forms 4中实现的新CollectionView功能时遇到了一些棘手的错误。 在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().'
因此,我尝试在调用InitializeComponent()方法之前在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后,该异常消失了
答案 0 :(得分:1)
我创建了一个包含CollectionView
的代码示例。根据该文档,我们需要像下面这样在App.xmal.cs文件中的SetFlag
之前调用Xamarin.Forms.Forms.Init(e)
。
......
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 更新到最新的先前版本。
答案 1 :(得分:0)
global::Xamarin.Forms.Forms.SetFlags(“CollectionView_Experimental”);
在Android中使用MainActivity.cs