Extensions in UWP Community Toolkit - Visual Extensions

来源:https://www.cnblogs.com/shaomeng/archive/2018/04/13/8744546.html
-Advertisement-
Play Games

概述 UWP Community Toolkit Extensions 中有一個為可視元素提供的擴展 - VisualExtensions,本篇我們結合代碼詳細講解 VisualExtensions 的實現。 VisualExtensions 為可視元素提供了一種簡單的在 XAML 中修改通用屬性的 ...


概述

UWP Community Toolkit Extensions 中有一個為可視元素提供的擴展 - VisualExtensions,本篇我們結合代碼詳細講解 VisualExtensions 的實現。

VisualExtensions 為可視元素提供了一種簡單的在 XAML 中修改通用屬性的方法,這些通用屬性包括 AnchorPoint,CenterPoint,Offset,Opacity,RotationAngle,RotationAngleInDegrees,RotationAxis,Scale,Size 和 NormalizedCenterPoint。  接下來看看官方示例的截圖:

Source: https://github.com/Microsoft/UWPCommunityToolkit/blob/master/Microsoft.Toolkit.Uwp.UI/Extensions/Visual/VisualExtensions.cs

Doc: https://docs.microsoft.com/zh-cn/windows/uwpcommunitytoolkit/extensions/visualextensions

Namespace: Microsoft.Toolkit.Uwp.UI.Extensions; Nuget: Microsoft.Toolkit.Uwp.UI;

 

開發過程

代碼分析

VisualExtensions 的處理邏輯在 VisualExtensions.cs 類中,下麵我們先來看看類結構:

 

首先看一下類中定義的附加屬性:

  • AnchorPoint - 獲取或設置 UIElement 的 Visual.AnchorPoint 屬性,string 類型;改變時觸發 OnAnchorPointChanged 事件;
  • CenterPoint - 獲取或設置 UIElement 的 Visual.CenterPoint 屬性,string 類型;改變時觸發 OnCenterPointChanged 事件;
  • Offset - 獲取或設置 UIElement 的 Visual.Offset 屬性,string 類型;改變時觸發 OnOffsetChanged 事件;
  • Opacity - 獲取或設置 UIElement 的 Visual.Opacity 屬性,double 類型;改變時觸發 OnOpacityChanged 事件;
  • RotationAngle - 獲取或設置 UIElement 的 Visual.RotationAngle 屬性,double 類型,單位是弧度;改變時觸發 OnRotationAngleChanged 事件;
  • RotationAngleInDegrees -  獲取或設置 UIElement 的 Visual.RotationAngleInDegrees 屬性,double 類型,單位是角度;改變時觸發 OnRotationAngleInDegreesChanged 事件;
  • RotationAxis - 獲取或設置 UIElement 的 Visual.RotationAxis 屬性,string 類型;改變時觸發 OnRotationAxisChanged 事件;
  • Scale - 獲取或設置 UIElement 的 Visual.Scale 屬性,string 類型;改變時觸發 OnScaleChanged 事件;
  • Size - 獲取或設置 UIElement 的 Visual.Size 屬性,string 類型;改變時觸發 OnSizeChanged 事件;
  • NormalizedCenterPoint - 獲取或設置 UIElement 的 Visual.CenterPoint 屬性在 0.0 - 1.0 之間標準化的值,string 類型;改變時觸發 OnNormalizedCenterPointChanged 事件;

除去 OnNormalizedCenterPointChanged 事件,其他事件的處理邏輯都是簡單的進行了 Set 方法處理,我們來看一下 OnNormalizedCenterPointChanged  的處理:

 OnNormalizedCenterPointChanged  的主要處理邏輯在 SetupNormalizedCenterPoint(args, element):

解除 element 的 SizeChanged 事件綁定;把 normalizedValue 轉為 Vector3 類型,然後設置 element VIsual 的 CenterPoint,根據 ActualSize 和 normalizedValue 的換算關係;最後重新綁定 element 的 SizeChanged 事件;

private static void SetupNormalizedCenterPoint(DependencyPropertyChangedEventArgs e, FrameworkElement element)
{
    element.SizeChanged -= KeepCenteredElementSizeChanged;

    if (e.NewValue is string normalizedValue)
    {
        var vectorValue = normalizedValue.ToVector3();
        var visual = GetVisual(element);
        visual.CenterPoint = new Vector3((float)element.ActualWidth * vectorValue.X, (float)element.ActualHeight * vectorValue.Y, 0);

        element.SizeChanged += KeepCenteredElementSizeChanged;
    }
}

來看一下 KeepCenteredElementSizeChanged 事件的處理邏輯,和 SetupNormalizedCenterPoint(args, element) 方法的處理基本相同,都是在使用 normalizedValue 設置 element Visual 的 CenterPoint;

private static void KeepCenteredElementSizeChanged(object sender, SizeChangedEventArgs e)
{
    var element = sender as FrameworkElement;

    var normalizedValue = GetNormalizedCenterPoint(element);
    var vectorValue = normalizedValue.ToVector3();
    var visual = GetVisual(element);
    visual.CenterPoint = new Vector3((float)element.ActualWidth * vectorValue.X, (float)element.ActualHeight * vectorValue.Y, 0);
}

