如何调试 Xamarin.Forms XAML

Posted

技术标签:

【中文标题】如何调试 Xamarin.Forms XAML【英文标题】:How to debug Xamarin.Forms XAML 【发布时间】:2017-12-12 23:35:57 【问题描述】:

我发现 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 问题的最佳方法是什么?

现在我只是在评论一些东西,直到它开始工作。这类似于将打印语句放入命令式代码中。声明式代码应该优于命令式代码。

我做错了什么?

【问题讨论】:

当有一本关于这个主题的免费和伟大的书时,developer.xamarin.com/guides/xamarin-forms/…我想知道你为什么坚持通过犯一些简单的错误来学习这项技术。没有简单的调试方法,但如果您确实按照提示进行操作,大多数问题一开始都不会发生。 启用 XAML 编译将在构建时捕获其中一些问题:developer.xamarin.com/guides/xamarin-forms/xaml/xamlc 你能详细描述一下This throws null reference exception...的意思吗 你可以在你的转换器中设置一个断点,但我需要知道你所说的话是什么意思(见上面的评论) 还要确保你有这个:xmlns:local="clr-namespace:ProperNameSpace;assembly=ProperAssembly"。但是,在我明白你所说的空引用是什么意思之前,我不能说太多了 【参考方案1】:

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

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

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

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

希望这个问题早日得到解决。

【讨论】:

【参考方案2】:

是的,确实没有调试 XAML 的好方法。打开 Xaml 编译会有所帮助。它将所有表单代码编译到 IL 中,这使得它更快,并在编译时发现这些类型的问题。您可能还想查看新的 c# 标记扩展。它们仍处于测试阶段,但它们可让您使用完全智能的 C# 编写声明式 ui。

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

【讨论】:

【参考方案3】:

我通常有两个步骤

    在后面的代码中添加一个 try catch

    使用系统; 使用 System.Diagnostics; 使用 Xamarin.Forms;

    命名空间 TestApp.Views 公共部分类 AssetsPage : ContentPage 公共欢迎页面() 尝试 初始化组件(); 捕捉(例外前) Debug.WriteLine(ex);

    删除代码并继续检查问题是否消失

并不是真正的神奇解决方案,但它最有帮助,尤其是当您拥有大量复杂代码时

【讨论】:

以上是关于如何调试 Xamarin.Forms XAML的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 VS for Xamarin.Forms UWP 应用程序上的调试错误?

Xamarin.Forms 调试

无法调试在 Xamarin.Forms 中制作的 IOS 应用程序

更改 Xamarin.Forms 项目代码后,我无法在 Iphone 上进行调试

Xamarin Forms UWP - 无法调试共享代码

我怎么看我的代码如何执行xamarin.forms