但是这是个异步的过程 // 所以此处获取到的 DesiredSize 和 RenderSize 仍然是更改外观之前的值

时间:2022-01-30 08:42:51

背水一战 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