1. 前言

1. 数据驱动 UI

WPF 是数据核心、主动的,UI 从属数据并表达数据、是被动的;

不再是 UI 驱动数据,而是数据驱动 UI;

2. 控件的定义

控件、数据内容、行为(控件响应用户操作执行自己的方法或以事件的形式通知应用程序);

1)控件是数据和行为的载体;

2)所以关注控件时应该关注抽象的数据和行为而不是具体的形象,

3)比如符合"能展示内容并相应用户单击"这一抽象概念的 UI 元素都可以是 Button,而具体的样子完全可以通过 Style 和 Template 决定,checkbox 也不是因为有个 box 可以 check 才叫 checkbox。

3. 控件类型

  1. 布局控件:Grid、StackPanel、DockPanel、WarpPanel 等 Panel 的子类;
  2. 内容控件:只能容纳一个其他控件或布局控件作为它的内容。如 Window、Button 等 ContentControl 的子类;
  3. 带标题的内容控件:GroupBox、TabItem 等 HeaderedContentControl 的子类;
  4. 条目控件:显示一列数据,一般这列数据之间的类型一致;ListBox、ComboBox 等 ItemsControl 的子类;
  5. 带标题的条目控件:TreeViewItem、MenuItem 等 HeaderedContentControl 的子类;
<TreeView>
<TreeViewItem Header="A">
<TreeViewItem Header="A1">A11</TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="B">
<TreeViewItem Header="B1">B11</TreeViewItem>
</TreeViewItem>
</TreeView> <Menu>
<MenuItem Header="菜单">
<MenuItem Header="新建" InputGestureText="Ctrl+N">
<MenuItem.Icon>
<Image Source="/Images/2.png"/>
</MenuItem.Icon>
<MenuItem Header="设备" Click="MenuItem_Click"/>
</MenuItem>
</MenuItem>
<MenuItem Header="设置" />
<MenuItem Header="关于" />
</Menu>
  1. 特殊内容控件:TextBox、TextBlock、Image
graph LR
DependencyObject-->Dispatcher
Visual-->DependencyObject
UIElement-->Visual
FrameworkElement-->UIElement
Panel-->FrameworkElement
Control-->FrameworkElement
TextBlock-->FrameworkElement
Image-->FrameworkElement
ContentControl-->Control
HeaderedContentControl-->ContentControl
ItemsControl-->Control
HeaderedItemsControl-->ItemsControl
TextBox-->Control

2. 内容模型

2.1 逻辑树、可视元素树

可视树:因为 WPF 有Content 的概念,使控件与控件之间可以存在包含关系,以窗体为根,整个 WPF 的 UI 才形成树形结构。

2.2 内容属性

不同控件的内容属性名称不一:Content、Child、Items、Children、Text;

Button.Content、StackPanel.Children、ListBox.Items。

2.3 各类内容模型详解

2.3.1 ContentControl 族

  • 内容属性:Content
  • 常用:

    Button、Window、Label、UserControl、

    ListBoxItem、ListViewItem、ComboBoxItem、

    RadioButton、ToggleButton、CheckBox、

    ToolTip、ScrollViewer、ContentControl;
  • 不常用:

    ButtonBase、GroupItem、RepeatButton、StatusBarItem、NavigationWindow、Frame、GridViewColumnHeader

2.3.2 HeaderedContentControl

  • 内容属性:Content、Header
  • 常用:TabItem、Expander、HeaderedContentControl
  • 不常用:GroupBox

2.3.3 ItemsControl

  • 内容属性:Items 或 ItemsSource

    每种 ItemsControl 都对应有自己的条目容器 Item Container,如 ListBox 的 Item Container 是 ListBoxItem,关键词:包装机制
  • 常用:

    ListBox、ListView、ComboBox、Menu、ContextMenu、ItemsControl、TabControl、TreeView、StatusBar
  • 不常用:

    MenuBase、Selector(ListBox、ComboBox、TabControl 等的父类)
2.3.3.1 ListBox
  • DisplayMemberPath、SelectedValue、SelectedValuePath、SelectedItem、SelectedItems
