窗体

  • 无边框

窗体无边框(最大化及标题位置)WindowStyle="None"

窗体透明 AllowsTransparency="True",必须设置窗体无边框,否则报错

SizeToContent属性,窗体大小可以根据内容自动调整,多语言版本时一般会使用

我习惯性的设置Window窗体的样式如下:

<Border Margin="5" Background="#EEE" CornerRadius="5" MouseLeftButtonDown="Border_MouseLeftButtonDown">
    <Border.Effect>
        <DropShadowEffect BlurRadius="10" Direction="0" Opacity="0.3" ShadowDepth="0" Color="Gray" />
    </Border.Effect>
    <Grid Margin="10" />
</Border>

这里有个知识点需要强调一下:

Border的属性Background="{x:Null}" 和Background="Transparent" 的区别,前者设置之后,会导致无法获取到Border的一些事件,所以一般都会使用后者,特殊场景除外。

  • 异形窗口

关键属性Clip:根据集合图形进行窗口剪切

<Window.Clip>
    <RectangleGeometry Rect="20,20,100,50" />
    <!--<EllipseGeometry RadiusX="80" RadiusY="40" Center="50,50"/>-->
</Window.Clip>

也可使用PathGeometry实现各种自定义形状的异形窗体创建

布局原则

  1. 不使用显示的方式设定元素的尺寸(常见的就是在多语言版本软件切换时)
  2. 不使用坐标定位置
  3. 布局容器的子元素共享可用空间
  4. 可嵌套容器

布局过程

布局过程包括两个阶段:测量(measure)阶段和排列(arrange)阶段。测量阶段,容器遍历所有子元素,并询问子元素他们期望的尺寸。排列阶段,容器在合适的位置放置子元素。

布局容器

  • Border:装饰控件,不是严格意义上的布局控件。同类型的还有Viewbox(对布局内的子控件进行等比缩放)
  • StackPanel:实现单行或者单列展示子控件
  • DockPanel:具有停靠功能,给子控件增加了附加属性(停靠方式,依次设置子控件布局)
  • WrapPanel:唯一一个不能被Grid替代的布局控件,先行后列/先列后行的形式进行布局(会换行)
  • Grid:布局应用最广的控件,可以设置行列网格也可以不设置,将子控件包裹起来形成一个整体,为子控件增加附加属性(用来设置行列位置)
  • UniformGrid:直接通过属性定义行列数量 Rows="4" Columns="3",子元素按照行列自动填充。如果不设置行列属性,会按照n*n的形式进行自动布局行列
  • Canvas:在业务界面使用比较少,一般在做鼠标操作比较多的界面中或者自定义控件中比较常用,通过使用精确的坐标来放置元素。
  • InkCanvas:支持笔画输入等操作,不属于布局控件

所有布局容器都继承自Panel抽象类。3个公有属性

名称 说明
Backgroud 面板背景着色的画刷。如果想接收鼠标事件,就必须将该属性设置为非空值(如果既想接收鼠标事件,又不希望显示固定颜色的背景,那就设置透明即可)
Children 该属性是在面板中存储的条目集合(每个条目可以包含更多的子条目)
IsItemHost 如果面板用于显示与ItemsControl控件关联的项,该属性值就是true。在大多数情况下,设置不需要知道列表控件使用后台面板来管理它所包含的条目的布局。但是如果希望创建自定义列表,以不同方式放置子元素(按照平铺方式显示图像的ListBox控件),这个属性就很重要了。

如果需要创建自己的布局容器,就需要使用这几个公有属性,还需要重写继承自FrameworkElement类的两个方法:

protected override Size MeasureOverride(Size constraint)

protected override Size ArrangeOverride(Size arrangeSize)

来修改当前子元素面板处理测量阶段和排列阶段的方式。

扩展布局容器

  • TabPanel
  • ToolbarPanel、ToolbarOverflowPanel
  • VirtualizingStackPanel(能够改善性能,大数据量展示的时候。ListBox内部使用了,ItemsControl没有)

特殊容器

  • ScrollViewer-无法全部呈现时,使用滚动进行封装。

继承自ContextControl(内部职能放置一个对象),所以使用布局控件包裹整个展示内容。LineUp()-LineDown()

PageUp()-PageDown()

ScrollToEnd()-ScrollToHome()-ScrollToVerticalOffset()

ScrollToLeftEnd()-ScrollToRightEnd()-ScrollToHorizontalOffset()

  • HeaderedContentControl
  • GroupBox
  • TabItem
  • Expander

