Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6642616
  • 博文数量: 915
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8846
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Android平台

2018-02-05 21:08:13

格式化的文本
正如你所看到的,Label有一个Text属性,你可以设置为一个字符串。 但是Label也有一个替代的FormattedText属性,构造了一个格式不统一的段落。
FormattedText属性的类型是FormattedString,它具有类型IList 的Span属性,Span对象的集合。 每个Span对象都是统一格式的文本块,由六个属性管理:
  • Text
  • FontFamily
  • FontSize
  • FontAttributes
  • ForegroundColor
  • BackgroundColor
下面是一个实例化FormattedString对象的方法,然后将Span实例添加到它的Spanscollection属性中:

点击(此处)折叠或打开

  1. public class VariableFormattedTextPage : ContentPage
  2. {
  3.     public VariableFormattedTextPage()
  4.     {
  5.         FormattedString formattedString = new FormattedString();
  6.         formattedString.Spans.Add(new Span
  7.         {
  8.             Text = "I "
  9.         });
  10.         formattedString.Spans.Add(new Span
  11.         {
  12.             Text = "love",
  13.             FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)),
  14.             FontAttributes = FontAttributes.Bold
  15.         });
  16.         formattedString.Spans.Add(new Span
  17.         {
  18.             Text = " Xamarin.Forms!"
  19.         });
  20.         Content = new Label
  21.         {
  22.             FormattedText = formattedString,
  23.             HorizontalOptions = LayoutOptions.Center,
  24.             VerticalOptions = LayoutOptions.Center,
  25.             FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label))
  26.         };
  27.     }
  28. }
当每个跨度被创建时,它被直接传递给Spans集合的Add方法。 请注意,标签被赋予了NamedSize.Large的FontSize,而粗体设置的Span也被明确地赋予了相同的大小。 当一个范围给出一个FontAttributes设置时,它不会继承该标签的FontSize设置。
或者,也可以用一对花括号来初始化Spans集合的内容。 在这些大括号内,Span对象被实例化。 由于不需要方法调用,因此整个FormattedString初始化可以在Label初始化中发生:

点击(此处)折叠或打开

  1. public class VariableFormattedTextPage : ContentPage
  2. {
  3.     public VariableFormattedTextPage()
  4.     {
  5.         Content = new Label
  6.         {
  7.             FormattedText = new FormattedString
  8.             {
  9.                 Spans =
  10.                 {
  11.                     new Span
  12.                     {
  13.                         Text = "I "
  14.                     },
  15.                     new Span
  16.                     {
  17.                         Text = "love",
  18.                         FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)),
  19.                         FontAttributes = FontAttributes.Bold
  20.                     },
  21.                     new Span
  22.                     {
  23.                         Text = " Xamarin.Forms!"
  24.                     }
  25.                 }
  26.             },
  27.             HorizontalOptions = LayoutOptions.Center,
  28.             VerticalOptions = LayoutOptions.Center,
  29.             FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label))
  30.         };
  31.     }
  32. }
这是您将在本章的示例代码集合中看到的程序版本。 无论您使用哪种方法,下面是它的样子:

您还可以使用FormattedText属性在整个段落中嵌入斜体或粗体字,如VariableFormattedParagraph程序所示:

