WPF中的控件布局

            WPF中的控件布局<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

                                                                                   周银辉

 

.Net3.0使用Panel来进行布局.其中继承于Panel5中布局版面包括:  Canvas,  DockPanel,  Grid,  StackPanel,  VirtualizingStackPanel,  WrapPanel.

 

1, Cavas:简单地设置坐标值来布局

    Canvas很单纯地设置其子控件相对于它的Top, Left, Bottom., Right值来进行定位其子控件. 那么请调用相关方法 public static void SetLeft (UIElement element,double length)

    假设border1canvas1Children, 那么我们应该这样设置border1canvas1中的位置:

    

None.gif Canvas.SetTop(border1, 100);
None.gifCanvas.SetLeft(border1, 50);
None.gif
None.gif

    注意这里有些奇怪的是调用Cavas的静态方法SetTop,SetLeft.

    特别地, 当同时设置了TopBottom,只有Top生效;同理同时设置了LeftRight时则只有Left生效,而不会拉伸控件.

要设置控件大小请使用控件的WidthHeight属性.

以下是一个示例:

None.gif < Page  xmlns =http://schemas.microsoft.com/winfx/2006/xaml/presentation  xmlns:sys ="clr-namespace:System;assembly=mscorlib"    xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"   >
None.gif
None.gif
< Canvas  Background ="Pink"  Name ="MyCanvas" >
None.gif
None.gif    
<!-- 定义画布 -->
None.gif
None.gif    
< Rectangle  Height ="100"  Width ="100"  Canvas.Top ="100"  Canvas.Left ="100"  Fill ="Red"   />
None.gif
None.gif    
< Rectangle  Height ="100"  Width ="150"   Canvas.Top ="100"  Canvas.Left ="300"  Fill ="Blue" />
None.gif
None.gif    
< Rectangle  Height ="100"  Width ="200"   Canvas.Top ="100"  Canvas.Left ="500"  Fill ="Yellow"   />
None.gif
None.gif  
</ Canvas >
None.gif
None.gif
</ Page >
None.gif
None.gif 
None.gif
None.gif

2, DockPanel: .net3.0之前的控件的Dock属性类似.

DockPanel为其子控件提供相对的停靠位置, 包括向左停靠(Dock.Left),向右停靠(Dock.Right),向下停靠(Dock.Bottom),向上停靠. 请调用DockPanel的静态方法SetDock(UIElement e, Dock dock)

假设border1dockPanel1的子控件,那么我们可以这样来设置border1的位置:

DockPanel.SetDock(border1, Dock.Left|Dock.Top);

以下是一个示例:

None.gif < Page  xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  WindowTitle ="DockPanel Sample" >
None.gif
None.gif  
< DockPanel  LastChildFill ="True" >
None.gif
None.gif    
< Border  Height ="25"  Background ="SkyBlue"  BorderBrush ="Black"  BorderThickness ="1"  DockPanel.Dock ="Top" >
None.gif
None.gif      
< TextBlock  Foreground ="Black" > Dock = "Top" </ TextBlock >
None.gif
None.gif    
</ Border >
None.gif
None.gif    
< Border  Height ="25"  Background ="SkyBlue"  BorderBrush ="Black"  BorderThickness ="1"  DockPanel.Dock ="Top" >
None.gif
None.gif      
< TextBlock  Foreground ="Black" > Dock = "Top" </ TextBlock >
None.gif
None.gif    
</ Border >
None.gif
None.gif    
< Border  Height ="25"  Background ="LemonChiffon"  BorderBrush ="Black"  BorderThickness ="1"  DockPanel.Dock ="Bottom,Right"   >
None.gif
None.gif      
< TextBlock  Foreground ="Black" > Dock = "Bottom" </ TextBlock >
None.gif
None.gif    
</ Border >
None.gif
None.gif    
< Border  Width ="200"  Background ="PaleGreen"  BorderBrush ="Black"  BorderThickness ="1"  DockPanel.Dock ="Left" >
None.gif
None.gif      
< TextBlock  Foreground ="Black" > Dock = "Left" </ TextBlock >
None.gif
None.gif    
</ Border >
None.gif
None.gif    
< Border  Background ="White"  BorderBrush ="Black"  BorderThickness ="1" >
None.gif
None.gif      
< TextBlock  Foreground ="Black" > This content will "Fill" the remaining space </ TextBlock >
None.gif
None.gif    
</ Border >
None.gif
None.gif  
</ DockPanel >
None.gif
None.gif
</ Page >
None.gif
None.gif 
None.gif
None.gif

 

 