ItemsContorl Item Container
ComboBox ComboBoxItem
ListBox ListBoxItem
ListView ListViewItem
TabControl TabItem
Menu MenuItem
ContextMenu MenuItem
TreeView TreeViewItem
StatusBar StatusBarItem

2.3.4 HeaderedItemsControl

内容属性:Items 或 ItemsSource、Header

常用:

MenuItem、TreeViewItem、ToolBar

2.3.5 Decorator 族

  • 内容属性: Child

    起 UI 装饰作用
  • 常用:

    Border、ViewBox
  • 不常用:

    ButtonChrome、ListBoxChrome、BulletDecorator、InkPresenter、AdornerDecorator、ClassicBorderDecorator、SystemDropShadowChome

2.3.6 TextBox、TextBlock

2.3.7 Shape 族

  • Path、Polygon、Polyline 等 Shape 子类;
  • Stroke 设置边线、Fill 设置填充;
  • 无内容属性;
  • 用于 2D 图形绘制。
<Polygon Points="10,10 100,125 20,125" Stroke="Red"/>
<Polyline Points="10,10 100,125 20,125" Stroke="Red"/>
<Path Stroke="Red">
<Path.Data>
<PathGeometry Figures="M 10,100 C 10,300 300,-160 100,10"/>
</Path.Data>
</Path>
<Path Data="M 12.37,87.5 A 15,15 0 0 0 60,115" Stroke="Red" />

Path:

起点命令 M,终点命令 Z(让头尾相连)

直线 L,水平直线 H,垂直直线 V,曲线 C、Q、S、T

椭圆 A

2.3.8 Panel 族

  • 内容属性:Children
  • 常用:

    Grid、StackPanel、DockPanel、WrapPanel、Canvas
  • 不常用:

    UniformGrid(Grid 简化版,定义几行几列,每个单元格大小一致)、TabPanel、ToolBarOverflowPanel、ToolBarPanel、VirtualizingPanel、VirtualizingStackPanel
2.3.8.1 Grid
  • Grid 共享尺寸属性 SharedSizeGroup 运用:

    1)将父级 Grid 的 Grid.IsSharedSizeScope 设置为 true;

    2)两个 Grid 各自某一行或某一列的 SharedSizeGroup 设置为同一个字符串,那么这两行或这两列就可以共享空间。
<Grid Grid.IsSharedSizeScope="True">
<Grid x:Name="layer0Grid"
Panel.ZIndex="0"
MouseEnter="layer0Grid_MouseEnter">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
...
</Grid> <Grid x:Name="toolboxLayerGrid" Visibility="Collapsed">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" SharedSizeGroup="ToolboxGroup" />
</Grid.ColumnDefinitions> <GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Left" />
<Grid x:Name="toolboxGrid" Grid.Column="1" Margin="3,0,0,0">
</Grid>
</Grid>
</Grid> toolboxLayerGrid.Visibility = System.Windows.Visibility.Visible;
toolboxLayerGrid.SetValue(Grid.ZIndexProperty, 2);
layer0Grid.ColumnDefinitions.Add(new ColumnDefinition { SharedSizeGroup = "ToolboxGroup" });
  • Grid 宽高接受的尺寸单位:Pixel(像素,默认单位)、Inch(英寸=96 piexl)、Centimeter(厘米=96/2.54 pixel)、Point(=96/72 pixel)
  • 如果把两个元素放在 Grid 的同一个单元格内,则后书写的元素将在先书写的元素之上,可以通过 Panel.ZIndex 值调整,值越大,越靠上。默认为 1.
2.3.8.2 StackPanel
  • Orientation 决定横向排列还是纵向排列;
  • 布局风格:垒积木
2.3.8.3 Canvas
  • Canvas.Top 、Canvas.Left;
  • 用于基本不改动、艺术性比较强、需要大量使用横坐标作为绝对定位、依赖横坐标的动画等场景;
  • 两个元素占据同一个位置时,跟 Grid 一样。
2.3.8.4 DockPanel
  • LastChildFill
