如何调试Xamarin.Forms XAML

8

我发现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问题?

目前,我只是将一些内容注释掉,直到它开始工作。这类似于在命令式代码中放置打印语句。声明式代码应该比命令式代码更好。

我做错了什么?


当有一本免费而优秀的书籍涉及这个主题时,https://developer.xamarin.com/guides/xamarin-forms/creating-mobile-apps-xamarin-forms/我想知道为什么你坚持通过犯简单错误来学习这项技术。没有简单的调试方法,但如果你遵循提示,大多数问题不会在最初发生。 - Lex Li
10
启用XAML编译可以在构建时捕获其中的一些问题:https://developer.xamarin.com/guides/xamarin-forms/xaml/xamlc/。 - Jason
你能更详细地描述一下,“这会抛出空引用异常”的意思吗? - jdmdevdotnet
你可以在转换器中设置断点,但是我需要知道你上面所说的意思(参见上面的评论)。 - jdmdevdotnet
好的,听起来你的XAML中没有这一行代码。xmlns:local="clr-namespace:{ProperNameSpace};assembly={Prope‌​rAssembly}" 你能确认一下你是否有这个代码吗? - jdmdevdotnet
显示剩余8条评论
3个回答

1

是的,调试XAML没有一个好的方法。开启Xaml编译会有所帮助。它将所有表单代码编译为IL,使其更快,并在编译时发现此类问题。您还可以查看新的C#标记扩展。它们仍处于测试版,但可以让您使用完整的智能感知直接用C#编写声明性UI。

另外,您可能希望从使用ListView切换到使用更新的CollectionView。它的性能要更好,基本上是一种就地升级。更多信息在这里


0

这个问题也曾经让我困扰过几次,而我已经使用Xamarin.Forms三年了。

我在Twitter上提到了这个问题,并被要求在Github上提出它。

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

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

希望这能尽快得到修复。


0

通常我有两个步骤

  1. 在代码后端添加try-catch
    using System;
    using System.Diagnostics;
    using Xamarin.Forms;
    
    namespace TestApp.Views
    {
        public partial class AssetsPage : ContentPage
        {
            public WelcomePage()
            {
                try
                {
                    InitializeComponent();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex);
                }
            }
        }
    }
  1. 移除代码并继续检查问题是否解决

这并不是一个神奇的解决方案,但在处理大量复杂代码时尤其有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接