背水一戰 Windows 10 (72) - 控制項(控制項基類): UIElement - UIElement 的位置, UIElement 的佈局, UIElement 的其他特性

来源:http://www.cnblogs.com/webabcd/archive/2017/11/13/7824758.html
-Advertisement-
Play Games

背水一戰 Windows 10 之 控制項(控制項基類 - UIElement ): 獲取 UIElement 的位置, UIElement 的佈局相關(Measure, Arrange), UIElement 的非完整像素佈局(UseLayoutRounding), UIElement 的其他特性(V... ...


[源碼下載]


背水一戰 Windows 10 (72) - 控制項(控制項基類): UIElement - UIElement 的位置, UIElement 的佈局, UIElement 的其他特性



作者:webabcd


介紹
背水一戰 Windows 10 之 控制項(控制項基類 - UIElement )

  • 獲取 UIElement 的位置
  • UIElement 的佈局相關(Measure, Arrange)
  • UIElement 的非完整像素佈局(UseLayoutRounding)
  • UIElement 的其他特性(Visibility, Opacity, CacheMode)



示例
1、演示如何獲取 UIElement 的位置
Controls/BaseControl/UIElementDemo/TransformToVisualDemo.xaml

<Page
    x:Class="Windows10.Controls.BaseControl.UIElementDemo.TransformToVisualDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.BaseControl.UIElementDemo"
    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">

            <Grid HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5">
                <Rectangle Name="rectangle1" Width="300" Height="200" Fill="Red" />
                <Rectangle Name="rectangle2" Width="150" Height="100" Fill="Green" />
            </Grid>

            <TextBlock Name="lblMsg" Margin="5" />

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

Controls/BaseControl/UIElementDemo/TransformToVisualDemo.xaml.cs

/*
 * UIElement - UIElement(繼承自 DependencyObject, 請參見 /Controls/BaseControl/DependencyObjectDemo/)
 *     TransformToVisual(UIElement visual) - 返回相對於指定 UIElement 原點(左上角頂點)的 GeneralTransform 類型的對象,傳 null 值則為相對於 app 原點(左上角頂點)
 *     
 *     
 * GeneralTransform
 *     Point TransformPoint(Point point) - 獲取相對於指定位置的位置
 *     
 *     
 * 本例用於演示如何獲取 UIElement 的位置
 */

using System;
using Windows.Foundation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;

namespace Windows10.Controls.BaseControl.UIElementDemo
{
    public sealed partial class TransformToVisualDemo : Page
    {
        public TransformToVisualDemo()
        {
            this.InitializeComponent();

            this.Loaded += TransformToVisualDemo_Loaded;
        }

        void TransformToVisualDemo_Loaded(object sender, RoutedEventArgs e)
        {
            Demo1();
            Demo2();
        }

        // 演示如何獲取 UIElement 相對於 app 原點(左上角頂點)的位置
        private void Demo1()
        {
            GeneralTransform generalTransform = rectangle1.TransformToVisual(null); // 獲取 rectangle1 相對於 app 原點(左上角頂點)的 GeneralTransform
            Point point = generalTransform.TransformPoint(new Point(0, 0)); // rectangle1 的原點(左上角頂點)相對於屏幕 0,0 點的位置

            lblMsg.Text += "紅色矩形的原點(左上角頂點)相對於屏幕的原點(左上角頂點)的位置:" + point.ToString();
            lblMsg.Text += Environment.NewLine;

        }

        // 演示如何獲取 UIElement 相對於另一個 UIElement 原點(左上角頂點)的位置
        private void Demo2()
        {
            GeneralTransform generalTransform = rectangle1.TransformToVisual(rectangle2); // 獲取 rectangle1 相對於 rectangle2 原點(左上角頂點)的 GeneralTransform
            Point point = generalTransform.TransformPoint(new Point(0, 0)); // rectangle1 的原點(左上角頂點)相對於 rectangle2 的原點(左上角頂點)的位置

            lblMsg.Text += "紅色矩形的原點(左上角頂點)相對於綠色矩形的原點(左上角頂點)的位置:" + point.ToString();
        }
    }
}


2、演示 UIElement 的佈局相關
Controls/BaseControl/UIElementDemo/LayoutDemo.xaml

<Page
    x:Class="Windows10.Controls.BaseControl.UIElementDemo.LayoutDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.BaseControl.UIElementDemo"
    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">
            
            <StackPanel Name="stackPanel" Margin="1 2 3 4" HorizontalAlignment="Left" VerticalAlignment="Top" Width="200" Background="Orange">
                <Rectangle Name="rectangle1" Fill="White" Width="100" Height="100" />
            </StackPanel>
            
            <TextBlock Name="lblMsg" Margin="5" />
            
        </StackPanel>
    </Grid>
</Page>

Controls/BaseControl/UIElementDemo/LayoutDemo.xaml.cs

/*
 * UIElement - UIElement(繼承自 DependencyObject, 請參見 /Controls/BaseControl/DependencyObjectDemo/)
 *     Measure(), Arrange(), InvalidateMeasure(), InvalidateArrange() - 參見 /MyControls/MyControl2.cs
 *     DesiredSize - 獲取通過 Measure() 計算後得到的期望尺寸
 *     RenderSize - 獲取通過 Arrange() 計算後得到的呈現尺寸
 *     UpdateLayout() - 相當於依次調用 InvalidateMeasure() 和 InvalidateArrange(),然後同步等待結果,而 InvalidateMeasure() 和 InvalidateArrange() 本身是非同步處理的
 *    
 * 
 * 註:
 * 1、uwp 的 layout 是一個遞歸系統,更多說明請參見 /MyControls/MyControl2.cs
 * 2、InvalidateMeasure() 就是遞歸調用自己和子輩門的 Measure()
 * 3、InvalidateArrange() 就是遞歸調用自己和子輩門的 Arrange()
 *    
 * 
 * 本例用於演示 UIElement 的佈局相關
 */

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

namespace Windows10.Controls.BaseControl.UIElementDemo
{
    public sealed partial class LayoutDemo : Page
    {
        public LayoutDemo()
        {
            this.InitializeComponent();

            this.Loaded += LayoutDemo_Loaded;
        }

        private void LayoutDemo_Loaded(object sender, RoutedEventArgs e)
        {
            lblMsg.Text += stackPanel.DesiredSize.ToString(); // 204,106(期望尺寸,是包括 margin 的)
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += stackPanel.RenderSize.ToString(); // 200,100(呈現尺寸,是不包括 margin 的)
            lblMsg.Text += Environment.NewLine;

            // 更改外觀
            stackPanel.Margin = new Thickness(5);
            rectangle1.Height = 300;

            // 更改外觀後,佈局系統會自動調用 InvalidateMeasure() 和 InvalidateArrange(),但是這是個非同步的過程
            // 所以此處獲取到的 DesiredSize 和 RenderSize 仍然是更改外觀之前的值
            lblMsg.Text += stackPanel.DesiredSize.ToString(); // 204,106(期望尺寸,是包括 margin 的)
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += stackPanel.RenderSize.ToString(); // 200,100(呈現尺寸,是不包括 margin 的)
            lblMsg.Text += Environment.NewLine;

            // 如果想要同步知道結果的話就調用 UpdateLayout()
            stackPanel.UpdateLayout();

            // 所以此處獲取到的 DesiredSize 和 RenderSize 為更改外觀之後的值
            lblMsg.Text += stackPanel.DesiredSize.ToString(); // 210,310(期望尺寸,是包括 margin 的)
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += stackPanel.RenderSize.ToString(); // 200,300(呈現尺寸,是不包括 margin 的)
        }
    }
}


3、演示 UIElement 的 UseLayoutRounding 的應用
Controls/BaseControl/UIElementDemo/UseLayoutRoundingDemo.xaml

<Page
    x:Class="Windows10.Controls.BaseControl.UIElementDemo.UseLayoutRoundingDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.BaseControl.UIElementDemo"
    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">

            <!--
                UseLayoutRounding - 是否使用完整像素佈局。預設值為 true
                    舉例說明:如果設置了某個元素的 Margin="1.6"(非完整像素),那麼
                    1、當 UseLayoutRounding="true" 時,則設置為 Margin="1.6" 的元素的各個方向的 Margin 是不相等的,但是顯示清晰
                    2、當 UseLayoutRounding="false" 時,則設置為 Margin="1.6" 的元素的各個方向的 Margin 是相等的,但是顯示不清晰
            
                註:UseLayoutRounding 是會自動繼承的,即子元素會繼承父元素的 UseLayoutRounding 設置
            -->
            <Grid Width="200" Height="200" Margin="5" HorizontalAlignment="Left">
                <Border BorderBrush="Black" Background="White" BorderThickness="1"></Border>
                <Border BorderBrush="Black" Background="White" BorderThickness="1" Margin="1.6" UseLayoutRounding="True"></Border>
            </Grid>

            <Grid Width="200" Height="200" Margin="5" HorizontalAlignment="Left">
                <Border BorderBrush="Black" Background="White" BorderThickness="1"></Border>
                <Border BorderBrush="Black" Background="White" BorderThickness="1" Margin="1.6" UseLayoutRounding="False"></Border>
            </Grid>

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

Controls/BaseControl/UIElementDemo/UseLayoutRoundingDemo.xaml.cs

/*
 * UIElement - UIElement(繼承自 DependencyObject, 請參見 /Controls/BaseControl/DependencyObjectDemo/)
 *     UseLayoutRounding - 是否使用完整像素佈局。預設值為 true
 *     
 *     
 * 本例用於演示 UIElement 的 UseLayoutRounding 的應用
 */

using Windows.UI.Xaml.Controls;

namespace Windows10.Controls.BaseControl.UIElementDemo
{
    public sealed partial class UseLayoutRoundingDemo : Page
    {
        public UseLayoutRoundingDemo()
        {
            this.InitializeComponent();
        }
    }
}


4、演示 UIElement 的其他特性
Controls/BaseControl/UIElementDemo/OthersDemo.xaml

<Page
    x:Class="Windows10.Controls.BaseControl.UIElementDemo.OthersDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.BaseControl.UIElementDemo"
    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="5">

            <Rectangle Fill="Orange" Width="100" Height="100" Margin="5" Visibility="Collapsed" />
            <Rectangle Fill="Orange" Width="100" Height="100" Margin="5" Opacity="0.5" CacheMode="BitmapCache" />

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

Controls/BaseControl/UIElementDemo/OthersDemo.xaml.cs

/*
 * UIElement - UIElement(繼承自 DependencyObject, 請參見 /Controls/BaseControl/DependencyObjectDemo/)
 *     Visibility - 可見性
 *         Visible - 顯示
 *         Collapsed - 不顯示,且不占位
 *     Opacity - 不透明度(0.0 - 1.0 之間,預設值為 1.0)
 *     CacheMode - 緩存模式
 *         null - 預設值
 *         BitmapCache - 用 GPU 渲染 RenderTransform 和 Opacity
 *             如果 RenderTransform 或 Opacity 使用了 storyboard 動畫的話,動畫一律將變為 Dependent Animation 而不是 Independent Animation,這樣性能就會變差。一般來說不用設置成 BitmapCache 模式
 *     
 *     
 * 本例用於演示 UIElement 的其他特性
 */

using Windows.UI.Xaml.Controls;

namespace Windows10.Controls.BaseControl.UIElementDemo
{
    public sealed partial class OthersDemo : Page
    {
        public OthersDemo()
        {
            this.InitializeComponent();

            // this.Visibility = Visibility.Collapsed;
            // this.Opacity = 0.5;
            // this.CacheMode = null;
            // this.CacheMode = new BitmapCache();
        }
    }
}



OK
[源碼下載]


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

-Advertisement-
Play Games
更多相關文章
  • Mysql安裝 CentOS 7 版本將MySQL資料庫軟體從預設的程式列表中移除,用mariadb代替了。MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用GPL授權許可。開發這個分支的原因之一是:甲骨文公司收購了MySQL後,有將MySQL閉源的潛在風險,因此社區採用 ...
  • Memcached 是一個高性能的分散式記憶體對象緩存系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中緩存數據和對象來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用寫的,但是客戶端可以用任何語言 ...
  • ABP是“ASP.NET Boilerplate Project (ASP.NET樣板項目)”的簡稱。ASP.NET Boilerplate是一個用最佳實踐和流行技術開發現代WEB應用程式的新起點,它旨在成為一個通用的WEB應用程式框架和項目模板。框架ABP是基於最新的ASP.NET CORE,AS ...
  • 一、系統介紹 本軟體主要讓你的文件夾多彩多樣化,而不是千篇一律黃色的文件夾,相信豐富多彩的顏色更便於記憶、能讓心情愉快些。 文件夾顏色眾多,到底有多少種呢,10種? 100種? 1000種? NO,精確計算是255*255*255 , 只是很多顏色很相近, 而能夠明顯有差別的不是很多,為了便於自己記 ...
  • 在ABP框架下使用NHibernate和Dapper實現資料庫訪問。 ...
  • 如果我們要從線程池中取消某個線程的操作,應該如何實現呢?本示例使用CancellationTokenSource和CancellationToken兩個類來實現在取消線程池中的操作。 ...
  • 在進行實體轉換操作的時候如果需要在對兩個實體之間兩個屬性欄位差不多相同的類要進行一個互相的轉換,我們要把a對象的所有欄位的值都複製給b對象,我們只能用b.屬性=a.屬性來寫,如果屬性欄位太多的話,就要寫很多行複製語句,麻煩還容易漏掉一些,這個時候可以利用c#的反射來實現複製。我們可以寫這樣一個利用泛 ...
  • 用Windows 8.1的童鞋應該知道OneNote裡面有一個RadialMenu。如下圖,下圖是WIn10應用Drawboard PDF的RadialMenu,Win8.1的機器不好找了。哈哈,由於整個文章比較長,大家可以放《給我一首歌的時間》 邊聽邊看。<滑稽> 從設計到開發包括修複一些bug, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...