Windows 8 Store Apps学习(17) 控件基础: Measure等

控件基础: Measure, Arrange, GeneralTransform, Visua

介绍

重新想象 Windows 8 Store Apps 之 控件基础

Measure() 和 Arrange() - xaml 的 layout 系统

GeneralTransform - 通过 UIElement.TransformToVisual() 获取元素的位置信息

VisualTree - 可视树

示例

1、演示 xaml 的 layout 系统

Controls/Basic/MeasureArrange.xaml

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

    <Grid Background="Transparent">

        <local:MyStackPanel Margin="120 0 0 0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="200" Height="200">

            <TextBlock Text="我是文本" Width="100" Height="100" />
            <Button Content="我是按钮" Width="150" Height="150" />

        </local:MyStackPanel>

    </Grid>
</Page>

Controls/Basic/MeasureArrange.xaml.cs

/*
 * 演示 Layout 系统
 *
 * win8 xaml 的 layout 就是一个递归系统,本 demo 就递归的一个过程做说明(步骤顺序参见代码注释中

的序号)
 */

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

namespace XamlDemo.Controls.Basic
{
    public sealed partial class MeasureArrange : Page
    {
        public MeasureArrange()
        {
            this.InitializeComponent();
        }
    }

    public class MyStackPanel : StackPanel
    {
        // 1、首先爸爸知道自己能够提供的尺寸 availableSize,然后告诉儿子们
        protected override Size MeasureOverride(Size availableSize)
        {
            // 2、儿子们收到 availableSize 后,又结合了自身的实际情况,然后告诉爸爸儿子们所期望的尺寸 desiredSize
            Size desiredSize = base.MeasureOverride(availableSize);
            Debug.WriteLine("availableSize: " + availableSize.ToString());
            Debug.WriteLine("desiredSize: " + desiredSize.ToString());
            return desiredSize;

            // 以下是自定义的 Measure 逻辑,供参考
            /*
            Size childrenSize = new Size(0, 0);
            foreach (UIElement child in this.Children)
            {
                child.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
                childrenSize.Width += child.DesiredSize.Width;
                childrenSize.Height += child.DesiredSize.Height;
            }
            return childrenSize;
            */
        }

        // 3、爸爸收到儿子们的反馈后,告诉儿子们自己最终提供的尺寸 finalSize
        protected override Size ArrangeOverride(Size finalSize)
        {
            // 4、儿子们根据 finalSize 安排各自的位置,然后爸爸的呈现尺寸也就确定了 renderSize
            Size renderSize = base.ArrangeOverride(finalSize);
            Debug.WriteLine("finalSize: " + finalSize.ToString());
            Debug.WriteLine("renderSize: " + renderSize.ToString());
            return renderSize;

            // 以下是自定义的 Arrange 逻辑,供参考
            /*
            Point childPos = new Point(0, 0);
            foreach (UIElement child in this.Children)
            {
                child.Arrange(new Rect(childPos, new Size(child.DesiredSize.Width, child.DesiredSize.Height)));
                childPos.Y += child.RenderSize.Height;
            }
            return finalSize;
            */
        }
    }
}

/*
 * 输出结果:
 * availableSize: 200,200
 * desiredSize: 150,250
 * finalSize: 200,250
 * renderSize: 200,250
*/

/*
 * 注:
 * UIElement
 *     调用 Measure() 方法后会更新 DesiredSize 属性
 *     调用 Arrange() 方法后会更新 RenderSize 属性
 *     UpdateLayout() - 强制 layout 递归更新
 *
 * FrameworkElement - 继承自 UIElement
 *     MeasureOverride() - 重写 Measure()
 *     ArrangeOverride() - 重写 Arrange()
 *     ActualWidth 和 ActualHeight 来自 RenderSize,每次 UpdateLayout() 后都会被更新
 */

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索递归
, child
, size
, UIElement
ActualWidth
,以便于您获取更多的相关知识。

时间: 2024-08-22 18:20:06

Windows 8 Store Apps学习(17) 控件基础: Measure等的相关文章

Windows 8 Store Apps学习(16) 控件基础: 依赖属性等等

