WPF笔记(2.9和2.10)——Layout

2.9讲的是,如果内部设定超过容器大小,怎么办?

StackPanel会裁剪越界部分

DockPanel和Grid会智能判断,从而决定换行。

2.10 自定义布局容器

自定义容器要实现两个方法MeasureOverride和ArrangeOverride,并保证遍历其下的所有子控件,使 他们都执行Measure和Arrange方法。

using System;
using System.Windows.Controls;
using System.Windows;

namespace CustomPanel {
    public class DiagonalPanel : Panel {

        protected override Size MeasureOverride( Size availableSize ) {
            double totalWidth = 0;
            double totalHeight = 0;

            foreach( UIElement child in Children ) {
                child.Measure( new Size( double.PositiveInfinity,
                                         double.PositiveInfinity ) );
                Size childSize = child.DesiredSize;
                totalWidth += childSize.Width;
                totalHeight += childSize.Height;
            }

            return new Size( totalWidth, totalHeight );
        }

        protected override Size ArrangeOverride( Size finalSize ) {
            Point currentPosition = new Point( );

            foreach( UIElement child in Children ) {
                Rect childRect = new Rect( currentPosition, child.DesiredSize );
                child.Arrange( childRect );
                currentPosition.Offset( childRect.Width, childRect.Height );
            }

            return new Size( currentPosition.X, currentPosition.Y );
        }
    }
}

时间: 2024-11-10 00:19:37

WPF笔记(2.9和2.10)——Layout的相关文章

WPF笔记(2.5 Canvas)——Layout

Canvas是最精确的布局容器--绝对定位,此书作者不建议使用,以为控件的大小一般会随着内部字 体图片的动态生成而自动变化,所以使用前三种布局是最好的选择,在这一点上,我也持同样意见. Canvas使用Top/Bottom属性控制距离顶部/底部的高度:使用Left/Right属性控制距离左/右的距离. 有趣的是,调整Form的大小,第二个TextBlock的位置会相应变化,但和底部以及右边的距离是不变的, 代码见下: <Canvas Background="Yellow">

WPF笔记(2.2 DockPanel)——Layout

读完了这一节,发现DockPanel就是过去winform中的Dock属性.原来的Dock属性是子控件设置,而其 父亲级别不用设置.现在WPF改为在父亲级别抽象出一个DockPanel,然后设置其下子控件的Dock属性. <DockPanel LastChildFill="True"> <Button DockPanel.Dock="Left">Left</Button> <Button DockPanel.Dock=&qu

WPF笔记(1.10 绘图)——Hello,WPF!

书中的代码语法过时了,改写为以下(测试通过): <Button> <Button.LayoutTransform> <ScaleTransform ScaleX="3" ScaleY="3" /> </Button.LayoutTransform> <StackPanel Orientation="Horizontal"> <Canvas Width="20"

WPF笔记(2.4 Grid)——Layout

第一章已经简单介绍过这个容器,这一节详细介绍. Grid一般是用表格(Grid.Row 和Grid.Column )的,比StackPanel更细致一些,但是,这么玩很麻烦, 先横着竖着定义一大堆,然后把元素指定其表格位置,即插入数据,和我们平常习惯的HTML表格不太一样 ,甚至更麻烦了. 原因如下:Html空单元格要放占位符,这样会放很多:Grid玩法则是用什么元素就指定单元格位置, 不用的单元格默认是空,不用指定.另外,Grid单元格中的多个控件可以按照Z轴堆叠,这个顺序是由控 件在xaml

WPF笔记(2.8 常用的布局属性)——Layout

这一节老没意思,啰里啰唆的尽是些HTML的属性,挑几个好玩的List出来,备忘: Padding与Margin的区别: Margin指控件边界与外界的间隙:Padding指的是控件内部内容与控件边界的间隙.两者可以同时使用 . 不再支持 RenderTransform= "scale 3" 改为: <Button> <Button.LayoutTransform> <ScaleTransform ScaleX="3" ScaleY=&q

WPF笔记(2.7 文字布局)——Layout

这一节介绍的是文字布局的几个控件: 1.TextBlock 最基本的文字控件 可以配置5个Font属性. TextWraping属性,"Wrap"是换行,NoWrap是不换行(原书有误,在此更正). TextBlock控件内可以放置很多控件,不光是文字. <TextBlock TextWraping="Wrap"> <Button>Split</Button> <CheckBox>across</CheckBox

WPF笔记(2.6 ViewBox)——Layout

在Canvas外面包一层ViewBox,可以使Canvas内的控件填充整个ViewBox,并随着ViewBox的大小变化而 同步变化,这是因为ViewBox默认属性Stretch="Uniform". Stretch有四个属性: Uniform, Fill(为了填充甚至会拉伸), None(无效果,相当于没有用ViewBox), UniformToFill(如果Canvas大于ViewBox大小则裁剪) 老实说,这节我没看太懂,让我再try一下.

WPF笔记(2.3 StackPanel)——Layout

StackPanel用于小规模的排版布局,比如说一个局部下几个textbox和Button啦. Orientation属性有Vertical和Horizontal两种选择,决定布局方向. 所有控件都有Margin属性,用来使控件之间不那么拥挤,Margin随Vertical和Horizontal的不同而所 加的空白方向不同,当然Margin="3,3"意味着同时在两个方向上有空白. HorizontalAlignment属性用来调整控件的拓展方向.默认是Stretch,即横向有多少地方

WPF笔记(1.8 资源与映射)——Hello,WPF!

终于,看明白了,已经是凌晨1:39分. 这本书这一节写得实在是不好,一个local搞得我糊里糊涂,于是,准备按照他的思路,按照我的理解 ,改写一遍,包括源代码. 首先,这句话WPF新版本已经不用了: <?Mapping XmlNamespace="local" ClrNamespace="DataBindingDemo" ?>,这里 DataBindingDemo是例子的命名空间. 然后Window标签中这个属性设置 xmlns:local="