在UWP项目中使用CollectionView的Xamarin Forms 4(pre 4)问题

时间:2019-03-02 16:55:06

标签: c# xamarin.forms uwp

您好,我在尝试使用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后,该异常消失了

2 个答案:

答案 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