WPF/C#学习笔记.1:WPF中的布局TabControl,Grid与GridSpliter等

WPF/C#学习笔记.1

WPF中的布局TabControl,Grid与GridSpliter等


WPF布局原则

由于WPF窗体中只能包含单个元素。为了在WPF窗体中放置多个元素,需要在窗体中布置一个容器(TablControl,StackPanel,Grid等,其中Grid是WPF中功能最强大的布局控件),然后在这个容器中添加别的元素。

核心布局面板

  • StackPanel 在水平或者垂直的堆栈中放置元素。这个布局容器通常用于更大更复杂的窗体中的一些小区域。
  • WrapPanel 在一系列可换行的行中放置元素(默认):在水平(行)方向上,从左向右放置条目;在垂直(列)方向上,自上而下放置条目。
  • DockPanel 根据容器的整个边界调整条目。
  • Canvas 使用固定坐标绝对定位元素,不适合用于尺寸可变的窗口。一般用于图形绘制,可以在其外层再布置一个ViewBox以实现对Canvas中的图形动态地等比例缩放。
  • Grid 根据不可见的表格在行和列中排列元素,这是最灵活和最常用的容器之一。
  • GridSplitter Grid面板的分割条,用以实现让用户在使用APP时自己通过拖动分割条动态地决定各个部分占据窗体的比例。可以与别的元素共享一个表格单元,更好的方法是预留一列或一行来放置分割条,并将预留列或行的Width或Height的属性设置为auto。

容器修饰与封装

  • Border 装饰元素只能包含一段嵌套内容(通常是布局面板),并为其添加背景或在其周围添加边框(必须设置其BorderBrushBorderThickness属性才会显示边框效果)。
  • ScrollViewer 可以包含任何内容通常用于封装布局容器,使得面板可以滚动以查看超出当前显示范围的内容。

WPF代码实例

<Window x:Class="PowerFlight.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PowerFlight"
        mc:Ignorable="d"
        Title="PowerFlight" Height="768" Width="1366" Icon="Image/Airplane.ico">
    <TabControl TabStripPlacement="Left" Margin="3" >
        <TabItem Header="Simulator">
            <Grid ShowGridLines="False" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto" /> 
                    <ColumnDefinition Width="2*" />
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="8*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="2*"/>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="3*"/>
                </Grid.RowDefinitions>
                
<!-- Element in Grid.Column="0" -->
                <Border Grid.Column="0" Grid.Row="0" Grid.RowSpan="3" Margin="3" 
                        BorderBrush="#FFACACAC" BorderThickness="1" >
                    <TextBlock Margin ="3" FontSize="20" Text="This is auto width"/>
                </Border>
<!-- End of Element in Grid.Column="0" -->
                
<!-- Element in Grid.Column="1" -->
                <Border Grid.Column="1" Grid.Row="0" Margin="0,3,0,0" 
                        BorderBrush="#FFACACAC" BorderThickness="1" >
                    <DockPanel LastChildFill="True">
                        <Label DockPanel.Dock="Top" FontSize="20" Content="This 2* weight"/>
                        <TextBlock Padding="2" Margin="3" TextWrapping="Wrap">
                            xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                        </TextBlock>
                    </DockPanel>
                </Border>

                <GridSplitter Grid.Column="1" Grid.Row="1" Height="3"                              
                              VerticalAlignment="Center" HorizontalAlignment="Stretch"
                              ResizeDirection="Rows" Opacity="0" />

                <Border  Grid.Column="1" Grid.Row="2"  Margin="0,0,0,3" 
                         BorderBrush="#FFACACAC" BorderThickness="1" >
                    <ScrollViewer HorizontalScrollBarVisibility="Auto"
                                  VerticalScrollBarVisibility="Auto">
                        <StackPanel Margin="3,6,3,6" >
                            <Label Content="This 2* weight"/>
                            <TextBlock Margin="3" FontSize="20" >
                            xxxxxxxxxxxxxxxxxxxxxxxxxxxx
                            </TextBlock>
                        </StackPanel>
                    </ScrollViewer>
                </Border>
<!-- End of Element in Grid.Column="1" -->
                
                <GridSplitter Grid.Column="2" Grid.RowSpan="3" Width="3"
                              VerticalAlignment="Stretch" HorizontalAlignment="Center"
                              Opacity="0"/>

<!-- Element in Grid.Column="3" -->
                <Border Grid.Column="4" Grid.Row="0" Grid.RowSpan="3"  Margin="0,3,3,3" 
                        BorderBrush="#FFACACAC" BorderThickness="1" >
                    <TextBlock FontSize="20" Text="This 8* weight"/>
                </Border>
<!-- End of Element in Grid.Column="3" -->
                
            </Grid>
        </TabItem>
<!-- End Of TabItem Heardear="Simulator" -->
        
        <TabItem Header="Data">
        </TabItem>
        
    </TabControl>
</Window>

布局结果

  • 拉伸前
  • 拉伸后

Tips

通用属性

  • Margin Margin="3" 在元素四周添加Thickness=new Thickness(3,3,3,3)的空间;Margin="0,3,0,0" 在元素四周添加Thickness=new Thickness(0,3,0,0)(顺序依次为:左,上,右,下)的空间。
  • Padding 定义元素的内边距,例如TextBlock中的文本距离其边框的距离
  • Opacity 不透明系数1-->0(完全透明)

TabControl

  • TabStripPlacement 设置选项卡的停靠位置

TabItem

  • Header 选项卡中显示的文本

Grid

  • ShowGridLines 是否显示网格虚线
  • ColumnDefinition Width="auto",列的宽度取决于其中所包含的最大元素的宽度;Width="2"/Width="8",列的宽度占未定义的剩余宽度的权重为2/8,若只有这两个列分割剩下的宽度,则宽度切割为2+8=10份,这两个列分别占2份和8份。行高度(Height)的定义与之相同。

Grid子元素属性

  • Grid.Column="1" Grid.Row="0" 该子元素占据Grid的行1列0。
  • Grid.RowSpan="3"/Grid.ColumnSpan="2" 该子元素穿越Grid的3列/2行布置。

GridSplitter

  • VerticalAlignment/HorizontalAlignment GridSplitter外观在垂直/水平方向上的对齐与拉伸
  • ResizeDirection ="Rows"/="Columns" GridSplitter对表格的调整方向

DockPanel

  • LastChildFill 最后一个子元素占据DockPanel的所有剩余空间。

DockPanel子元素属性。

  • DockPanel.Dock 子元素在DockPanel中的位置。

ScrollViewer

  • HorizontalScrollBarVisibility/VerticalScrollBarVisibility ="Auto",APP运行时根据其中具体元素大小自行决定是否启用滚动条。

TextBlock

  • TextWrapping 定义当前句子超出文本框时文本框的行为(=“Wrap”,自动排版到下一行)。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,721评论 1 92
  • 前言 温馨提示:本文较长,图片较多,本来是想写一篇 CSS 布局方式的,但是奈何 CSS 布局方式种类太多并且实现...
    sunshine小小倩阅读 3,111评论 0 59
  • 简介CSS网格布局(又称“网格”),是一种二维网格布局系统。CSS在处理网页布局方面一直做的不是很好。一开始我们用...
    _leonlee阅读 64,863评论 25 173
  • 简介 CSS Grid布局 (又名"网格"),是一个基于二维网格布局的系统,旨在改变我们基于网格设计的用户界面方式...
    咕咚咚bells阅读 2,476评论 0 4
  • 1、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 ...
    Moment__格调阅读 4,457评论 0 11