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

标签 c# xamarin.forms uwp

我在尝试使用新的 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/

相关文章:

xamarin - 如何使用 Xamarin Forms 更改导航页面标题的字体?

c# - 如何将对象作为可绑定(bind)属性传递给 Xamarin.Forms 自定义控件

c# - 保存访问 token 的安全位置?

C# UWP 应用程序调用了为不同线程编码的接口(interface)

c# - 警告 : MapServiceToken not specified

c# - 从特定字节读取 List<Byte>

c# - n维数组

c# - 使用 Layout = null 时丢失所有格式?

c# - Monitor.TryEnter 不起作用

xamarin - 为什么在 Xamarin.Forms Shell 中使用 ShellSection 时弹出窗口中不显示分隔符?