WPF知识点全攻略04-XAML页面布局

名称 说明
Canvas 使用固定坐标绝对定位元素
StackPanel 在水平或竖直方向放置元素
DockPanel 根据外部容器边界,自动调整元素
WrapPanel 在可换行的行中放置元素
Grid 根据不可见的表格在行和列中排列元素,最常用
UniformGid 在不可见的相同尺寸的表格中放置元素

1、Canvas布局

<Canvas>
<Rectangle Canvas.Left="50" Canvas.Top="50" Width="50" Height="50" Fill="Red" />
<Rectangle Canvas.Left="120" Canvas.Top="50" Width="50" Height="50" Fill="Yellow" />
<Rectangle Canvas.Left="190" Canvas.Top="50" Width="50" Height="50" Fill="Green" />

<Rectangle Canvas.Left="50" Canvas.Top="150" Width="50" Height="50" Fill="Red" Panel.ZIndex="2"/>
<Rectangle Canvas.Left="75" Canvas.Top="170" Width="50" Height="50" Fill="Yellow" Panel.ZIndex="1" />
<Rectangle Canvas.Left="100" Canvas.Top="190" Width="50" Height="50" Fill="Green" Panel.ZIndex="1"/>
</Canvas>

通过 Canvas.Left、Canvas.Top、Canvas.Right、Canvas.Bottom设置控件显示位置,通过Panel.ZIndex设置显示优先层级。

Canvas的强大之处,当然不仅仅只是简单显示。

<Canvas>
    <Canvas.Resources>
        <PathGeometry x:Key="path" Figures="M 10,100 C 35,0 135,0 160,100 180,190 285,200 310,100" />
        <Storyboard x:Key="pathStoryboard">
            <MatrixAnimationUsingPath
                DoesRotateWithTangent="True"
                PathGeometry="{StaticResource path}"
                RepeatBehavior="Forever"
                Storyboard.TargetName="ButtonMatrixTransform"
                Storyboard.TargetProperty="Matrix"
                Duration="0:0:5" />
        </Storyboard>
    </Canvas.Resources>

    <Canvas.Triggers>
        <EventTrigger RoutedEvent="Control.Loaded">
            <BeginStoryboard Storyboard="{StaticResource pathStoryboard}" />
        </EventTrigger>
    </Canvas.Triggers>

    <Path
        Data="{StaticResource path}"
        Stroke="Black"
        StrokeThickness="1" />

    <Ellipse
        Width="20"
        Height="20"
        Fill="Red">
        <Ellipse.RenderTransform>
            <MatrixTransform x:Name="ButtonMatrixTransform" />
        </Ellipse.RenderTransform>
    </Ellipse>
</Canvas>

使用Canvas可以让小球沿着path路径运行,若使用其他布局控件,则会出现定位问题。在对显示位置有精确要求的地方,可以考虑使用Canvas布局。比如这种显示报表。

2、StackPanel布局

<StackPanel Orientation="Vertical">
    <Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
    <TextBlock Margin="5" Text="Orientation=&quot;Vertical&quot;" HorizontalAlignment="Center"></TextBlock>
</StackPanel>
<StackPanel Orientation="Horizontal">
    <Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
    <TextBlock Margin="5" Text="Orientation=&quot;Vertical&quot;" VerticalAlignment="Center"></TextBlock>
</StackPanel>

StackPanel面板控件有定义附加属性,通过Orientation可以控制布局是左右还是上下分布,FlowDirection属性可以调整显示左右,即从左至右,或从右至左。

StackPanel内部控件,可以通过VerticalAlignment、HorizontalAlignment、Margin来控制显示位置。

一般使用在布局几个关联性较强的控件之间(个人使用习惯,欢迎指正),如页面顶部导航条中多个图标按钮分布、文本输入时TextBlock(标题)+TextBox(内容)的组合等等。

3、DockPanel布局

<DockPanel>
    <Button Content="Left" DockPanel.Dock="Left" />
    <Button Content="Top" DockPanel.Dock="Top" />
    <Button Content="Right" DockPanel.Dock="Right" />
    <Button Content="Bottom" DockPanel.Dock="Bottom" />
    <Button Content="Nomal" />
