我发现Xamarin.formsXAML非常令人沮丧。
如果我使用这个语法...
<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数据模板也是如此。这将引发空引用异常...
<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>
我完全意识到Xamarin.Forms不是WPF,但是每当我使用在WPF中有效的XAML构造时,我就厌倦了被空引用异常所欺骗。
调试Xamarin.Forms XAML问题的最佳方法是什么?
现在我只是简单地注解掉一些东西,直到它开始工作。这类似于把print语句放在命令式代码中。声明式代码应该优于命令式代码。
我哪里做错了?
3条答案
按热度按时间tjvv9vkg1#
是的,没有一个调试XAML的好方法。打开XAML编译会有帮助。它将你所有的窗体代码编译成IL,这使得它更快,并在编译时发现这类问题。你可能还想看看新的c#标记扩展。它们仍然是beta版,但它们允许你用完全智能的c#编写你的声明性用户界面。
此外,您可能希望从使用ListView切换到使用更新的CollectionView。它的性能更高,基本上是一个就地升级。更多信息here。
bxgwgixi2#
这也让我犯了几次错误,我已经使用Xamarin.Forms三年了。
我在Twitter上提到了这个问题,并被要求在Github上提出这个问题。
https://github.com/xamarin/Xamarin.Forms/issues/1486
我添加了两个与你的相匹配的例子。如果你能想到更多的让我知道,我会添加他们。
让我们希望这个问题尽快得到解决。
7rfyedvj3#
我通常有两个步骤
1.在代码隐藏中添加try catch
1.删除代码并继续检查问题是否消失
这不是一个真正神奇的解决方案,但它帮助最大,特别是当您有大量复杂的代码时