WPF中使用Panel进行页面布局,Panel是一个抽象类,它作为所有Panel面板控件的基类。Panel并不是继承自Control类,而是直接从FrameworkElement继承。看Panel的继承关系:

Panel主要有以下这么几个派生类:Canvas、DockPanel、Grid、StackPanel、VirtualizingStackPanel、WrapPanel。下面分别对这几个面板控件进行描述:

一、Canvas

在Canvas区域中,通过指定相对于其的坐标来指定子控件的位置。总共可以设置四个位置的坐标:Left、Right、Top、Bottom。

1) Xaml中指定

在Xaml中,Canvas子元素是通过使用Canvas的附加属性进行设置的。看下面的代码:

<Canvas Name=”MyCanvas”>

<Button Name="Left10Top10" Canvas.Left="10" Canvas.Top="10" Width="110" Height="30">Left10Top10</Button>

<Button Name="Left10Bottom10" Canvas.Left="10" Canvas.Bottom="10" Width="110" Height="30">Left10Bottom10</Button>

<Button Name="Right10Top10" Canvas.Right="10" Canvas.Top="10" Width="110" Height="30">Right10Top10</Button>

<Button Name="Right10Bottom10" Canvas.Right="10" Canvas.Bottom="10" Width="110" Height="30">Right10Bottom10</Button>

</Canvas>

当Button元素中同时存在Canvas.Left和Canvas.Right时,按照Canvas.Left进行设置;同理,Canvas.Top和Canvas.Bottom同时存在时,按照Canvas.Top进行设置。

2) 在代码中设置

Button button = new Button();

button.Width = 20;

button.Height = 20;

this.MyCanvas.Children.Add(button);

Canvas.SetLeft(button, 20);

Canvas.SetTop(button, 20);

3) 最终效果图

二、DockPanel

DockPanel用于设置其子元素如何停靠。停靠的方式有以下四种:左边停靠(DockPanel.Left)、右边停靠(DockPanel.Right)、上面停靠(DockPanel.Top)、下边停靠(DockPanel.Bottom)。

1) 在Xaml中指定

在子元素中通过指定DockPanel.Dock属性来定位,这是一个附加属性。

<DockPanel Name="MyDockPanel">

<Button Name="btnTop" Width="50" Height="30" Content="Top" DockPanel.Dock="Top"></Button>

<Button Name="btnLeft" Width="50" Height="30" Content="Left" DockPanel.Dock="Left"></Button>

<Button Name="btnRight" Width="50" Height="30" Content="Right" DockPanel.Dock="Right"></Button>

<Button Name="btnBottom" Width="50" Height="30" Content="Bottom" DockPanel.Dock="Bottom"></Button>

</DockPanel>

2) 在代码中指定

//创建一个Button

Button button = new Button();

button.Width = 1;

button.Height = 1;

this.MyDockPanel.Children.Add(button);

//指定停靠位置

System.Windows.Controls.DockPanel.SetDock(button, Dock.Bottom);

其中SetDock就是用于设置子元素停靠在DockPanel中哪个位置的,它是一个静态方法。这个方法中虽然没有指定应该停靠到哪个DockPanel中,但是button按钮所在的DockPanel却是固定的,所以它会根据这一层关系去确定。

3) 最终效果图

三、Grid

Grid是通过自己定义行和列来绘制出一个表格。子元素可以通过指定显示在哪个行列单元格内来展现界面布局。

1) 在Xaml中指定

在Xaml中通过<RowDefinition>来定义多少行,通过<ColumnDefinition>来定义多少列。同时在子元素中通过指定Grid.Row和Grid.Column来表示其应该显示在第几行和第几列,这两个属性都是附加属性,并是从0开始计数。

<Grid Name="MyGrid">

<Grid.RowDefinitions>

<RowDefinition></RowDefinition>

<RowDefinition></RowDefinition>

<RowDefinition></RowDefinition>

</Grid.RowDefinitions>

<Grid.ColumnDefinitions>

<ColumnDefinition></ColumnDefinition>

<ColumnDefinition></ColumnDefinition>

</Grid.ColumnDefinitions>

<Button Name="btn1" Width="100" Height="30" Grid.Row="0" Grid.Column="0" Content="第一行第一列"></Button>

<Button Name="btn2" Width="100" Height="30" Grid.Row="0" Grid.Column="1" Content="第一行第二列"></Button>

<Button Name="btn3" Width="100" Height="30" Grid.Row="1" Grid.Column="0" Content="第二行第一列"></Button>

<Button Name="btn4" Width="100" Height="30" Grid.Row="1" Grid.Column="1" Content="第二行第二列"></Button>

</Grid>

2) 在代码中指定

Button btn5 = new Button();

btn5.Width = 100;

btn5.Height = 30;

