簡體   English   中英

如何調試 Xamarin.Forms XAML

[英]How to debug Xamarin.Forms XAML

我發現 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 問題的最佳方法是什么?

現在我只是在評論內容,直到它開始工作。 這類似於在命令式代碼中放置打印語句。 聲明式代碼應該優於命令式代碼。

我究竟做錯了什么?

我發現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問題的最佳方法是什么? 現在,我只是將內容注釋掉,直到它開始起作用。 這類似於將打印語句放入命令性代碼中。 聲明性代碼應該比命令性代碼優越。 我究竟做錯了什么?

我發現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問題的最佳方法是什么? 現在,我只是將內容注釋掉,直到它開始起作用。 這類似於將打印語句放入命令性代碼中。 聲明性代碼應該比命令性代碼優越。 我究竟做錯了什么?

我通常有 2 個步驟

  1. 在后面的代碼中添加一個 try catch

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

    命名空間 TestApp.Views { 公共部分類 AssetsPage : ContentPage { public WelcomePage() { try { InitializeComponent(); } catch (Exception ex) { Debug.WriteLine(ex); } } } }

  2. 刪除代碼並繼續檢查問題是否消失

不是真正的神奇解決方案,但它最有幫助,尤其是當您有大量復雜的代碼時

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM