【问题标题】:Issues with Xamarin Forms 4 (pre 4) using CollectionView in UWP project在 UWP 项目中使用 CollectionView 的 Xamarin Forms 4(pre 4)问题
【发布时间】:2019-07-24 10:36:04
【问题描述】:

我在尝试使用新的 CollectionView 时遇到了一些棘手的错误 在 Xamarin Forms 4 中实现的功能。在 Android 项目中,它非常有效 在 MainActivity.cs 中启用实验性功能之后很好:

global::Xamarin.Forms.Forms.SetFlags(new[] { "CollectionView_Experimental", "Shell_Experimental" });

xamarin 文档没有提供有关 UWP 项目的任何信息 所以首先当我尝试编译 UWP 项目时,它抛出了这个异常 当它试图渲染一个使用 CollectionView 的页面时

System.InvalidOperationException:

'您尝试使用的类、属性或方法('VerifyCollectionViewFlagEnabled') 是 CollectionView 的一部分;要使用它,您必须通过调用 Forms.SetFlags("CollectionView_Experimental") 选择加入 在调用 Forms.Init() 之前。'

所以我在调用之前尝试在 UWP 项目中调用 App.xaml.cs 中的 SetFlags 初始化组件()方法。所以这次它抛出了这个异常 它尝试加载包含CollectionView的页面:

System.NullReferenceException: '对象引用未设置为对象的实例。'

就像这个例子:

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 元素混乱 布局(无margin和padding,调用元素的ToString()方法 将其可视化在单元格内)。

[更新]

更新到Xamarin Forms4 pre 8后,异常消失了。

【问题讨论】:

  • 我很困惑。我以为 UWP 不支持 CollectionView
  • 由于XF最新更新,UWP也支持CollectionView

标签: c# xamarin.forms uwp


【解决方案1】:

我创建了一个包含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 更新到最新的预版本。

【讨论】:

  • 谢谢,SetFlags 运行良好,但 NRE 仍然存在。我更新了提供更多信息的问题
  • @BitZar,我在我的项目中使用了你的 ViewCell 布局,它可以工作。我认为问题出现在您的 ItemsSource 中。你能分享一个小样本吗?
  • 所以我花了很多时间搜索某种可能导致异常的空值,但我的模型没问题,所以我会用代码示例更新我的问题
  • @BitZar,可以分享一个可以重现此问题的示例项目吗?
  • 所以经过长时间的调试,在我的代码中搜索空引用,我什么也没找到。但是在更新到 Xamarin Forms 4 pre 8 之后,异常就消失了
【解决方案2】:
global::Xamarin.Forms.Forms.SetFlags(“CollectionView_Experimental”);

在 Android 中使用 MainActivity.cs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2016-12-02
    • 2017-10-16
    • 2019-08-11
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多