btn5.Content = "第三行";

this.MyGrid.Children.Add(btn5);

System.Windows.Controls.Grid.SetRow(btn5, 2);

System.Windows.Controls.Grid.SetColumn(btn5, 0);

System.Windows.Controls.Grid.SetColumnSpan(btn5, 2);

代码中的SetRow用于设置子元素定位在Grid中的行,SetColumn用于设置子元素定位在Grid中的列。

同时还有一个SetColumnSpan,它用于干嘛呢?设置列的跨度,在这个列子中,本来它是显示在第三行第一列的,现在多了一个跨度,就好像把第三行中的两列合并为一列显示了。SetRowSpan也是这个道理,这里就不在描述了。

四、 StackPanel

StackPanel用于设置其子元素如何排列,是垂直排列还是水平排列,其是按直线方式排列。StackPanel的排列方式有两种:Vertical(默认)和Horizontal。

1) 在Xaml中指定

StackPanel的默认排列方式为Vertical(垂直),但是如果你想指定为水平Horizontal,那么你可以使用属性Orientation。

<Window.Resources>

<Style x:Key="border" TargetType="{x:Type Border}">

<Setter Property="Background" Value="DarkGreen"></Setter>

<Setter Property="BorderBrush" Value="White"></Setter>

<Setter Property="BorderThickness" Value="2"></Setter>

</Style>

<Style x:Key="textblock" TargetType="{x:Type TextBlock}">

<Setter Property="Foreground" Value="White"></Setter>

</Style>

</Window.Resources>

<StackPanel>

<Border Style="{StaticResource border}">

<TextBlock Text="A" Style="{StaticResource textblock}"></TextBlock>

</Border>

<Border Style="{StaticResource border}">

<TextBlock Text="B" Style="{StaticResource textblock}"></TextBlock>

</Border>

</StackPanel>

2) 在代码中指定

Border border = new Border();

border.Background = Brushes.DarkGreen;

border.BorderBrush = Brushes.White;

border.BorderThickness = new Thickness(2);

this.myStackPanel.Children.Add(border);

TextBlock textBlock = new TextBlock();

textBlock.Foreground = Brushes.White;

textBlock.Text = "C";

border.Child = textBlock;

3) 最终效果图

五、 VirtualizingStackPanel

VirtualizingStackPanel在普通StackPanel的基础上,提供了”虚拟化”的功能。那什么是”虚拟化”呢?先来看一个场景,如果你有一堆基于项的数据,并且你只需要让其中一部分显示在界面上,但是如果你针对里面所有的数据创建界面元素,并显示你需要的元素,那么这将是及其耗时的。”虚拟化”就是用于解决这个问题,它可以只创建你需要显示的数据的界面元素。

VirtualizingStackPanel中的项只有在数据绑定的状态下,才提供”虚拟化”,否则和普通的StackPanel没有区别。

1) 在Xaml中指定(刚刚测试成功,补上代码,但仍有纳闷之事)

对于我测试的2000个项来说,使用<VirtualizingStackPanel>响应是毫秒级的,但是默认的方式至少要3秒中,提升比较明显。

<StackPanel Orientation="Horizontal">

<ComboBox Height="23" Name="personList" Width="120">

<ComboBox.ItemsPanel>

<ItemsPanelTemplate>

<VirtualizingStackPanel>

</VirtualizingStackPanel>

</ItemsPanelTemplate>

</ComboBox.ItemsPanel>

<ComboBox.ItemTemplate>

<DataTemplate>

<TextBlock Text="{Binding Path=Name}"></TextBlock>

</DataTemplate>

</ComboBox.ItemTemplate>

</ComboBox>

<Button Height="23" Name="button1" Width="75"Click="button1_Click">加载成员</Button>

</StackPanel>

这里的关键点是在<ItemPanel>里把ComboBox的默认的<StackPanel>换成<VirtualizingStackPanel>。

但是,如果我通过VirtualizingStackPanel.IsVirtualizing="True"去设定的话,确没有任何效果。如果哪位知道原因,请告知。

后台代码中需要先创建一个类Person,只有一个属性Name。太简单了,代码就不贴了。

在Window窗口的后台代码中,创建一个List<Person>,用于保存临时成员,然后把它赋给ComboBox。

List<Person> persons = new List<Person>();

for (int i = 0; i < 2000; i++)

{

Person person = new Person();

person.Name = i.ToString();

this.persons.Add(person);

}

this.personList.ItemsSource = persons;

六、 WrapPanel

WrapPanel用于在对平方向或垂直方向顺序定位子元素,当到达边缘时,则换行从新开始。

1) 在Xaml中指定

WrapPanel的默认方向就是水平的,其实这边可以不填写。如果你要使用垂直,那就要指定为Orientation="Vertical"。水平方向是根据Width来换行的,垂直方向就是根据Height来换行。

