【问题标题】:How to debug Xamarin.Forms XAML如何调试 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}"。但是,在我明白你所说的空引用是什么意思之前,我不能说太多了

标签: c# xaml xamarin xamarin.forms


【解决方案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】:

      我通常有两个步骤

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-31
        • 2016-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 2021-02-04
        • 2020-10-19
        相关资源
        最近更新 更多