当前位置:   article > 正文

1WPF---常用布局_wpf 布局

wpf 布局

一.Day01-03

1.数据绑定

 

 

 改动通知到界面

2.常用布局控件

1.Grid面板:功能最强大,布局最灵活的容器

基本属性: 行定义:RowDefinitions->RowDefinition(Height:*/auto/数字) 列定义:ColumnDefinitions->ColumnDefinition(Width: */auto/数字) 尺寸共享:Grid.IsSharedSizeScope=“True” 配合行/列中的SharedSizeGroup属性 - 附加属性: Grid.Row/Grid.Column 如果是第0行或第0列,可以省略

 

2. StackPanel堆栈

最简单的布局容器之一,基本特性水平或垂直排队,从下往上,从右往左

主要属性配置: Orientation(布局的方向)

 

 3.DockPanel停靠

通过设置Dock停靠进行布局

主要属性配置: - 基本属性:LastChildFill - 附加属性: DockPanel.Dock(Left/Top/Right/Bottom)

技巧:alt+箭头移动顺序

 4.WrapPanel流式布局

唯一一个不能被Grid替代的布局控件,按行排列,尺寸不够时换行;按列排列,尺寸不够时折行

主要属性配置: Orientation

 

 5.UniformGrid

另一种行列风格布局,自动生成统一一致的行列

主要属性配置:Rows、Columns,进行行数以及列数的指定

 

 6.Canvas

通过精确坐标定位放置子元素

主要属性配置: - 附加属性:Canvas.Left/Canvas.Top/Canvas.Right/Canvas.Bottom

Panel.ZIndex=””可以指定优先显示层级

 

 7.InkCanvas

支持任意笔画输入的画布组件

主要属性配置: - 基本属性: EditingModel、Strokes(获取所有笔迹)、DefaultDrawingAttributes(设置笔迹样式) GestureOnly 配合手势操作 - 附加属性: InkCanvas.Left/InkCanvas.Top/InkCanvas.Right/InkCanvas.Bottom

 EditingModel:

  • None=0// 忽略鼠标和手写笔输入

  • Ink = 1// 允许用户绘制批注,默认模式。使用鼠标或者手写笔绘图时,会绘制笔画

  • GestureOnly = 2// 不远许用户绘制笔画批注,但会关注预先定义的特定姿势,由System.Windows.Ink.ApplicationGesture定义笔势

  • InkAndGesture = 3// 允许用户绘制壁画批注,也可以识别预先定义的姿势

  • Select = 4// 允许用户选择保存在Children集合中的元素,要选择一个元素用户必须单机该元素或者拖动套索选择该元素,一旦选择一个元素就可以移动该元素,改变其尺寸或将其删除

  • EraseByPoint = 5// 擦除鼠标选中的笔画

  • EraseByStroke = 6// 擦除选中的一笔,开始到结束都会擦除

 

 8.Border

装饰控件:背景色/边框    圆角    子对象也只能一个

主要属性配置:BorderBrush\BroderThinkness\Background\CornerRadius

使用场景:绘制边线 背景色、圆角(Rectangle) 使用非常频繁

WPF各布局源码地址:https://www.github.com/dotnet/wpf

3.WPF体系结构

DispatcherObject Dispatcher

DependencyObject

Visual-绘图对象

UIElement-布局、输入、焦点、事件;路由事件

FrameworkElement:对齐

Shape:Line、Path

Control:{TextBlock:FrameworkElement}支持控件模板 ContentCOntrol-》单一内容 ItemsControl-》集合子项(ListBox)

Panel-所有容器控件的基类-Grid、StackPanel

Border-装饰控件

 4.自定义布局

  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. namespace Zhaoxi.WPFStudy
  6. {
  7. public class ZxStackPanel : Panel
  8. {
  9. // 从上向下的累积
  10. // 第一个子项 第一个
  11. // 第二个子项 在第一个子项的高度下面
  12. // 第三个子项 在第二个子项的高度+第一个子项的高度
  13. // 。。。。。
  14. // 两个过程:
  15. // 测量:
  16. // 排列
  17. List<ListItem> children = new List<ListItem>();
  18. // 测量:主要是对子控件进行期望尺寸的测量
  19. protected override Size MeasureOverride(Size availableSize)
  20. {
  21. //Size size = new Size(availableSize.Width / 4, availableSize.Height);
  22. // 记录所有子控件的整体高度
  23. double height = 0;
  24. // 遍历子控件,对控件一一进行测量动作
  25. foreach (FrameworkElement item in this.InternalChildren)
  26. {
  27. int index = ZxStackPanel.GetIndex(item);
  28. // 添加到临时集合,供后续排序用
  29. children.Add(new ListItem { Control = item, Index = index });
  30. // 控件测量->得到控件的期望尺寸DesiredSize
  31. item.Measure(availableSize);
  32. //
  33. height += item.DesiredSize.Height;
  34. }
  35. // 通过依赖附加属性对子控件进行排序
  36. children = children.OrderBy(c => c.Index).ToList();
  37. // 根据指定序号进行调整
  38. int i = 0;
  39. while (i < children.Count)
  40. {
  41. if (children[i].Index > 0)
  42. {
  43. ListItem item = children[i];
  44. children.RemoveAt(i);
  45. children.Insert(item.Index, item);
  46. }
  47. else
  48. i++;
  49. }
  50. // 返回所有子控件所需要的Size,可能比容器大小要大:availableSize
  51. return new Size(availableSize.Width, height);
  52. }
  53. // 排列:最终子控件在放在哪个位置(坐标)上
  54. // finalSize等于MeasureOverride返回值
  55. protected override Size ArrangeOverride(Size finalSize)
  56. {
  57. // 记录所有子控件的整体高度
  58. double height = 0;
  59. foreach (ListItem item in children)
  60. {
  61. // 将Item子项放到特定的位置 ,主要是在Rect的X和Y,大小由Rect的Width和Height决定
  62. item.Control.Arrange(new Rect(0, height, finalSize.Width, item.Control.DesiredSize.Height));
  63. //
  64. height += item.Control.DesiredSize.Height;
  65. }
  66. return finalSize;
  67. }
  68. // 需求:StackPanel中的子项进行顺序调整
  69. public static int GetIndex(DependencyObject obj)
  70. {
  71. return (int)obj.GetValue(IndexProperty);
  72. }
  73. public static void SetIndex(DependencyObject obj, int value)
  74. {
  75. obj.SetValue(IndexProperty, value);
  76. }
  77. public static readonly DependencyProperty IndexProperty =
  78. DependencyProperty.RegisterAttached("Index", typeof(int), typeof(ZxStackPanel), new PropertyMetadata(0));
  79. //private int _index;
  80. //public int Index
  81. //{
  82. // get { return _index; }
  83. // set { _index = value; }
  84. //}
  85. //
  86. // 指定子项的区域大小 大中小
  87. }
  88. class ListItem
  89. {
  90. public FrameworkElement Control { get; set; }
  91. public int Index { get; set; }
  92. }
  93. }

实现效果

 二.Day04 窗口对象&资源系统

1.无边框窗体

 

2.异性窗体

 

 3.文件资源

图片需要调成资源

 

 

音视频、Gif  必须复制到本地加载

使用全路径:

<Image Source="pack://application:,,,/WPF_04;component/Assets/img101.png"/>

pack://application:,,,[/程序集名称;][版本号;][公匙;]component/Assets/img101.png

4.iconfont使用

设置为资源

 5.资源绑定(对象资源 )

 ------

 

6.资源引用问题

 三.Day05 资源样式与模板

添加资源字典

 

放到

 资源的递归搜索

自身资源->父级资源->……->窗口资源->应用程序资源->框架系统资源

重用原则: 被广泛的重用,可以使用应用程序资源; 两三个窗口使用资源,建议在各个窗口分别定义

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/511805
推荐阅读
相关标签
  

闽ICP备14008679号