<WrapPanel Name="myWrapPanel" Width="200" Orientation="Horizontal">

<Button Width="50" Height="25">宽度50</Button>

<Button Width="150" Height="25">宽度150</Button>

<Button Width="100" Height="25">宽度100</Button>

<Button Width="101" Height="25">宽度101</Button>

</WrapPanel>

2) 在代码中指定

Button button1 = new Button();

button1.Width = 50;

this.myWrapPanel.Children.Add(button1);

3) 最终效果图

WPF中的布局控件(转)的更多相关文章

  1. 在WPF中使用WinForm控件方法

    1.      首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll. 2.      在要使用WinForm控 ...

  2. [转]在WPF中使用WinForm控件方法

    本文转自:http://blog.csdn.net/lianchangshuai/article/details/6415241 下面以在Wpf中添加ZedGraph(用于创建任意数据的二维线型.条型 ...

  3. WPF中的image控件的Source赋值

    WPF中的Image控件Source的设置 1.XAML中 简单的方式(Source="haha.png"); image控件的Source设置为相对路径后(Source=&quo ...

  4. 在WPF中调用Winform控件

    最近在项目中用到了人脸识别和指纹识别,需要调用外部设备和接口,这里就用到了在WPF中调用Winform控件. 第一步,添加程序集引用.System.Windows.Forms和WindowsForms ...

  5. WPF中的ControlTemplate(控件模板)(转)

    原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/28/690993.html WPF中的ControlTemplate(控件模板)     ...

  6. WPF中的ControlTemplate(控件模板)

    原文:WPF中的ControlTemplate(控件模板) WPF中的ControlTemplate(控件模板)                                             ...

  7. [转]WPF中的ControlTemplate(控件模板)

    WPF中的ControlTemplate(控件模板)                                                                           ...

  8. WPF中动态改变控件显示位置

    转自 http://blog.csdn.net/lassewang/article/details/6928897 测试环境: Windows XP/Windows 7 开发环境: Microsoft ...

  9. WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件

    在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...

随机推荐

  1. hdu 5567 sequence1(水)

      问题描述 给定长度为n的序列a,求有多少对i,j(i<j),使得∣ai−aj∣ mod b=c 输入描述 若干组数据(大概5组). 每组数据第一行三个整数n(≤n≤),b,c(≤c<b ...

  2. .NET委托:一个关于C#的睡前故事 【转】

    紧耦合 从前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺.但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道彼得的工作进度,以防止他偷懒.但是彼得又不想让老板呆 ...

  3. dojo demo, server验证username是否已经被使用

    这个demo有助于理解JS与server的协同工作. 文档结构如上图.  主要是三个文件: main.js  table.html validateUserName.jsp (代码见文章末尾) 页面打 ...

  4. opengl笔记——旋转,一段代码的理解

    重看:opengl笔记——OpenGL好资料备忘 在找到这段代码,对理解opengl旋转很有帮助 ... glPushMatrix(); // initialze ModelView matrix g ...

  5. Android中绘制圆角矩形图片及任意形状图片

    圆角矩形图片在苹果的产品中很流行,相比于普通的矩形,很多人都喜欢圆角矩形的图片,因为它避开了直角的生硬,带来更好的用户体验,下面是几个设计的例子: 下面在Android中实现将普通的矩形图片绘制成圆角 ...

  6. LeetCode Day4——Factorial Trailing Zeroes

    /* * Problem 172: Factorial Trailing Zeroes * Given an integer n, return the number of trailing zero ...

  7. C#整理6——数组的应用

    数组的应用:(一).冒泡排序.1.冒泡排序是用双层循环解决.外层循环的是趟数,里层循环的是次数.2.趟数=n-1:次数=n-趟数.3.里层循环使用if比较相临的两个数的大小,进行数值交换. 作业:1. ...

  8. 使用fat jar和exe4j把java程序打包成exe执行文件---转载的

    java应用编写测试好之后都是jar包或class文件,客户拿到这个东西后一般是不会java开发者那样在命令窗口下面输入运行的.客户要求的就是直接点击应用名称运行.java在方面做得很不友好,开发人员 ...

  9. Android学习之listview的下拉刷新、上拉载入

    本例是在上例的基础上完成的.本例实现的listview上拉载入.下拉刷新功能,是在开源网站上别人写好的listview,主要是对listview的控件进行重写,添加了footer和header. 1. ...

  10. 前端公共库cdn服务推荐//提高加载速度/节省流量

    前端公共库cdn服务推荐,使用可以提高js库加载速度同时也可以节省自己空间的流量,CDN加速公共库虽好,不过一定要使用靠谱的前端cdn服务提供方. 以下整理出比较靠谱的国内cdn加速服务器.排名不分先 ...