2.3.8.5 WrapPanel
  • 流式布局,Orientation 默认 Horizontal:从左到右 从上到下。

WPF 基础 - 控件与布局的更多相关文章

  1. WPF基础控件

    1.所有基础控件结束(英文) http://www.dotnetperls.com/tooltip-wpf 2.wpf- DataGrid 常用属性和事件 3.

  2. WPF基础知识、界面布局及控件Binding(转)

    WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...

  3. WPF基础知识、界面布局及控件Binding

    WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...

  4. 《深入浅出WPF》学习总结之控件与布局

    一.控件到底是什么 控件的本质是“数据+算法”——用户输入原始数据,算法处理原始数据并得到结果数据.问题就在于程序如何将结果数据展示给用户.同样一组数据,你可以使用LED阵列显示出来,或者是以命令行模 ...

  5. WPF 的内部世界(控件与布局)

    目录 一.控件与布局 前言 为什么要写WPF呢? 我一开始算是比较抵触WPF的,因为用的人少吗.感觉都是窗体应用能和Winform有什么区别.可是我错了,非常感谢我的讲师,给我推荐刘铁猛的<深入 ...

  6. WPF第三方控件盘点

    WPF统一的编程模型.语言和框架,实现了界面设计人员和开发人员工作可以分离的境界,鉴于WPF强大的优势,且一直是开发者关注的地方,下面和大家分享基于WPF项目开发需要用到的第三方控件,包括业界最受好评 ...

  7. 深入浅出WPF-05.控件与布局

    控件与布局 突出特点:1.专门的UI设计语言XAML,无需像MFC那样使用编程语言设计UI.2.前几代在UI和数据交互方面是由消息Message到控件事件,始终是把UI控件放在主导位置而把数据放在了次 ...

  8. 创建 WPF 工具箱控件

    创建 WPF 工具箱控件 WPF (Windows Presentation Framework) 工具箱控件模板允许您创建 WPF 控件,会自动添加到 工具箱 安装扩展的安装. 本主题演示如何使用模 ...

  9. Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件

    最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下 1.UI控件与布局 常用的主要 ...

随机推荐

  1. 【一天一个基础系列】- java之泛型篇

    简介 说起各种高级语言,不得不谈泛型,当我们在使用java集合的时候,会发现集合有个缺点:把一个对象"丢进"集合之后,集合就会"忘记"这个对象的数据类型,当再次 ...

  2. anaconda + pyqt5 + pycharm 安装,测试

    1. 安装sip pip install sip 2.安装pyqt5 pip install PyQt5 pip install PyQt5-tools -i http://pypi.douban.c ...

  3. test markdown && 代码高亮

    #include<cstdio> #include<cstring> #include<queue> #include<vector> #include ...

  4. codeforces 7D

    D. Palindrome Degree time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. HDU 3681 Prison Break(状压DP + BFS)题解

    题意:一张图,F是起点,Y是必须要到的点,D不能走,G可以充电.可以往四个方向走,每走一步花费一个电,走到G可以选择充满电或者不充,每个G只能充一次.问你走遍Y的最小初始点亮.number(G) + ...

  6. sqli-libs(7) bool盲注

    首先打开网页后,发现页面显示outfile,  对不起,看不懂,  就直接加 ' 发现报错了 后来,查看源码得知 他是两个括号括起来的 我们就可以构造我们的payload了, 首先查询当前数据库的长度 ...

  7. C语言中函数的调用方式

    第一眼看到这样一个题目的我,心想除了如下的直接调用还能怎么调用呢? 1 void fun(void) 2 { 3 ...... 4 //你的代码 5 ..... 6 } 7 int main(void ...

  8. npm-run-all

    npm-run-all npm scripts https://www.npmjs.com/package/npm-run-all A CLI tool to run multiple npm-scr ...

  9. Transporter iOS App

    Transporter iOS App apple store app store connect https://appstoreconnect.apple.com/ Transporter &am ...

  10. IndexedDB All In One

    IndexedDB All In One https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API https://develope ...