</DockPanel>

<DockPanel LastChildFill="False">
    <Button Content="Left" DockPanel.Dock="Left" />
    <Button Content="Top" DockPanel.Dock="Top" />
    <Button Content="Right" DockPanel.Dock="Right" />
    <Button Content="Bottom" DockPanel.Dock="Bottom" />
    <Button Content="不填充" />
</DockPanel>

DockPanel通过附加属性DockPanel.Dock控制内容停靠上下左右方向上,最后一个通过LastChildFill控制是否填充剩余空间(默认填充)。

DockPanel在生产用软件中有这个不错的使用场景,类似VS的停靠。对于工业生产软件多个流程模块的调用和隐藏比较适用。

4、WrapPanel布局

<WrapPanel Orientation="Vertical">
    <Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
</WrapPanel>

<WrapPanel>
    <Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
    <Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
</WrapPanel>

WrapPanel可以根据所在容器大小,自动换行显示,类似windows 文件管理平铺时的效果。

WrapPanel是最常用作Items控件的项目面板。在ListBox显示方式不满足需求的情况下,可以定义如下样式:

<ListBox>
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

5、Grid布局

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="60"></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition MaxWidth="60"></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Border Grid.Row="0" Grid.Column="0" Background="Red"/>
    <Border Grid.Row="0" Grid.Column="1" Background="Yellow"/>
    <Border Grid.Row="0" Grid.Column="2" Background="Green"/>
    <Border Grid.Row="1" Grid.ColumnSpan="2" Grid.Column="0" Background="Beige"/>
</Grid>

Grid是最常用的一种布局面板,通过Grid.RowDefinitions设置行数量,通过Grid.ColumnDefinitions设置列数量。元素通过Grid.Row和Grid.Column列定位到指定行列单元格中,也可以通过Grid.RowSpan和Grid.ColumnSpan显示在多个单元格中。

Grid的行列宽高是可以随意设置的,可以直接设置数值Width="100"、设置自适应Width="Auto"、设置比例Width="1*",再通过MinWidth,MaxWidth等控制行列高度宽度灵活显示。

第一种,固定长度——宽度不够,会裁剪,不好用。单位pixel。 
第二种,自动长度——自动匹配列中最长元素的宽度。 
第三种,比例长度——*表示占用剩余的全部宽度;两行都是*,将平分剩余宽度;像上面的一个2*,一个*,表示前者2/3宽度

Grid可以通过ShowGridLines属性显示分割线。

6、UniformGrid布局

<UniformGrid Columns="2" Rows="2">
    <Border Background="Red"/>
    <Border Background="Yellow"/>
    <Border Background="Green"/>
    <Border Background="Beige"/>
</UniformGrid>

UniformGrid可以通过Columns和Rows来设置列行数,每个单元格的大小是固定的,也无法指定直接显示到某个单元格。在不设置行列数时,会根据其中元素的数量,自动分配行列显示。

一般在设计UI显示比较明确时,可以通过UniformGrid快速布局。

原文地址:https://www.cnblogs.com/kuangxiangnice/p/11043354.html

时间: 2024-10-28 14:59:19

WPF知识点全攻略04-XAML页面布局的相关文章

WPF知识点全攻略06-WPF逻辑树(Logical Tree)和可视树(Visual Tree)

介绍概念之前,先来分析一段代码: xaml代码如下: <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsof

WPF知识点全攻略07- 数据绑定(Binding)

数据绑定是WPF不得不提,不得不会系列之一 数据绑定简言之,就是把数据源的数据绑定到目标对象的属性上.目标对象可以是承自DependencyProperty的任何可访问的属性或控件,目标属性必须为依赖属性(下节讲),数据源可以是其他控件的属性,可以是对象实例.XAML 元素.ADO.NET Dataset.XML数据. 数据绑定的重点属性- Mode属性: MSDN给出如下图标记了三种你来我往的数据流向.比较简单,看图就能明白. 数据绑定的重点属性- UpdateSourceTrigger属性:

WPF知识点全攻略05-XAML内容控件

此处简单列举出布局控件外,其他常用的控件: Window:WPF窗口 UserControl:用户控件 Page:页 Frame:用来浏览Page页 Border:嵌套控件,提供边框和背景. Button:按钮控件 Calendar:日历.挂历 CheckBox:多选控件 ComboBox:下拉控件 ContentControl:内容控件,可以用于加载自定义UserControl控件 DataGrid:数据列表控件 DatePicker:日期选择器 DocumentViewer:文档查看,可以用

前台页面优化全攻略(三)

经过前两篇文章的实践,你的网站加载速度一定有了非常明显的变化.能把实践跟到这篇文章的人想必一定是极客中的极客.如果你仍对网站的加载速度不满意,可以看看再尝试一下本文中几近疯狂的终极优化方案. 你可以对网站进行快速的优化,但网站日常的节食却很难.也许你已经花了很大的力气去优化你的CSS和JavaScript代码,但是你所做的努力马上又会因为老板或客户期望的新功能而付之东流.所以看来不论是人还是网页,减肥都贵在坚持. 这篇终极减肥方案可能不适合所有的网站,但是我相信它可以引起你对网页大小的重视. 1

前台页面优化全攻略(四)

通过前几篇文章,你应该已经掌握了很多优化网站的方法.现在你的网站加载速度已经很快了,但是你必须持续的监控你的网站,了解它的大小变化,要不然一段时间过去之后,它可能又成为了一个胖子. 如今每个页面平均已经达到1.7M,每年增长大概32%.你可以通过以下几个工具来查看你的网站是不是又在暴饮暴食,而且它们都是免费的. 1. Pingdom Pingdom是我喜欢的一个在线测试工具.它会揭露出所以你想知道的细节,你可以一清二楚的看到网站的现状:重量.加载速度.代码分析.性能评分.开发者建议,它还提供了一

页面数据绑定全攻略

在做Web开发时,都会遇到将后台的数据显示在前台页面的情况.几种比较典型的应用实例: 方法1:<%#%> 后台代码: namespace WebApplication3{    public partial class Index : System.Web.UI.Page    {        public string name = "ltp";        public string sex = "man";        public stri

【转载】前台页面优化全攻略-系列博文

据调查,网页大小在2013年平均增长了32%,平均达到了1.7M,单独的HTTP请求达到96个.这是令人震惊的数字,而且这只是个平均值,有一半的网站会大于这个值.网站也得了肥胖症,而我们这些开发者就是罪魁祸首. 本文转载博客园系列博文,博文如下: 前台页面优化全攻略(一) 前台页面优化全攻略(二) 前台页面优化全攻略(三) 前台页面优化全攻略(四)

前台页面优化全攻略(四)

如今每个页面平均已经达到1.7M,每年增长大概32%.你可以通过以下几个工具来查看你的网站是不是又在暴饮暴食,而且它们都是免费的. 1. Pingdom Pingdom是我喜欢的一个在线测试工具.它会揭露出所以你想知道的细节,你可以一清二楚的看到网站的现状:重量.加载速度.代码分析.性能评 分.开发者建议,它还提供了一个历史的时间轴帮你查看网站瘦身的成果.如果你只想用一个工具完成所有的检测,Pingdom再合适不过了. 2. Firefox Web Developer Add-on Web De

fiddler Android下https抓包全攻略

fiddler Android下https抓包全攻略 fiddler的http.https的抓包功能非常强大,可非常便捷得对包进行断点跟踪和回放,但是普通的配置对于像招商银行.支付宝.陌陌这样的APP是抓不到包的,需要一些特殊的配置,本文把fiddler Android下https抓包的详细配置都罗列出来,供大家参考. 一.普通https抓包设置 先对Fiddler进行设置: 勾选“CaptureHTTPS CONNECTs”,接着勾选“Decrypt HTTPS traffic”.同时,由于我