如何调试Xamarin.Forms XAML

frebpwbc  于 2023-03-06  发布在  其他
关注(0)|答案(3)|浏览(241)

我发现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语句放在命令式代码中。声明式代码应该优于命令式代码。
我哪里做错了?

tjvv9vkg

tjvv9vkg1#

是的,没有一个调试XAML的好方法。打开XAML编译会有帮助。它将你所有的窗体代码编译成IL,这使得它更快,并在编译时发现这类问题。你可能还想看看新的c#标记扩展。它们仍然是beta版,但它们允许你用完全智能的c#编写你的声明性用户界面。
此外,您可能希望从使用ListView切换到使用更新的CollectionView。它的性能更高,基本上是一个就地升级。更多信息here

bxgwgixi

bxgwgixi2#

这也让我犯了几次错误,我已经使用Xamarin.Forms三年了。
我在Twitter上提到了这个问题,并被要求在Github上提出这个问题。
https://github.com/xamarin/Xamarin.Forms/issues/1486
我添加了两个与你的相匹配的例子。如果你能想到更多的让我知道,我会添加他们。
让我们希望这个问题尽快得到解决。

7rfyedvj

7rfyedvj3#

我通常有两个步骤
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.删除代码并继续检查问题是否消失
这不是一个真正神奇的解决方案,但它帮助最大,特别是当您有大量复杂的代码时

相关问题