wpf 是数据驱动ui,数据是核心,是主动的,ui从属于数据并表达数据,是被动的 我们用ui元素响应用户的操作,wpf把那些能够展示数据,响应用户操作的ui元素称为控件control
在wpf中,我们关注的是抽象的数据和行为而不是控件的具体形象。 日常生活中经常遇到的控件,有6类: 1.布局控件 Grid ,StackPanel,DockPanel 父类是panel 2.内容控件 只能容纳一个其他空间或者布局控件作为他的内容,window,button 3.带标题内容控件 4.条目控件 可以显示一列数据,一般情况这列数据的类型相同 listBox,ComBox 他们的共同基类是ItemsControl 5.带标题条目控件 可以把控件想象成一个容器,容器里面装的东西就是它的内容,控件的内容可以是数据也可以是控件,若是控件的话,就 形成了树形结构,称为逻辑树(logical tree) wpf 控件往往由更基本的控件组成,这棵树为可视元素树。
控件是内存中的对象,其内容也是内存的对象 内容属性有自己确切的名称:有的叫content 有的叫child 各类内容模型详解
1 contentControl button是这类,只能由一个元素充当内容 如,一个button内容既有内容又有图片是不行的 但是我们可以用一个包含多个元素布局控件包装他们就可以了。再用这个布局控件作为button内容就可以了 2. HeaderedContentControl 族
内容属性为content和header 无论是哪一个,都只能容纳一个元素作为他的内容 3.ItemsControl 用于显示列表化数据 内容属性为item或者itemsource 典型是listbox 4.HeaderedItemsControl 族 内容属性为items,itemSource,Header 本族控件只有3个 menuItem,TreeViewItem,ToolBar 5.decorator 起ui装饰作用 内容属性为child 只能由单一元素充当内容 6.TextBlock 和TextBox Textblock 只显示文本,不能编辑,静态文本,但可以使用丰富的印刷级的格式控制标记显示转移的排版效果 7.Shape元素 他们只是简单的视觉元素,不是控件,他们没有自己的内容,用fill属性为他们设置填充效果 可以用stroke属性为他们设置边线效果 8.Panel 族 内容属性为children 内容可以是多个元素,panel元素将控制他们的布局 布局: 布局元素: grid stackpanel canvas dockpanel wrappanel(自动折行面板)类似HTML中的流式布局
Grid 类 具有columnDefinitions 和RowDefinition 2个属性 他们分别是 columnDefinitions 和RowDefinition 的集合。 绝对值: double数值加单位后缀 比例值: double数值加一个星号 自动值:字符串加auto
比例的最大特点是ui的整体尺寸改版后,会保持固有的比例 Grid ShowGridLines="true" grid 布局 一个常见的错误: margin 指可视化元素四周距离其容器的距离 按照 左上右下 一般性布局 height+width+margin 就可以了 如果布局复杂,就不推荐用这个方法。 Grid.rowspan="行数" 若控件需要跨多个行或者列就这样做。 这类依控件所处环境而被容器附加上的属性有个专门的名字===附加属性。 如果把两个元素放在grid的同一个单元格内,则代码中后书写的元素将覆盖原来先写的代码,要把 盖的元素显示出来 ,可以用visibility设置为hidden或collapsed(收缩) 也可以把opacity属性设置为0 3. StackPanel 控件 orientation HorizontaAlignment 和VerticalAlignment 三个属性组合出各种排列和对齐方式 4.canvas 如果布局以后不会改变并且窗体尺寸固定,不然还是用grid布局弹性更好 5.dock panel 停靠面板 他有一个重要的属性 bool类型的lastchildfill,它的默认是true,当 lastchildfill 属性为true,则dockpanel内最后一个元素dockpanel。dock属性会被忽略 dock 枚举类型没有fill这个值
"WpfApplication3.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> "25"/> "150"/> "Auto"/> "3" BorderBrush="Black"/> "1" BorderBrush="Black"/> "1" Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Center" Width="5" Background="Gray" ShowsPreview="True"/> "1" Grid.Column="2" BorderBrush="Black"/>
6.wrappanel 采用流式布局 wrappanel属性来控制流延伸的方向,wrappanel会排列尽可能多的控件,排不下的控件将会新起一行或列继续排列 改变窗体的尺寸,wrappanel会调整内部控件的排列