WPF 布局

最近项目需要,使用WPF编制一些简单的工具。现在将学习和使用过程中的一些体会记录下来,作为备忘。

WPF的布局与Bootstrap 的网格布局有些类似,通过使用Grid将区域划分为若干网格,然后在网格中放置控件。WPF的控件属性与WinForm的有相似的地方,都可以在后台代码中修改属性的内容,也可以在页面描述中定义模板和需要与后台模型的绑定属性。所不同的是WPF中控件模板的定义更灵活,但同时也更复杂,绑定功能更强大,但同时语法也更复杂。这里简单总结一下,便于以后查询应用。

Grid布局

使用Grid嵌套进行布局,可以定义基本的页面,下面的布局是基本的布局样式:

<Window x:Class="WpfLayout.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:WpfLayout"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <!--定义Grid的行,定义2行-->
            <!--第一行放Toolbar-->
            <RowDefinition Height="40"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <!--定义Grid的列,定义1列-->
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <ToolBar Grid.Column="0" Grid.Row="0">
            <Button>
                <Image   Source="Images/ToolbarImg/File.png" Width="32" Height="32"></Image>
            </Button>
        </ToolBar>
        <Grid  Grid.Column="0" Grid.Row="1">
            <Grid.RowDefinitions>
                <!--定义Grid的行,定义1行-->
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <!--定义Grid的列,定义2列-->
                <ColumnDefinition Width="200"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Border Grid.Row="0" Grid.Column="0" BorderThickness="0" >
                <TreeView >

                </TreeView>
            </Border>
            <GridSplitter Width="5"> </GridSplitter>
            <Border Grid.Row="0" Grid.Column="1" Width="auto"  >
                <Grid >

                </Grid>
            </Border>
        </Grid>
    </Grid>
</Window>

DockPanel布局

需要注意的是:DockPanel布局中最后一个控件填充剩余区域,而不是按从上到下的顺序:

<Grid>
        <DockPanel>
            <!--停靠布局,让菜单栏和工具栏位于窗口顶部-->
            <Menu DockPanel.Dock="Top">
                <MenuItem Header="File">
                    <!--菜单项为MenuItem,文字使用属性 Header-->
                    <MenuItem Name="menuOpen" Header="Open" Click="menuOpen_Click"></MenuItem>
                    <MenuItem Header="Save"></MenuItem>
                    <MenuItem Header="Delete"></MenuItem>
                </MenuItem>
                <MenuItem Header="Edit"></MenuItem>
                <MenuItem Header="View"></MenuItem>
                <MenuItem Header="About"></MenuItem>
            </Menu>
            <ToolBar DockPanel.Dock="Top">
                <!--ToolBar和StatusBar就是一个容器-->
                <Button Content="Save"></Button>
                <Button Content="SaveAll"></Button>
                <Button Content="FileExplorer"></Button>
                <Button Content="Start"></Button>
                <Button Content="Test"></Button>
            </ToolBar>
            <StatusBar  DockPanel.Dock="Bottom"  >
                 <TextBlock Text="statusBar"></TextBlock>
            </StatusBar>
            <!--Grid最后加入,填充剩余区域-->
            <Grid>
                
            </Grid>
            
        </DockPanel>
    </Grid>

Canvas

支持坐标定位,在控件中使用Canvas.Left,Canvas.Top,Canvas.Right和Canvas.Bottom进行定位。

StackPanel

顺序排列控件,横向或者纵向,设置Orientation属性为Horizontal或Vertical。

WrapPanel

可以规定控件具有统一的宽度和高度,并且超出范围可以换行,也支持横向或纵向排列。

  • Orientation:这就像StackPanel中的Orientation属性,唯一不同的是默认值为Horizontal。当Horizontal Orientation看上去类似于Windows资源管理器的缩略图视图:元素是从左向右排列的,然后自上至下自动换行。Vertical Orientation看上去类似于Windows资源管理器的列表视图:元素是从上向下排列的,然后从左至右自动换行。
  • ItemHeight:所有子元素都一致的高度。每个子元素填充高度的方式取决于它的VerticalAlignment属性、Height属性等。任何比ItemHeight高的元素都将被截断。
  • ItemWidth:所有子元素都一致的宽度。每个子元素填充高度的方式取决于它的VerticalAlignment属性、Width属性等。任何比ItemWidth高的元素都将被截断。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • WPF布局原则 不应显示设置大小 为了布局的稳定性,控件的大小应该可以自动适应容器。如下为新建一个窗体,默认包含一...
    东南有大树阅读 19,643评论 3 12
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,728评论 0 17
  • CSS Grid(网格) 布局(又称为 “Grid(网格)” ),是一个二维的基于网格的布局系统它的目标是完全改变...
    诺CIUM阅读 5,059评论 0 3
  • 文/樊梦洁 人不是孤岛,就算是岛,它也在大洋的底部跟世界发生着关联。 01 我体型偏瘦,鉴于天生的优势,在自己的朋...
    樊饭饭阅读 4,930评论 21 21
  • 春风十里扬州路,卷上珠帘总不如。
    扎西多吉阅读 676评论 0 0