我們看到很多的屬性都是 string 類型,而實際操作中需要用到各種類型的 Vector,要求 string 的格式為 "0,0", "0,0,0", "0,0,0,0" 這樣的用逗號隔開的格式,類似 Margin 的格式,來看一下轉換的方法:

因為 string 轉換為 Vector2 Vector3 和 Vector4 的處理類似,我們以 ToVector2(str) 為例來解釋一下:

  • 處理前先做一些基本格式的檢查,如長度過短,帶有 <> 字元的情況;
  • Split() 方法分割字元串,根據分割後的段數,如果為 1,則使用它創建 Vector2;如果為 2,則使用兩個值創建 Vector2;
public static Vector2 ToVector2(this string str)
{
    try
    {
        var strLength = str.Count();
        if (strLength < 1)
        {
            throw new Exception();
        }
        else if (str[0] == '<' && str[strLength - 1] == '>')
        {
            str = str.Substring(1, strLength - 2);
        }

        string[] values = str.Split(',');

        var count = values.Count();
        Vector2 vector;

        if (count == 1)
        {
            vector = new Vector2(float.Parse(values[0]));
        }
        else if (count == 2)
        {
            vector = new Vector2(float.Parse(values[0]), float.Parse(values[1]));
        }
        else
        {
            throw new Exception();
        }

        return vector;
    }
    catch (Exception)
    {
        throw new FormatException($"Cannot convert {str} to Vector2. Use format \"float, float\"");
    }
}

 

調用示例

我們給 Border 設置了 Visual Extensions,包括縮放,旋轉,透明度等,可以看到運行圖中和設置一致;

<Border Height="100"
    Width="100"
    Background="Purple"
    extensions:VisualExtensions.CenterPoint="50,50,0"
    extensions:VisualExtensions.Opacity="0.5"
    extensions:VisualExtensions.RotationAngleInDegrees="80"
    extensions:VisualExtensions.Scale="2, 0.5, 1"
    extensions:VisualExtensions.NormalizedCenterPoint="0.5, 0.5, 0" />

 

總結

到這裡我們就把 UWP Community Toolkit Extensions 中的 VisualExtensions 的源代碼實現過程和簡單的調用示例講解完成了,希望能對大家更好的理解和使用這個擴展有所幫助。歡迎大家多多交流,謝謝!

最後,再跟大家安利一下 UWPCommunityToolkit 的官方微博:https://weibo.com/u/6506046490大家可以通過微博關註最新動態。

衷心感謝 UWPCommunityToolkit 的作者們傑出的工作,Thank you so much, UWPCommunityToolkit authors!!!

 


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

-Advertisement-
Play Games
更多相關文章
  • Python基礎學習01 python介紹 python主要應用領域 python在那些公司有應用 python優缺點 python2與3的區別 python安裝 一、Python介紹 Python的創始人為Guido van Rossum。1989年聖誕節期間,在阿姆斯特丹,Guido為了打發聖誕 ...
  • package com.machuang.convertStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; im... ...
  • * 一個邏輯表達式里有多種運算符時,計算順序為: (判斷大小的)表達式 > and > or * content = input('xxx') 時, content的數據類型是str類型, 無論輸入的是什麼 * while的用法: 基本用法: 簡寫用法1: 簡寫用法2: flag用法: flag簡寫 ...
  • C++的 bitset 在 bitset 頭文件中,它是一種類似數組的結構,它的每一個元素只能是0或1,每個元素僅用1bit空間。 下麵是具體用法 構造函數 bitset常用構造函數有四種,如下 註意: 用字元串構造時,字元串只能包含 '0' 或 '1' ,否則會拋出異常。 構造時,需在<>中表明b ...
  • 寫入文本文件 1. 關聯讀入的文件,使用Reader 和 FileReader 2. 關聯寫出的文件,使用Writer和 FileWriter 3. 創建緩衝 char數組,用於接收讀取到的文本信息 4. 將文本讀入到 緩衝數組(buff)中 5. 輸出讀取到的文本信息 6. 寫出讀取到的文件 7. ...
  • 練習 4.12: 流行的web漫畫服務xkcd也提供了JSON介面。例如,一個 https://xkcd.com/571/info.0.json 請求將返回一個很多人喜愛的571編號的詳細描述。 下載每個鏈接(只下載一次)然後創建一個離線索引。編寫一個xkcd工具,使用這些離線索引,列印和命令行輸入 ...
  • 在Kotlin中 使用js 函數 ...
  • 在一對多或者多對多的時候。如果通過一的一方取獲得多的一方的數據。除了第一次查詢表的數據以外。每獲得一條多的一方的數據就查詢一次。 如:通過學生表的記錄查詢成績表的記錄。 一個學生就查詢一次,50個學生就查詢50次。 如果需要查詢50個學生的成績,需要查詢資料庫的次數為 第一次查詢學生的記錄+50次查 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...