簡體   English   中英

Xamarin.Forms - XAML 中 x:String 中包含文本的機制

[英]Xamarin.Forms - The mechanism about text contain in x:String in XAML

我很好奇為什么 x:String 或其他可以在 xaml 打開和關閉選項卡中包含文本的原始類型。

顯示如下代碼:

    <x:String>String content here!</x:String>

像 Xamarin.Forms "Label" 一樣,它在類的頂部裝飾了 [ContentProperty("Text")],我們可以這樣寫代碼

   <Label>Hello</Label>

但是,在 x:String 標簽中,我找不到任何裝飾。

誰能幫我解決我的問題?

讓我們暫時忘記x:String並專注於Thickness 顯然,您可以通過這種方式創建一個Thickness實例:

<Thickness>1,1,1,1</Thickness>

現在,讓我們將其與創建Label進行比較:

<Label>Hello</Label>

盡管兩條線看起來相似,但它們在做不同的事情。 使用Label ,它創建一個Label實例(使用默認的無參數構造函數)並將Hello分配給它的Text屬性(按照Label類的[ContentProperty("Text")]屬性的指示)。 但對於Thickness ,情況並非如此。 您不能只是創建一個Thickness的實例並將值1,1,1,1分配給它的一個屬性。 有兩個問題:

  1. Thickness沒有字符串屬性來接受逗號分隔的值並初始化其BottomRightTopLeft屬性。
  2. 更糟糕的是, Thickness不是一個類。 它是一個結構體,因此它沒有無參數的構造函數。 那么 Xamarin 如何決定哪些參數需要傳遞給它的構造函數呢?

現在您可以清楚地看到ContentProperty屬性不是讓我們能夠做到的: <Thickness>1,1,1,1</Thickness> 此處 Xamarin.Forms 采用字符串值1,1,1,1並將其轉換為Thickness的實例。 這是通過 Xamarin.Forms 中的TypeConverter完成的。 您可以通過檢查Thickness結構上的[TypeConverter(typeof(ThicknessTypeConverter))]來驗證這一點。

我認為這個想法與 Xamarin.Forms 中的內置原始類型相同。 例如,當您編寫<x:Boolean>True</x:Boolean> ,Xamarin.Forms 會采用字符串True並在其內部TypeConverter的幫助下將其轉換為System.Boolean

獎勵:如果您想使用自己的自定義結構實現相同的行為(我認為類不可能),您可以執行以下操作:

  1. 創建自定義TypeConverter以指示Xamarin.Forms如何將字符串值轉換為結構的實例:

     public class MyPointConverter : Xamarin.Forms.TypeConverter { public override object ConvertFromInvariantString(string value) { var parts = value.Split(new[] { ',' }, StringSplitOptions.None); if (parts.Length != 2 || !int.TryParse(parts[0], out var x) || !int.TryParse(parts[1], out var y)) { return base.ConvertFromInvariantString(value); } var myPoint = new MyPoint(x, y); return myPoint; } }
  2. 使用TypeConverterAttribute裝飾您的結構以顯示可用於此類型的自定義TypeConverter

     [Xamarin.Forms.TypeConverter(typeof(MyPointConverter))] public struct MyPoint { public int X { get; set; } public int Y { get; set; } public MyPoint(int x, int y) { this.X = x; this.Y = y; } }
  3. 在 Xaml 中創建結構的實例:

     <ResourceDictionary> <local:MyPoint x:Key="MyPoint">1,5</local:MyPoint> </ResourceDictionary>

暫無
暫無

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

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