[英]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
分配給它的一個屬性。 有兩個問題:
Thickness
沒有字符串屬性來接受逗號分隔的值並初始化其Bottom
、 Right
、 Top
、 Left
屬性。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
。
獎勵:如果您想使用自己的自定義結構實現相同的行為(我認為類不可能),您可以執行以下操作:
創建自定義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; } }
使用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; } }
在 Xaml 中創建結構的實例:
<ResourceDictionary> <local:MyPoint x:Key="MyPoint">1,5</local:MyPoint> </ResourceDictionary>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.