3, StackPanel :按照水平线方向或垂直线方向排列控件

    StackPanel允许你按照指定的方向(HorizontalAlignment, VerticalAlignment)向其中添加子控件.
关于StackPanelDockPanel的区别SDK中是这样阐述的:” Although you can use either DockPanel or StackPanel to stack child elements, the two controls do not always produce the same results. For example, the order that you place child elements can affect the size of child elements in a DockPanel but not in a StackPanel. This different behavior occurs because StackPanel measures in the direction of stacking at Double.PositiveInfinity; however, DockPanel measures only the available size.”

以下是一个示例:

None.gif < Page  xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:sys ="clr-namespace:System;assembly=mscorlib"  xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"   >
None.gif
None.gif  
< Grid >
None.gif
None.gif
< StackPanel  Orientation ="Horizontal"  Background ="silver"  Margin ="20" >
None.gif
None.gif
< Label  Margin ="5"  Content ="Username"   />
None.gif
None.gif
< Button   Content ="123eqweqweq" />
None.gif
None.gif
< Button  Name ="test"  Width ="100"  Height ="50"  Content ="Test" />
None.gif
None.gif
< Button   Content ="123eqweqweq" />
None.gif
None.gif 
None.gif
None.gif
< Label  Name ="testlabel"   Content ="king" />
None.gif
None.gif 
None.gif
None.gif 
</ StackPanel >
None.gif
None.gif  
</ Grid >
None.gif
None.gif
</ Page >
None.gif
None.gif 
None.gif
None.gif

 


4,WrapPanel:
自动换行子控件的布局

当子一行(或一列)不足以放置新控件时,WrapPanel将自动地将子控件放置到新行(或新列,这取决于Orientation属性)

以下是一个示例:

 

None.gif < Window
None.gif
None.gif  
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
None.gif
None.gif  xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
None.gif
None.gif  xml:lang
="zh-CN"
None.gif
None.gif  
None.gif
None.gif  x:Name
="Window"
None.gif
None.gif  Title
="Window1"
None.gif
None.gif  Width
="640"  Height ="480"  xmlns:d ="http://schemas.microsoft.com/expression/blend/2006"  xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"  mc:Ignorable ="d" >
None.gif
None.gif 
None.gif
None.gif  
< Grid  x:Name ="LayoutRoot" >
None.gif
None.gif                
< Grid .RowDefinitions >
None.gif
None.gif                              
< RowDefinition  Height ="0.83*" />
None.gif
None.gif                              
< RowDefinition  Height ="0.17*" />
None.gif
None.gif                
</ Grid.RowDefinitions >
None.gif
None.gif                
< WrapPanel  x:Name ="wrapPanel1" >
None.gif
None.gif                              
< Rectangle  Fill ="#FFAA5E5E"  Stroke ="#FF000000"  Width ="{Binding Path=Value, ElementName=slider1, Mode=Default}"  Height ="{Binding Path=Value, ElementName=slider1, Mode=Default}" />
None.gif
None.gif                              
< Rectangle  Fill ="#FFAA5E5E"  Stroke ="#FF000000"  Width ="{Binding Path=Value, ElementName=slider1, Mode=Default}"  Height ="{Binding Path=Value, ElementName=slider1, Mode=Default}" />
None.gif
None.gif                              
< Rectangle  Fill ="#FFAA5E5E"  Stroke ="#FF000000"  Width ="{Binding Path=Value, ElementName=slider1, Mode=Default}"  Height ="{Binding Path=Value, ElementName=slider1, Mode=Default}" />
None.gif
None.gif                              
< Rectangle  Fill ="#FFAA5E5E"  Stroke ="#FF000000"  Width ="{Binding Path=Value, ElementName=slider1, Mode=Default}"  Height ="{Binding Path=Value, ElementName=slider1, Mode=Default}" />
None.gif
None.gif                              
< Rectangle  Fill ="#FFAA5E5E"  Stroke ="#FF000000"  Width ="{Binding Path=Value, ElementName=slider1, Mode=Default}"  Height ="{Binding Path=Value, ElementName=slider1, Mode=Default}" />
None.gif
None.gif                              
< Rectangle  Fill ="#FFAA5E5E"  Stroke ="#FF000000"  Width ="{Binding Path=Value, ElementName=slider1, Mode=Default}"  Height ="{Binding Path=Value, ElementName=slider1, Mode=Default}" />
None.gif
None.gif                              
< Rectangle  Fill ="#FFAA5E5E"  Stroke ="#FF000000"  Width ="{Binding Path=Value, ElementName=slider1, Mode=Default}"  Height ="{Binding Path=Value, ElementName=slider1, Mode=Default}" />
None.gif
None.gif                              
< Rectangle  Fill ="#FFAA5E5E"  Stroke ="#FF000000"  Width ="{Binding Path=Value, ElementName=slider1, Mode=Default}"  Height ="{Binding Path=Value, ElementName=slider1, Mode=Default}" />
None.gif
None.gif                
</ WrapPanel >
None.gif
None.gif                
< Slider  d:LayoutOverrides ="Margin"  HorizontalAlignment ="Right"  Margin ="0,19.01,24,29"  x:Name ="slider1"  Width ="128"  Grid.Row ="1"  Maximum ="300"  Minimum ="50"  Value ="50" />
None.gif
None.gif  
</ Grid >
None.gif
None.gif
</ Window >
None.gif
None.gif

 