控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试 介绍 重新想象 Windows 8 Store Apps 之 控件基础 DependencyProperty - 依赖属性 AttachedProperty - 附加属性 控件的继承关系 路由事件和命中测试 示例 1.开发一个具有 DependencyProperty 和 AttachedProperty 的自定义控件 MyControls/themes/generic.xaml <ResourceDictionary x

Windows 8 Store Apps学习(15) 控件 UI: 字体继承

控件 UI: 字体继承, Style, ControlTemplate, SystemReso 介绍 重新想象 Windows 8 Store Apps 之 控件 UI 字体继承 - 继承父辈的 Font 相关的信息 Style - 样式 ControlTemplate - 控件模板 系统资源 - 系统内置的样式资源 VisualState - 视 图状态 VisualStateManager - 视图状态管理器 示例 1.演示字体继承 Controls/UI/FontInherit.xaml

Windows 8 Store Apps学习(14) 控件UI

控件 UI RenderTransform, Projection, Clip, UseLa 介绍 重新想象 Windows 8 Store Apps 之 控件 UI RenderTransform - 变换(用于做位移,旋转,缩放,扭曲等变换) Projection - 映射 Clip - 剪裁并显示 UIElement 的指定区域 UseLayoutRounding - 是否使用完整像素布局 示例 1.演示 RenderTransform 的应用 Controls/UI/RenderTran

重新想象 Windows 8 Store Apps (17) - 控件基础: Measure, Arrange, GeneralTransform, VisualTree

原文:重新想象 Windows 8 Store Apps (17) - 控件基础: Measure, Arrange, GeneralTransform, VisualTree [源码下载] 重新想象 Windows 8 Store Apps (17) - 控件基础: Measure, Arrange, GeneralTransform, VisualTree 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 控件基础 Measure() 和 Arrange()

Windows 8 Store Apps学习(7) 布局控件

Canvas, Grid, StackPanel, VirtualizingS 介绍 重新想象 Windows 8 Store Apps 之布局控件 Canvas - 绝对定位式布局 Grid - 网格式布局 StackPanel - 流式布局 VirtualizingStackPanel - 仅能用于 ItemsControl WrapGrid - 仅能用于 ItemsControl VariableSizedWrapGrid - 用于 Wrap 子元素集合 示例 1.Canvas 的 Dem

Windows 8 Store Apps学习(6) 媒体控件

Image, MediaElement 介绍 重新想象 Windows 8 Store Apps 之媒体控件 Image - 图片控件 MediaElement - 播放视频或音频的控件 示例 1.Image 的 Demo ImageDemo.xaml <Page x:Class="XamlDemo.Controls.ImageDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&q

Windows 8 Store Apps学习(5) 集合控件

ComboBox, ListBox, FlipView, ItemsContr 介绍 重新想象 Windows 8 Store Apps 之集合控件 ComboBox - 下拉框 ListBox - 列表框 FlipView - 滑动视图控件 ItemsControl ItemsPresenter - ItemsPresenter 用来呈现 ItemsControl 的 Items 示例 1.ComboBox 的 Demo ComboBoxDemo.xaml <Page x:Class="

Windows 8 Store Apps学习(4) 提示控件和范围控件

提示控件: ProgressRing; 范围控件: ProgressBar, Slider 介绍 重新想象 Windows 8 Store Apps 之提示控件 ProgressRing - 进度圈控件 重新想象 Windows 8 Store Apps 之范围控件 ProgressBar - 进度条控件 Slider - 滑动条控件 示例 1.ProgressRing 的 Demo ProgressRingDemo.xaml <Page x:Class="XamlDemo.Control

Windows 8 Store Apps学习(3) 内容控件

ToolTip, Frame, AppBar, ContentControl 介绍 重新想象 Windows 8 Store Apps 之内容控件 ToolTip - 提示框控件 Frame - 框架控件,用于导航内容 AppBar - 应用程序栏控件 ContentControl ContentPresenter - ContentPresenter 用来呈现 ContentControl 的 Content 重新想象 Windows 8 Store Apps 之容器控件 Border - 边