如何调试Xamarin Forms XAML

时间:2017-07-08 23:26:03

标签: c# xaml xamarin xamarin.forms

我发现Xamarin Forms XAML非常令人沮丧。

如果我使用这种语法...

<ContentView.Resources>
    <local:MyConverter1 x:Key="MyConverter1"/>
</ContentView.Resources>

我将从InitializeComponent()获得System.NullReferenceException。堆栈跟踪或输出窗口或其他任何地方都没有告诉我什么是错的。注意:此语法在WPF中正常工作。

经过多次努力,我发现我需要这种语法......

<ContentView.Resources>
    <ResourceDictionary>
        <local:MyConverter1 x:Key="MyConverter1"/>
    </ResourceDictionary>
</ContentView.Resources>

同样适用于ListView DataTemplate。这会抛出空引用异常...

            <ListView.ItemTemplate>
                <DataTemplate>
                    <Label Text="{Binding Converter={StaticResource MyConverter1}}"/>
                </DataTemplate>
            </ListView.ItemTemplate>

因为正确的语法是这个......

            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Label Text="{Binding Converter={StaticResource MyConverter1}}"/>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>

此语法再次在WPF中正常工作。我完全意识到Xamarin Forms不是WPF,但每当我使用在WPF中有效的XAML构造时,我就会厌倦被空引用异常打孔。

调试Xamarin Forms XAML问题的最佳方法是什么?现在我只是简单地评论它,直到它开始工作。这类似于将打印语句放入命令式代码中。声明性代码应该优于命令式代码。我做错了什么?

2 个答案:

答案 0 :(得分:0)

这也使我绊倒了几次,而且我已经使用Xamarin.Forms 3年了。

我提到这是Twitter上的一个问题,并被要求将其作为Github上的问题提出。

https://github.com/xamarin/Xamarin.Forms/issues/1486

我添加了两个与你相配的例子。如果你能想到更多,请告诉我,我会添加它们。

让我们希望早日而不是晚些时候解决这个问题。

答案 1 :(得分:0)

是的,实际上并没有调试XAML的好方法。开启Xaml编译会有所帮助。它会将您所有的表单代码编译为IL,从而使其速度更快,并在编译时发现此类问题。您可能还需要研究新的c#标记扩展。它们仍处于测试阶段,但是它们使您可以使用完整的intellisense以纯正的C#编写声明性ui。

此外,您可能希望从使用ListView切换到使用较新的CollectionView。它的性能更高,并且基本上是就地升级。更多信息here