如何调试 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 中制作的 IOS 应用程序