1. 程式人生 > >背水一戰 Windows 10 (27) - 控件(文本類): TextBlock

背水一戰 Windows 10 (27) - 控件(文本類): TextBlock

放大 part psi abcdefg -c 控件 ring pri stat

原文:背水一戰 Windows 10 (27) - 控件(文本類): TextBlock

[源碼下載]


背水一戰 Windows 10 (27) - 控件(文本類): TextBlock



作者:webabcd


介紹
背水一戰 Windows 10 之 控件(文本類)

  • TextBlock



示例
1、TextBlock 的示例 1
Controls/TextControl/TextBlockDemo1.xaml

<Page
    x:Class="Windows10.Controls.TextControl.TextBlockDemo1"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.Controls.TextControl" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable
="d"> <Grid Background="Transparent"> <StackPanel Margin="10 0 10 10"> <!-- TextBlock 的常用屬性 Text - 顯示的文本,如果需要顯示引號等特殊字符需要使用相應的 HTML 編碼 Foreground - 文本顏色 FontFamily - 首選字體,多個用“,”分隔,找不到第 1 個就用第 2 個,找不到第 2 個就用第 3 個,以此類推 FontSize - 字號大小(單位:像素) FontWeight - 字體粗細(FontWeights 實體類),默認值是 Normal FontStyle - 字體樣式(FontStyle 枚舉),默認值是 Normal Italic - 使用字體自帶的斜體 Oblique - 通過程序讓正常字體傾斜(對於自身不帶斜體的字體可以使用此值讓字體傾斜) FontStretch - 字體的拉伸值(FontStretch 枚舉),默認值是 Normal(大部分字體都不支持這個屬性) Padding - Padding IsTextScaleFactorEnabled - 是否啟用文本自動放大功能(默認值是 true) 在“設置”->“輕松使用”中可以調整文本縮放大小,IsTextScaleFactorEnabled 就是用於決定 TextBlock 顯示的文本是否跟著這個設置走
--> <TextBlock Text="i am a &quot;TextBlock&quot;" Margin="5" Foreground="Blue" FontFamily="微軟雅黑" FontSize="24" FontWeight="Bold" FontStyle="Italic" FontStretch="Normal" Padding="5" /> <!-- TextAlignment - 文本的水平對齊方式 Center, Left(默認值), Right, Justify(兩端對齊) --> <TextBlock Text="i am a &quot;TextBlock&quot;" Margin="5" TextAlignment="Justify" /> <!-- TextWrapping - 換行方式 NoWrap - 不換行 Wrap - 換行,必要時可截斷單詞 WrapWholeWords - 換行,但是絕不截斷單詞,即使單詞可能會顯示不全 --> <TextBlock Width="100" HorizontalAlignment="Left" Text="abcdefghijklmnopq www" Margin="5" TextWrapping="NoWrap" /> <TextBlock Width="100" HorizontalAlignment="Left" Text="abcdefghijklmnopq www" Margin="5" TextWrapping="Wrap" /> <TextBlock Width="100" HorizontalAlignment="Left" Text="abcdefghijklmnopq www" Margin="5" TextWrapping="WrapWholeWords" /> <!-- TextTrimming - 內容溢出時的修整方式 None - 不修整文本 Clip - 在像素級別修整文本 WordEllipsis - 在單詞級別修整文本,同時用省略號代替剩余文本 CharacterEllipsis - 在字符級別修整文本,同時用省略號代替剩余文本 --> <TextBlock Width="100" HorizontalAlignment="Left" Text="abcdefghi jklmnopqrstuvwxyz" Margin="5" TextTrimming="None"/> <TextBlock Width="100" HorizontalAlignment="Left" Text="abcdefghi jklmnopqrstuvwxyz" Margin="5" TextTrimming="Clip"/> <TextBlock Width="100" HorizontalAlignment="Left" Text="abcdefghi jklmnopqrstuvwxyz" Margin="5" TextTrimming="WordEllipsis"/> <TextBlock Width="100" HorizontalAlignment="Left" Text="abcdefghi jklmnopqrstuvwxyz" Margin="5" TextTrimming="CharacterEllipsis"/> <!-- MaxLines - 用於指定文本最大的顯示行數 --> <TextBlock MaxLines="3" Margin="5"> <TextBlock.Inlines> <Run>111111</Run> <LineBreak /> <Run>222222</Run> <LineBreak /> <Run>333333</Run> <LineBreak /> <Run>444444</Run> <LineBreak /> <Run>555555</Run> </TextBlock.Inlines> </TextBlock> <!-- CharacterSpacing - 用於設置字符間距 具體字符間隔像素計算公式如下:字體大小 * CharacterSpacing值 / 1000 = 字符間距像素值 LineHeight - 行高 LineStackingStrategy - 控制行高的策略 MaxHeight - 每行的行高以 LineHeight 值和每行的自然行高中的最大值為準。默認值 BlockLineHeight - 每行的行高以 LineHeight 值為準,以字符區域為參考 BaselineToBaseline - 每行的行高以 LineHeight 值為準,以基線為參考(什麽是基線:英文字符的基線基本相當於單詞本4條線中的第3條線) Inlines - 內聯元素的集合。包括 span, bold, italic, underline 等,但是 InlineUIContainer 不可用,其需要在 RichTextBlock 中使用 --> <TextBlock Margin="5" CharacterSpacing="100" LineStackingStrategy="MaxHeight" LineHeight="50"> <TextBlock.Inlines> <Run Foreground="Red">Run</Run> <Span Foreground="Blue">Span</Span> <LineBreak /> <Bold>Bold</Bold> <Italic>Italic</Italic> <Underline>Underline</Underline> </TextBlock.Inlines> </TextBlock> <!-- TextLineBounds - 行框的繪制方式 Full - 正常,默認值 TrimToCapHeight - 行框頂部和大寫字體的頂部一致 TrimToBaseline - 行框底部與文本基線一致(什麽是基線:英文字符的基線基本相當於單詞本4條線中的第3條線) Tight - 行框頂部和大寫字體的頂部一致,行框底部與文本基線一致 --> <Grid Background="Red" Margin="5"> <TextBlock Text="Aj" FontSize="24" TextLineBounds="Full" /> </Grid> <Grid Background="Red" Margin="5"> <TextBlock Text="Aj" FontSize="24" TextLineBounds="TrimToCapHeight" /> </Grid> <Grid Background="Red" Margin="5"> <TextBlock Text="Aj" FontSize="24" TextLineBounds="TrimToBaseline" /> </Grid> <Grid Background="Red" Margin="5"> <TextBlock Text="Aj" FontSize="24" TextLineBounds="Tight" /> </Grid> <!-- 在 xaml 中使用特殊字符,如下打印的內容為“<>&"” --> <TextBlock Text="&lt;&gt;&amp;&quot;" Margin="5" /> <!-- 通過 ASCII 編碼顯示指定的字符 &#61; 十進制,其對應的是“=” &#x3D; 十六進制,其對應的是“=” &#38; 十進制,其對應的是“&” &#x26; 十六進制,其對應的是“&” --> <TextBlock Text="&#61;&#x3D;&#38;&#x26;" Margin="5" /> </StackPanel> </Grid> </Page>