WPF进阶技巧和实战02-布局的更多相关文章

  1. WPF进阶技巧和实战03-控件(3-文本控件及列表控件)

    系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实 ...

  2. WPF进阶技巧和实战03-控件(4-基于范围的控件及日期控件)

    系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实 ...

  3. WPF进阶技巧和实战07--自定义元素02

    在01节中,研究了如何开发自定义控件,下节开始考虑更特殊的选择:派生自定义面板以及构建自定义绘图 创建自定义面板 创建自定义面板是一种比较常见的自定义控件开发子集,面板可以驻留一个或多个子元素,并且实 ...

  4. WPF进阶技巧和实战03-控件(5-列表、树、网格02)

    数据模板 样式提供了基本的格式化能力,但是不管如何修改ListBoxItem,他都不能够展示功能更强大的元素组合,因为了每个ListBoxItem只支持单个绑定字段(通过DisplayMemberPa ...

  5. WPF进阶技巧和实战08-依赖属性与绑定02

    将元素绑定在一起 数据绑定最简单的形式是:源对象是WPF元素而且源属性是依赖项属性.依赖项属性内置了更改通知支持,当源对象中改变依赖项属性时,会立即更新目标对象的绑定属性. 元素绑定到元素也是经常使用 ...

  6. WPF进阶技巧和实战08-依赖属性与绑定01

    依赖项属性 定义依赖项属性 注意:只能为依赖对象(继承自DependencyObject的类)添加依赖项属性.WPF中的元素基本上都继承自DependencyObject类. 静态字段 名称约定(属性 ...

  7. WPF进阶技巧和实战07--自定义元素01

    完善和扩展标准控件的方法: 样式:可使用样式方便地重用控件属性的集合,甚至可以使用触发器应用效果 内容控件:所有继承自ContentControl类的控件都支持嵌套的内容.使用内容控件,可以快速创建聚 ...

  8. WPF进阶技巧和实战06-控件模板

    逻辑树和可视化树 System.Windows.LogicalTreeHelper System.Windows.Media.VisualTreeHelper 逻辑树类(LogicalTreeHelp ...

  9. WPF进阶技巧和实战03-控件(1-控件及内容控件)

    所有控件都继承自System.Windows.Controls.Control类,这个类添加一些基本结构: 设置控件内容对齐方式 (HorizontalContentAlignment,Vertica ...

  10. WPF进阶技巧和实战01-小技巧

    Svg在WPF中的使用 方法1:拷贝svg中的部分代码转换成Geometry(作为Path的Data使用) 在vs或者直接打开svg,看到如下代码: <?xml version="1. ...

随机推荐

  1. 深入浅出Mybatis系列(四)---配置详解之properties与environments

    我先简单的给大家示例一下properties的使用方法. <configuration> <!-- 方法一: 从外部指定properties配置文件, 除了使用resource属性指 ...

  2. new[]/delete[]与new/delete区别

    new[]/delete[]与new/delete完全不同-动态对象数组创建通过new[] 完成-动态对象数组的销毁通过delete[]完成-new[]/delete[]能够被重载,进而改变内存管理方 ...

  3. docker《三》单机部署项目容器,nginx负载均衡

    接着<二> 创建一个网段(和二在一个网段) docker network create --subnet=172.19.0.0/24 pro-net docker run -d --nam ...

  4. C# 简单粗暴的毫秒转换成 分秒的格式

    C# 简单粗暴的毫秒转换成 分秒的格式 1:code(网络上很多存在拷贝或者存在bug的或者不满足自己的要求) 1 public static string RevertToTime(double m ...

  5. 20210819 Emotional Flutter,Medium Counting,Huge Counting,字符消除2

    考场 T1 一下想到了这题,将白块缩短 \(s\) 后维护类似的区间即可. T2 T3 俩计数,直接跳了. T4 的可行 \(t\) 集合相同相当与从 \(n\) 往前跳 kmp 数组,途径点相同,从 ...

  6. LCT 小记

    全程 Link-Cut Tree,是解决动态树问题的有力科技 --题记 简单实现 LCT 的形态直观上是一堆 Splay 的合体,每个 Splay 以时间戳为关键字,各个 Splay 通过虚边相连,可 ...

  7. Scanner类、匿名对象、Random类、ArrayList集合、String类、static静态类、math类和Arrays工具类

    一.Scanner类 1.除了八种基本数据类型,其他都是引用类型: 引用类型使用三步骤: 2.Scanner类 引用jdk提供的类,Scanner在java.util包下,不在java.lang包(S ...

  8. python库--tensorflow

    方法 返回值类型 参数 说明 张量    .constant() Tensort 张量 实例t value 创建一个常量tensor dtype=None 输出类型 shape=None 返回tens ...

  9. 从零开始学习SQL SERVER(1)--- 了解SQL

    SQL是什么 SQL (发音为 sequal ['  sikwəl ' ]) SQL指 Structured Query Language 结构化查询语言,是用于访问和处理数据库的标准的计算机语言. ...

  10. (9)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-搭建Eureka服务注册中心

    ​ 首先创建一个 Maven 项目,取名为 eureka-server,在 pom.xml 中配置 Eureka 的依赖信息,代码如下所示. <!-- Spring Boot --> &l ...