我很好奇为什么x:String或其他可以在xaml打开和关闭选项卡中包含文本的原始类型。
如下图所示:
<x:String>String content here!</x:String>就像Xamarin.Forms的“标签”一样,它在类的顶部装饰了ContentProperty(“文本”),我们可以编写如下代码
<Label>Hello</Label>但是,在x:String标签中,我找不到任何装饰。
有人能帮我解决我的问题吗?
发布于 2021-07-20 03:35:02
让我们暂时忘掉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 properties.Thickness不是一个类。它是一个结构,因此它没有一个无参数的构造函数。那么,Xamarin如何决定哪些参数需要传递给它的constructor?现在您可以清楚地看到,ContentProperty属性并不是我们能够做的事情:<Thickness>1,1,1,1</Thickness>。在这里,Xamarin.Forms获取字符串值1,1,1,1并将其转换为Thickness的实例。这是通过TypeConverter在Xamarin.Forms中完成的。您可以通过在[TypeConverter(typeof(ThicknessTypeConverter))]结构上检查Thickness来验证这一点。
我认为Xamarin.Forms中内置的原语类型也是如此。例如,在编写<x:Boolean>True</x:Boolean>时,Xamarin.Forms接受字符串True并在其内部TypeConverter的帮助下将其转换为System.Boolean。
奖励:如果您想通过自己的自定义结构实现相同的行为(我认为类是不可能的),您可以这样做:
TypeConverter来指导Xamarin.Forms如何将字符串值转换为您的结构的实例:公共类MyPointConverter : Xamarin.Forms.TypeConverter { public重写对象ConvertFromInvariantString(string value) { var parts = value.Split(new[] { ',‘},StringSplitOptions.None);if (parts.Length != 2 value !int.TryParse(parts,out var x) \\x\x !int.TryParse(parts1,out var y)) {返回base.ConvertFromInvariantString(值);} var myPoint =新的MyPoint(x,y);返回myPoint;}
TypeConverterAttribute装饰您的结构,以显示可用于此类型的自定义TypeConverter:Xamarin.Forms.TypeConverter(typeof(MyPointConverter))公共结构MyPoint { public int X{ get;set;} public int Y{ get;set;} public MyPoint(int x,int y) { this.Y .x= x;this.Y.Y= y;}
1,5
https://stackoverflow.com/questions/68434562
复制相似问题