c#-在UWP项目中使用CollectionView的Xamarin Forms 4(pre 4)问题
作者:互联网
您好,我在尝试使用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元素(不带边距和填充,并调用element的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问题,您需要检查后面的代码中是否存在null对象. CollectionView的简单实现不会导致此类错误.
更新资料
请尝试将Xamarin Forms 4更新到最新的预版本.
标签:uwp,xamarin-forms,c 来源: https://codeday.me/bug/20191211/2105967.html