Controls/TextControl/TextBlockDemo1.xaml.cs

/*
 * TextBlock - 文本顯示框(繼承自 FrameworkElement, 請參見 /Controls/BaseControl/FrameworkElementDemo/)
 */

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace Windows10.Controls.TextControl
{
    public sealed partial class TextBlockDemo1 : Page
    {
        public TextBlockDemo1()
        {
            this.InitializeComponent();
        }
    }
}


2、TextBlock 的示例 2
Controls/TextControl/TextBlockDemo2.xaml

<Page
    x:Class="Windows10.Controls.TextControl.TextBlockDemo2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.TextControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <!--
                IsTextSelectionEnabled - 文本是否可以被選中
                SelectionHighlightColor - 選中文本的顏色
            -->
            <TextBlock Name="textBlock1" Margin="5" IsTextSelectionEnabled="True" SelectionHighlightColor="Red">
                <TextBlock.Inlines>
                    <Run>abcdefg</Run>
                    <LineBreak />
                    <Run>hijklmn</Run>
                    <LineBreak />
                    <Run>opqrst</Run>
                </TextBlock.Inlines>
            </TextBlock>
            <!--顯示 textBlock1 中被用戶選中的文本-->
            <TextBlock Name="lblMsg1" Margin="5" />


            <TextBlock Name="textBlock2" Margin="5" IsTextSelectionEnabled="True" SelectionHighlightColor="Red">
                <Run>abcdefghijklmn</Run>
                <LineBreak />
                <Run>opqrstuvwxyz</Run>
            </TextBlock>
            <TextBlock Name="lblMsg2" Margin="5" />


            <Grid Background="Red" Margin="5">
                <TextBlock Name="textBlock3" Text="abcdefghijklmnopqrstuvwxyz" FontSize="24" />
                <!--用於繪制基線-->
                <Line Name="line" Stroke="Blue" StrokeThickness="1" X1="0" X2="300" />
            </Grid>
            <TextBlock Name="lblMsg3" Margin="5" />


            <!--用於顯示 Segoe UI Emoji 字符-->
            <TextBlock Name="textBlock4" Margin="5" FontSize="24" TextWrapping="Wrap" />


            <!--用於演示如何計算 TextBlock 的實際寬度和實際高度-->
            <Grid Name="grid" Margin="5">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition x:Name="gridColumn1" Width="Auto" />
                    <ColumnDefinition x:Name="gridColumn2" Width="*" />
                </Grid.ColumnDefinitions>
                <TextBlock Name="textBlock5" FontSize="24">
                    <Run>abc</Run>
                    <LineBreak />
                    <Run>xyz</Run>
                </TextBlock>
            </Grid>
            <TextBlock Name="lblMsg5" Margin="5" />

        </StackPanel>
    </Grid>
