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

来源:http://www.cnblogs.com/webabcd/archive/2016/08/08/5747978.html
-Advertisement-
Play Games

背水一戰 Windows 10 之 控制項(文本類): 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 - 字體粗細,預設值是 Normal
                    FontStyle - 字體樣式,預設值是 Normal
                        Italic - 使用字體自帶的斜體
                        Oblique - 通過程式讓正常字體傾斜(對於自身不帶斜體的字體可以使用此值讓字體傾斜)
                    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>

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

Controls/TextControl/TextBlockDemo1.xaml.cs

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

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.xaml)
 *     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
[源碼下載]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、變數的作用域要懂得閉包,起首必須懂得Javascript特別的變數作用域。變數的作用域無非就是兩種:全局變數和局部變數。Javascript說話的特別之處,就在於函數內部可以直接讀取全局變數。Js代碼 var n=999; function f1(){ alert(n); } f1(); // ...
  • DECLARE @tb1 Table( drive varchar(20), [MB 可用空間] varchar(20)) INSERT INTO @tb1 Exec master.dbo.xp_fixeddrives select drive , CAST( CAST((CAST([MB 可用空間 ...
  • ...
  • 聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com 希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~ 如果你感覺文章有幫助,點 ...
  • 存儲過程:就像函數一樣的會保存在資料庫中--》可編程性 --》 存儲過程創建存儲過程:create proc JiaFa--需要的參數@a int,@b intas --存儲過程的內容 declare @c int; set @c = @a + @b; return @c;go public int ...
  • .NET Core中間件的註冊和管道的構建(2) 用UseMiddleware擴展方法註冊中間件類 0x00 為什麼要引入擴展方法 有的中間件功能比較簡單,有的則比較複雜,並且依賴其它組件。除了直接用ApplicationBuilder的Use()方法註冊中間件外,還可以使用ApplicationB ...
  • It has being ages to get back to cnblogs, Career path had been changed back to .Net development in 4 years ago....Things i just leart from my current ...
  • 什麼是Linq表達式?什麼是Lambda表達式? 如圖: 由此可見Linq表達式和Lamdba表達式並沒有什麼可比性。 那與Lamdba表達式相關的整條語句稱作什麼呢?在微軟並沒有給出官方的命名,在《深入理解C#》中稱為點標記。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...