点击(此处)折叠或打开

  1. public class VariableFormattedParagraphPage : ContentPage
  2. {
  3.     public VariableFormattedParagraphPage()
  4.     {
  5.         Content = new Label
  6.         {
  7.             FormattedText = new FormattedString
  8.             {
  9.                 Spans =
  10.                 {
  11.                     new Span
  12.                     {
  13.                         Text = "\u2003There was nothing so "
  14.                     },
  15.                     new Span
  16.                     {
  17.                         Text = "very",
  18.                         FontAttributes = FontAttributes.Italic
  19.                     },
  20.                     new Span
  21.                     {
  22.                         Text = " remarkable in that; nor did Alice " +
  23.                         "think it so "
  24.                     },
  25.                     new Span
  26.                     {
  27.                         Text = "very",
  28.                         FontAttributes = FontAttributes.Italic
  29.                     },
  30.                     new Span
  31.                     {
  32.                         Text = " much out of the way to hear the " +
  33.                                "Rabbit say to itself \u2018Oh " +
  34.                                "dear! Oh dear! I shall be too late!" +
  35.                                "\u2019 (when she thought it over " +
  36.                                "afterwards, it occurred to her that " +
  37.                                "she ought to have wondered at this, " +
  38.                                "but at the time it all seemed quite " +
  39.                                "natural); but, when the Rabbit actually "
  40.                     },
  41.                     new Span
  42.                     {
  43.                         Text = "took a watch out of its waistcoat-pocket",
  44.                         FontAttributes = FontAttributes.Italic
  45.                     },
  46.                     new Span
  47.                     {
  48.                         Text = ", and looked at it, and then hurried on, " +
  49.                                "Alice started to her feet, for it flashed " +
  50.                                "across her mind that she had never before " +
  51.                                "seen a rabbit with either a waistcoat-" +
  52.                                "pocket, or a watch to take out of it, " +
  53.                                "and, burning with curiosity, she ran " +
  54.                                "across the field after it, and was just " +
  55.                                "in time to see it pop down a large " +
  56.                                "rabbit-hold under the hedge."
  57.                     }
  58.                 }  
  59.             },
  60.             HorizontalOptions = LayoutOptions.Center,
  61.             VerticalOptions = LayoutOptions.Center
  62.         };
  63.     }
  64. }
该段以em空格开始(Unicode \ u2003),并包含所谓的智能引号(\ u201C和\ u201D),并且几个单词以斜体表示:

您可以说服一个标签显示多行或段落插入行尾字符。 这是在NamedFontSizes程序中演示的。 将多个Span对象添加到foreach循环中的FormattedString对象。 每个Span对象使用不同的NamedFont值,并显示从Device.GetNamedSize返回的实际大小:

点击(此处)折叠或打开

  1. public class NamedFontSizesPage : ContentPage
  2. {
  3.     public NamedFontSizesPage()
  4.     {
  5.         FormattedString formattedString = new FormattedString();
  6.         NamedSize[] namedSizes =
  7.         {
  8.             NamedSize.Default, NamedSize.Micro, NamedSize.Small,
  9.             NamedSize.Medium, NamedSize.Large
  10.         };
  11.         foreach (NamedSize namedSize in namedSizes)
  12.         {
  13.             double fontSize = Device.GetNamedSize(namedSize, typeof(Label));
  14.             formattedString.Spans.Add(new Span
  15.             {
  16.                 Text = String.Format("Named Size = {0} ({1:F2})",
  17.                 namedSize, fontSize),
  18.                 FontSize = fontSize
  19.             });
  20.             if (namedSize != namedSizes.Last())
  21.             {
  22.                 formattedString.Spans.Add(new Span
  23.                 {
  24.                     Text = Environment.NewLine + Environment.NewLine
  25.                 });
  26.             }
  27.         }
  28.         Content = new Label
  29.         {
  30.             FormattedText = formattedString,
  31.             HorizontalOptions = LayoutOptions.Center,
  32.             VerticalOptions = LayoutOptions.Center
  33.         };
  34.     }
  35. }
请注意,单独的跨度包含两个平台特定的行尾字符串以间隔各行。 这确保行间距是基于默认字体大小,而不是刚刚显示的字体大小:

这些不是像素大小! 与iOS状态栏的高度一样,最好只是将这些尺寸模糊地称为某种“单位”。第5章将介绍一些额外的清晰度。
默认大小通常由操作系统选择,但其他大小由Xamarin.Forms开发人员选择。 在iOS上,默认值与“中”相同,但“Android默认值”与“小”相同,在Windows 10 Mobile上,“默认值”小于“微”。
iPad和Windows 10的尺寸分别与iPhone和Windows 10 Mobile相同。 但是,Windows 8.1和Windows Phone 8.1平台上的大小显示更多的差异:


当然,在单个Label中使用多个Span对象不是呈现多个文本段落的好方法。 而且,文本通常有很多段落,所以必须滚动。 这是下一章的工作,以及对StackLayout和ScrollView的探索。


阅读(2329) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~