</Page>

Controls/TextControl/TextBlockDemo2.xaml.cs

/*
 * TextBlock - 文本顯示框(繼承自 FrameworkElement, 請參見 /Controls/BaseControl/FrameworkElementDemo/)
 *     SelectedText - 獲取選中的文本內容
 *     SelectionChanged - 選中的文本內容發生變化後觸發的事件
 *     ContentStart - 開頭內容的 TextPointer 對象
 *     ContentEnd - 結尾內容的 TextPointer 對象
 *     Focus(FocusState value) - 獲取焦點
 *     SelectAll() - 選中全部內容(先要獲取焦點後,才能做這個操作)
 *     Select(TextPointer start, TextPointer end) - 選中指定範圍的內容(先要獲取焦點後,才能做這個操作)
 *     SelectionStart - 選中內容的起始位置(TextPointer 對象)
 *     SelectionEnd - 選中內容的結束位置(TextPointer 對象)
 *     BaselineOffset - 獲取基線的位置(什麽是基線:英文字符的基線基本相當於單詞本4條線中的第3條線)
 *     IsColorFontEnabled - 是否以彩色方式顯示 Segoe UI Emoji 之類的字符(默認值是 true) 
 *
 *
 * TextPointer - 文本框中的指針對象
 *     Offset - 指針的位置
 *     LogicalDirection - 指針的邏輯方向
 *         Backward - 向後,即從右到左(比如,如果插入字符的話,就會在指針位置的左邊插入)
 *         Forward - 向前,即從左到右(比如,如果插入字符的話,就會在指針位置的右邊插入)
 *     Rect GetCharacterRect(LogicalDirection direction) - 返回當前指針的矩形框
 *     TextPointer GetPositionAtOffset(offset, LogicalDirection direction) - 將指針位置偏移指定的距離(正代表向右偏移,負代表向左偏移)
 */

using System;
using System.Text;
using Windows.Foundation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Documents;

namespace Windows10.Controls.TextControl
{
    public sealed partial class TextBlockDemo2 : Page
    {
        public TextBlockDemo2()
        {
            this.InitializeComponent();

            this.Loaded += TextBlockDemo2_Loaded;
        }

