首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin.Forms - XAML中关于x:String中文本包含的机制

Xamarin.Forms - XAML中关于x:String中文本包含的机制
EN

Stack Overflow用户
提问于 2021-07-19 02:38:38
回答 1查看 277关注 0票数 0

我很好奇为什么x:String或其他可以在xaml打开和关闭选项卡中包含文本的原始类型。

如下图所示:

代码语言:javascript
复制
    <x:String>String content here!</x:String>

就像Xamarin.Forms的“标签”一样,它在类的顶部装饰了ContentProperty(“文本”),我们可以编写如下代码

代码语言:javascript
复制
   <Label>Hello</Label>

但是,在x:String标签中,我找不到任何装饰。

有人能帮我解决我的问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-20 03:35:02

让我们暂时忘掉x:String,关注Thickness。显然,您可以这样创建Thickness的实例:

代码语言:javascript
复制
<Thickness>1,1,1,1</Thickness>

现在,让我们将其与创建一个Label进行比较

代码语言:javascript
复制
<Label>Hello</Label>

虽然这两行看起来很相似,但它们在做不同的事情。使用Label,它创建一个Label实例(使用默认的无参数构造函数),并将Hello分配给它的Text属性(按照Label类上的[ContentProperty("Text")]属性的指示)。但Thickness的情况并非如此。您不能只创建Thickness的实例并将值1,1,1,1分配给其属性之一。有两个问题:

  1. Thickness没有一个字符串属性来接受逗号分隔的值并初始化它的BottomRightTopLeft properties.
  2. Even -更糟的是,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

奖励:如果您想通过自己的自定义结构实现相同的行为(我认为类是不可能的),您可以这样做:

  1. 创建一个自定义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;}

  1. 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. 在Xaml中创建结构实例:

1,5

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68434562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档