• WPF布局


    理解WPF布局

      在windows forms提供的布局系统中,空间使用硬编码的坐标系统被固定到窗口的某个位置,为了让控件适应窗口的大小,唯一可做的就是设置Anchoring和Docking属性,使其固定到窗体的某个位置

    这种方式对于一些简单的布局场合的工作似乎也不错,但是对于一些稍微复杂的场合,比如,按比例分配控件的空间或者是动态用户界面的创建的情形,将很难适应用户界面,。

      WPF布局原理

    WPF的窗口,在既Windows类,是一个内容控件,该控件派生自ContentControl。内容控件有一个Content属性,该属性有一个限制,只能放置一个用户界面元素,或者是一串字符串,为了在窗口

    上放置多个界面控件,通常在窗口上放置一个容器控件。比如,在vs自动生成Windows1.xaml时,会自动创建一个<Grid>元素来放置用户界面。

    在WPF应用程序中,内容控件的布局逻辑基于使用的容器控件。一般WPF窗口遵循以下几个原则:

        元素不应该指定确定的尺寸大小,通常应该使其大小自动适应的内容,比如,按钮根据所添加的文本来扩展其大小。可以通过设置maximun和minimun尺寸来限制控件可接收的尺寸大小。

        元素不应该使用屏幕坐标来指定其位置,通常是基于其尺寸来进行排列其位置

        布局容器将在其子元素之间共享其可用空间。通常有容器尝试为其每个子元素分配合适的尺寸。

        布局容器允许嵌套。比如,由vs 自动生成的Windows.xaml中,包含一个<Grid>元素,可以在该容器中在放入stackpanel等容器控件形成一个嵌套的布局界面。

      建议开发人员严格遵守这些规则,灵活地使用WPF的布局系统将能开发出更灵活、更强大的用户界面。

      布局过程

     测试尺寸(Measure):该阶段容器将遍历其子元素并且询问它们所需要的最佳尺寸。

     排列元素(Arrange):这个核心阶段,容器将在合适的位置放置子元素。

    有时,元素并不能获取到合适的尺寸,此时容器将裁剪掉部分元素的可视区域来进行显示,在自定义布局面板时,开发人员通常需要处理这两个阶段。panel抽象基类提供了两个方法。即MeasureOverride和ArrangeOverride

    方法,通过重载这两个方法可以编写自定义的布局面板

    注意:

      布局容器没有提供任何滚动条的支持,如果需要在布局面板中添加滚动支持,需要使用一个专门的内容控件ScrollViewer。

     

    所有WPF的布局容器控件都是派生自抽象基类System.Windows.Controls.Panel,该类具有一些基本的布局成员。在WPF中,有抽象基类panels派生了如下几个布局的面板类。

    这个几个面板类是WPF中布局系统的核心,如下

    面板名称 说明
    stackpanel 使用水平或垂直堆叠的方式放置元素,该面板非常简单,但是非常有用,适合于一些小范围的布局
    WarpPanel 当水平方向时,从左到右的布局子元素,当可用的宽度不够时,则开始一个新的行在进行从左到右的排列当垂直方向时,从上到下排列子元素,当高度不够时,则开启一个新的列从上到下进行排列。
    DockPanel   使子元素依赖于容器的特定边缘,比如左、右、上、下边缘等,该面板通常用于全局布局。比如,在一个Windows上先使用DockPanel划分几个大的区域,然后就可以使用Grid进行详细的布局
    Grid   Grid是WPF中最强最好用的布局控件。该控件类似于一个不可见的HTML表格,将于元素放置在特定的行和列中。这是最灵活和最通用的布局控件。
    UniformGrid 放置子元素在一个不可见的表格中,但是强制所有的单元格都具有相同的尺寸,如果要开发一个五子棋游戏, 可以考虑使用这个控件,但是在用户界面的布局中,使用的比较少
    Canvas 使用固定的坐标来绝对定位子元素,这与传统的Windows Forms布局方式类似,但是没有提供Anchoring和Docking特性,在处理图形图像场合,使用这个控件非常有用,但是在动态用户来说,这个控件将会事半功倍
     Border  在一个子元素的周围绘制边框、背景。
       

     

      

  • 相关阅读:
    String 类的常用方法都有那些?
    == 和 equals 的区别是什么
    java【Scanner,Random,ArrayList】的用法(了解80%~90%)
    java无参与有参以及setter和getter方法(练习题)【就事论事】
    java无参与有参以及setter和getter方法(了解)
    不能只学习,还得有玩
    java封装方法(了解)
    java数组,冒泡排序,选择排序(了解80%~90%)
    关于LDEA软件设置背景(详细)
    java运算符,判断符(了解)
  • 原文地址:https://www.cnblogs.com/xiaowie/p/9330093.html
Copyright © 2020-2023  润新知