zoukankan      html  css  js  c++  java
  • WPF学习二 布局

    合肥程序员群:49313181。    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入)
    Q  Q:408365330     E-Mail:egojit@qq.com

    所有界面程序开发都是从布局开始,好的布局让人善心悦目。对于Windows 开发人员设计用户界面的方法,WPF有重大的改进。WPF布局系统使用基于流布局标准。WPF使用XAML这种基于XML格式的文档定义去布局和做界面。它很好的使设计人员和Coder分开。这里给大家推荐一款很好的WPF设计人员使用的工具expression blend。这个可以设计出非常漂亮的WPF界面。功能当然比VS自带强大很多。

    WPF布局和之前的WinForm布局相比已经是一门艺术(个人见解)。做好了可以适应各种分辨率设备并且看起来更加好看,做不好就是奇丑无比。:)。而且WPF不学布局,我们很难开始编码。尝试下就知道差距有多大。

    在WPF中布局是一门比较专业的学问。和WinForm有着很大的区别。WPF中使用最为广泛的就是Grid。Grid控制面板是WPF种最强大的布局容器。Grid将元素分割到不可见的行列网格中。当然单元格中可以去放其它布局元素。在Grid布局的时候有这样一个原则就是没个单元格一个元素。

    新建一个WPF项目。

    因为Grid之强大和常用,所以WPF窗体默认就在Windows下加了Grid元素。对于生成的App.xaml暂时我们知道它相对于入口文件就行了,这里定义了初始窗口。

    自动添加的代码如下:

    <Window x:Class="WPFGrid.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            
        </Grid>
    </Window>

    这个很容易看出在Window节点下默认生成了Grid节点。首先我们需要定义行和列,在这里我们定义两行两列。

                <Grid DockPanel.Dock="Left" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  ShowGridLines="True">
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="206*"></ColumnDefinition>
                        <ColumnDefinition Width="845*"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                </Grid>

    分别定义了RowDefinitions和ColumnDefinitions。这样就会出现如图所示,我们可以将元素放置到相应的单元格中。

    那怎么将元素放入相应的单元格呢?可以通过Grid.Row和Grid.Column来设置元素所在行和列来设置单元格。这里我们不考虑布局的合理性。在做边第一列的两行上面放置一个树控件(我们这里很多控件是Dev控件,Dev控件就不做过多介绍。只介绍WPF自带控件)这样Grid中的布局代码就如下:

    <Grid DockPanel.Dock="Left" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  ShowGridLines="True">
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="206*"/>
                        <ColumnDefinition Width="845*"/>
                    </Grid.ColumnDefinitions>
                    
                    <dxg:TreeListControl Grid.Row="0" AutoPopulateColumns="True"  Grid.RowSpan="2" VerticalAlignment="Stretch"  HorizontalAlignment="Stretch">
                        <dxg:TreeListControl.Columns>
                            <dxg:TreeListColumn/>
                            <dxg:TreeListColumn/>
                            <dxg:TreeListColumn/>
                            <dxg:TreeListColumn/>
                            <dxg:TreeListColumn/>
                        </dxg:TreeListControl.Columns>
                        <dxg:TreeListControl.View>
                            <dxg:TreeListView ShowTotalSummary="True"/>
                        </dxg:TreeListControl.View>
                    </dxg:TreeListControl>
                </Grid>

     我们很容易看到TreeList控件中有Grid.Row="0",也就是让它在第一行。Grid.Column="0"。树被放在了第一行,第一列。但是其中有一个很重要的属性别忘了。我们这里跨行了,那么Grid.RowSpan=“2”就指明我们跨两行。VerticalAlignment="Stretch"  HorizontalAlignment="Stretch"这两个属性就是元素的横向布局和纵向布局都是平铺满。参照运行下图:

    之前我设置了Grid的属性ShowGridLines="True".就是让Grid有边框这样便于我们理解。Grid有Hight属性和Width属性。上面代码中RowDefinition 的height属性我没做设置,默认的是上下等分。也就是两行一样高。其实Height有几种设置。可以给一个固定值,例如Height="60",也可以是这样的形式Height="*",在本例子用我们可以将第一行设置成Height="60",第二行设置成Height="*".因为只有两行,这样有一个好处就是我们明确了第一行的高度,第二行就可以行分配剩下的作为高度。这样不需要人为去计算没一行的高度,我们将剩下的都作为一行就行了。ColumnDefinition的Width也有同样的设置方式。同样Grid有一个很好的属性。学过HTML的可能很好理解。一个Margin属性,设置元素的外边距,panding设置布局元素的内边距,是不是很熟悉。

    跨越行我们已经用过RowSpan它的值是跨越的行数。列也有同样的设置方式。

    对于Grid的基本应学会了。Grid一般用来做整体的布局,细微的布局和调整可能是其它元素,这有点类似于HTML早前的Table布局(现在DIV+CSS较多)。

    学到这里我们可以用Grid做基本的布局了。

    版权:归博客园和Egojit所有,转载请标明出处。
  • 相关阅读:
    [转]一键安装藏隐患,phpStudy批量入侵的分析与溯源
    Vue Cli安装以及使用
    全局安装 Vue cli3 和 继续使用 Vue-cli2.x
    [转]局域网共享一键修复 18.5.8 https://zhuanlan.zhihu.com/p/24178142
    DELPHI中千万别直接使用CreateThread ,建议使用BeginThread(在C++中无大问题,可是到了DELPHI中情况就不一样了)
    [转]【Delphi】 Thread.Queue与Synchronize的区别
    如何使用Windows Library文件进行持久化
    chromium中的性能优化工具syzyProf
    [转]室友靠打游戏拿30万offer,秘密竟然是……
    .NET中的三种Timer的区别和用法
  • 原文地址:https://www.cnblogs.com/egojit/p/3112009.html
Copyright © 2011-2022 走看看