5 Grid:表格布局

Grid允许我们通过自定义行列来进行布局,这类似于表格. 我们可以通过表格来进行交复杂框架的布局,然后再在表格内部利用其他布局方式或嵌套表格个方式进行布局.

可以通过设置ColumnsRows的属性,通过定义GridColumnDifinitionsRowDifinitions来实现对于表格的定义,然后根据Grid.ColumnGrid.Row的对象来制定位置的方式实现布局.

这里是一个示例:

None.gif < Page  xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  WindowTitle ="Grid Sample" >
None.gif
None.gif    
< Grid  VerticalAlignment ="Top"  HorizontalAlignment ="Left"  ShowGridLines ="True"  Width ="250"  Height ="100" >
None.gif
None.gif      
< Grid .ColumnDefinitions >
None.gif
None.gif        
< ColumnDefinition  />
None.gif
None.gif        
< ColumnDefinition  />
None.gif
None.gif        
< ColumnDefinition  />
None.gif
None.gif      
</ Grid.ColumnDefinitions >
None.gif
None.gif      
< Grid .RowDefinitions >
None.gif
None.gif        
< RowDefinition  />
None.gif
None.gif        
< RowDefinition  />
None.gif
None.gif        
< RowDefinition  />
None.gif
None.gif        
< RowDefinition  />
None.gif
None.gif      
</ Grid.RowDefinitions >
None.gif
None.gif 
None.gif
None.gif      
< TextBlock  FontSize ="20"  FontWeight ="Bold"  Grid.ColumnSpan ="3"  Grid.Row ="0" > 2005 Products Shipped </ TextBlock >
None.gif
None.gif      
< TextBlock  FontSize ="12"  FontWeight ="Bold"  Grid.Row ="1"  Grid.Column ="0" > Quarter 1 </ TextBlock >
None.gif
None.gif      
< TextBlock  FontSize ="12"  FontWeight ="Bold"  Grid.Row ="1"  Grid.Column ="1" > Quarter 2 </ TextBlock >
None.gif
None.gif      
< TextBlock  FontSize ="12"  FontWeight ="Bold"  Grid.Row ="1"  Grid.Column ="2" > Quarter 3 </ TextBlock >
None.gif
None.gif      
< TextBlock  Grid.Row ="2"  Grid.Column ="0" > 50000 </ TextBlock >
None.gif
None.gif      
< TextBlock  Grid.Row ="2"  Grid.Column ="1" > 100000 </ TextBlock >
None.gif
None.gif      
< TextBlock  Grid.Row ="2"  Grid.Column ="2" > 150000 </ TextBlock >
None.gif
None.gif      
< TextBlock  FontSize ="16"  FontWeight ="Bold"  Grid.ColumnSpan ="3"  Grid.Row ="3" > Total Units: 300000 </ TextBlock >
None.gif
None.gif    
</ Grid >
None.gif
None.gif
</ Page >
None.gif
None.gif

 

 

 

6, VirtualizingStackPanel

可视化是一种改善数据密集型应用程序性能的很好方式。可通过VirtualizingStackPanel控件获得 WPF 中的 UI 可视化。对于大量的项而言,这要比 StackPanel 70 倍。您也可以做到同样的事情如果能避免将所有对象一直保持在树中,那么您很可能会看到回报。(关于VirtualizingStackPanel来自”WPF概述”,by Tim Sneath)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值