        private void TextBlockDemo2_Loaded(object sender, RoutedEventArgs e)
        {
            textBlock1.SelectionChanged += (x, y) =>
            {
                // 顯示用戶選中的文本內容
                lblMsg1.Text = textBlock1.SelectedText;
            };

            textBlock1.ContextMenuOpening += (x, y) =>
            {
                // 觸發條件:觸摸屏長按或鼠標右鍵 
            };



            // 獲取焦點
            textBlock2.Focus(FocusState.Programmatic);
            TextPointer start = textBlock2.ContentStart;
            TextPointer end = textBlock2.ContentEnd;
            // textBlock2 的 Text 的內容一共有 26 個字符,但是這裏的指針位置 offset 是從 0 到 34,一共 35 個指針位置
            // <LineBreak /> 占 4 個指針位置,開頭占 2 個指針位置,結尾占 2 個指針位置。剩下的就比較好理解了,就是 26 個字符擁有 27 個指針位置
            lblMsg2.Text = $"ContentStart.Offset: {start.Offset}, ContentEnd.Offset: {end.Offset}";
            lblMsg2.Text += Environment.NewLine;

            // 從左到右偏移 3 個位置,即指針位置在第 1 個字符的右邊
            start = start.GetPositionAtOffset(3, LogicalDirection.Backward);
            // 從右到左偏移 3 個位置,即指針位置在最後一個字符的左邊
            end = end.GetPositionAtOffset(-3, LogicalDirection.Forward);
            textBlock2.Select(start, end); // SelectAll() - 選中全部
            lblMsg2.Text += $"SelectionStart.Offset: {textBlock2.SelectionStart.Offset}, SelectionEnd.Offset: {textBlock2.SelectionEnd.Offset}";



            // 獲取基線的位置,並通過 Line 繪制基線
            lblMsg3.Text += $"BaselineOffset: {textBlock3.BaselineOffset}";
            line.Y1 = textBlock3.BaselineOffset;
            line.Y2 = textBlock3.BaselineOffset;

            

            // 顯示 Segoe UI Emoji 字符
            StringBuilder strContect = new StringBuilder();
            for (int code = 0x1F600; code < 0x1F6C6; code++)
            {
                strContect.Append(char.ConvertFromUtf32(code));
            }
            // 是否以彩色方式顯示 Segoe UI Emoji 之類的字符(默認值是 true) 
            textBlock4.IsColorFontEnabled = true;
            textBlock4.Text = strContect.ToString();



            // 通過封一層 Grid 的方式計算 TextBlock 的實際寬度和實際高度
            lblMsg5.Text = $"textBlock5 的實際高度: {grid.ActualHeight}";
            lblMsg5.Text += Environment.NewLine;
            lblMsg5.Text += $"textBlock5 的實際寬度: {gridColumn1.ActualWidth}";
            lblMsg5.Text += Environment.NewLine;

            // 通過 TextPointer 的方式計算 TextBlock 的實際高度
            TextPointer last = textBlock5.ContentEnd;
            last = last.GetPositionAtOffset(-3, LogicalDirection.Forward);
            Rect rectLast = last.GetCharacterRect(LogicalDirection.Forward);
            lblMsg5.Text += $"textBlock5 的實際高度: {rectLast.Bottom}";
            lblMsg5.Text += Environment.NewLine;

            // 通過 TextPointer 的方式計算 TextBlock 的實際寬度
            int count = textBlock5.ContentEnd.Offset - textBlock5.ContentStart.Offset;
            double width = 0;
            for (int i = 0; i < count; i++)
            {
                TextPointer current = textBlock5.ContentStart.GetPositionAtOffset(i, LogicalDirection.Backward);
                width = Math.Max(width, current.GetCharacterRect(LogicalDirection.Backward).Right);
            }
            lblMsg5.Text += $"textBlock5 的實際寬度: {width}";
        }
    }
}


3、使用自定義字體, 使用 Unicode 編碼
Controls/TextControl/Tips.xaml

<Page
    x:Class="Windows10.Controls.TextControl.Tips"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.TextControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <!--
                文本類控件使用自定義字體
                1、將字體文件復制到項目中
                2、通過 FontFamily 指定字體文件的路徑,在路徑後加“#”並在其後寫上字體名稱(通過“Windows 字體查看器”可以查看字體文件的字體名稱)
            -->
            <TextBlock Text="逐浪大雪鋼筆體" FontSize="36" Margin="5" 
                       FontFamily="/Controls/TextControl/MyFont.otf#逐浪大雪鋼筆體">
                
            </TextBlock>


            <!--
                文本類控件使用 Unicode 編碼
                1、無法在 xaml 中使用 \u(在 code-behind 中可以)
                2、通過 &#0000; 的方式來顯示 Unicode 字符(註:unicode 的 0 - 127 與 ascii 一樣)
            -->
            <TextBlock Text="&#0034;123&#0034;&#0013;123" FontSize="36" Margin="5" />

        </StackPanel>
    </Grid>
</Page>

Controls/TextControl/Tips.xaml.cs

/*
 * 演示文本類控件如何使用自定義字體,以及使用 Unicode 編碼
 */

using Windows.UI.Xaml.Controls;

namespace Windows10.Controls.TextControl
{
    public sealed partial class Tips : Page
    {
        public Tips()
        {
            this.InitializeComponent();
        }
    }
}



OK
[源碼下載]

背水一戰 Windows 10 (27) - 控件(文本類): TextBlock