WPF 10天修炼 第四天- WPF布局容器
WPF布局
? ? ? ?WPF的窗口也就是Window類,是一個內容控件,該控件派生自ContentControl。內容控件有一個Content屬性,該屬性有一個限制,只能放置一個用戶界面元素,或一個字符串。為了在窗口上放置多個界面控件,通常在窗口上放置一個容器控件。
WFP布局原則
1、? 元素不應該指定 確定的尺寸大小,同很慘更應該使其大小自動適應內容。比如按鈕根據所添加的文本來擴展其大小。可以通過設置maximun和minimun尺寸來限制控件可接受的尺寸大小。
2、? 元素不應該使用屏幕坐標來指定其位置,通常是基于其尺寸來進行自動排列位置。
3、? 布局容器將在其子元素之間共享其可用控件。通常由容器嘗試為其每個子元素分配合適的尺寸。
4、? 布局容器允許嵌套。?
WP核心布局面板
?
| 面板名稱 | 說明 |
| StackPanel | 使用水平或垂直堆疊的方式放置元素,適用于一些小范圍布局。 |
| WarpPanel | 水平方向:從左到右排列子元素。當寬度不夠時,則開啟一個新的行從左到右進行排列。 垂直方向:從上到下排列子元素,當高度不夠時,則開啟一個新的列從上到下進行排列。 |
| DockPanel | 時子元素依賴于容器的特定邊緣,左、右、上、下邊緣等,該面板通常用于全局布局。 |
| Grid | WPF最強最好用的布局控件。類似一個不可見的HTML表格,將子元素放在特定的行和列中。 |
| UniformGrid | 放置子元素在一個不可見的表中,但強制所有的單元格都具有相同的尺寸。使用頻率較低 |
| Canvas | 使用固定的坐標來絕對定位子元素。與傳統winForm布局方式類似。但是沒有Anchoring和Docking特性。在處理圖形圖像的場合,使用這個布局非常有用,在動態用戶界面上,這個控件將事半功倍。 |
StackPanel?
1、? 新建StackPaneDemo窗體。
2、? 去掉Grid布局容器,然后添加StackPanel布局容器
3、? 添加5個button按鈕。然后運行查看效果。?
<Window x:Class="WPFDemo.StackPanelDemo"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:WPFDemo"mc:Ignorable="d"WindowStartupLocation="CenterScreen"Title="StackPanelDemo" Height="500" Width="800"><StackPanel><Button Name="button1" Content="按鈕1"/><Button Name="button2" Content="按鈕2"/><Button Name="button3" Content="按鈕3"/><Button Name="button4" Content="按鈕4"/><Button Name="button5" Content="按鈕5"/></StackPanel></Window>?
默認情況下,StackPanel從上到下排列控件,控件的高度與其內容的高度相匹配,可以使用Orientation屬性設置為Horizontal使其從左到右進行排列。
<StackPanel Orientation="Horizontal"><Button Name="button1" Content="按鈕1"/><Button Name="button2" Content="按鈕2"/><Button Name="button3" Content="按鈕3"/><Button Name="button4" Content="按鈕4"/><Button Name="button5" Content="按鈕5"/></StackPanel>?
?
?當設置Horizontal之后,按鈕將占滿StackPanel的高度,但寬度則為內容的大小。StackPanel有兩個依賴屬性,可以使開發人員可以控制水平或垂直方向,控件如何占滿窗體可用寬度和高度。?
HorizontalAlignment枚舉屬性:獲取或設置在父元素中構成此元素時應用于此元素的水平對齊特征。
VerticalAlignment枚舉屬性:獲取或設置在父元素中構成此元素時應用于此元素的垂直對齊特征。
默認情況下,這兩個屬性的Stretch,表示根據StackPanel的排列方向自動拉伸到相應的寬度和高度。
?
當StackPanel控件設為水平方向時,可以通過VerticalAlignment屬性來設置button控件的對齊方式。
<StackPanel Orientation="Horizontal"><Button Name="button1" Content="按鈕1" VerticalAlignment="Top"/><Button Name="button2" Content="按鈕2" VerticalAlignment="Center"/><Button Name="button3" Content="按鈕3" VerticalAlignment="Bottom"/><Button Name="button4" Content="按鈕4" VerticalAlignment="Stretch"/><Button Name="button5" Content="按鈕5" VerticalAlignment="Stretch"/></StackPanel>?
?
同樣在Orientation為Vertical時,可以設置HorizontalAlignment屬性來指定對齊方式。
<StackPanel Orientation="Vertical"><Button Name="button1" Content="按鈕1" HorizontalAlignment="Left"/><Button Name="button2" Content="按鈕2" HorizontalAlignment="Center"/><Button Name="button3" Content="按鈕3" HorizontalAlignment="Right"/><Button Name="button4" Content="按鈕4" HorizontalAlignment="Stretch"/><Button Name="button5" Content="按鈕5" HorizontalAlignment="Stretch"/></StackPanel>?
?
其他布局屬性
| 屬性名稱 | 屬性說明 |
| Margin | 可以在子元素的四周添加空白,同CSS中的Margin使用方法一致,Margin是System.Windows.thickness結構的屬性。 |
| MinWidth和MinHeight | 設置元素的最小尺寸,如果元素大于容器會被裁剪。 |
| MaxWidth和MaxHeight | 設置元素的最大尺寸,如果元素大于容器會被裁剪。 |
| Width和Height | 設置固定的元素大小。這個屬性將會覆蓋HorizontalAlignment和VerticalAlignment屬性。 |
?
Margin屬性
Margin屬性可以指定一個值設置四條邊的值一樣,可以設置兩個值設置上下、左右的值一樣,可以設置四個值分別指定左上右下的值。
<StackPanel Orientation="Horizontal"><Button Name="button1" Content="按鈕1" Margin="5,10" /><Button Name="button2" Content="按鈕2" /><Button Name="button3" Content="按鈕3" Margin="5,10,15,20" /><Button Name="button4" Content="按鈕4" /><Button Name="button5" Content="按鈕5" Margin="5" /></StackPanel>?
?
最大化、最小化和明確的尺寸屬性
?如果希望按鈕可以自動地根據內容進行縮放,但是不能小于100個單位,不能大于200個單位。可以使用MaxWidth和MinWidth屬性進行設置。
<StackPanel Orientation="Horizontal"><Button Name="button1" Content="按鈕1" MaxWidth="200" MinWidth="100" Margin="5,10" /><Button Name="button2" Content="按鈕2" MaxWidth="200" MinWidth="100" /><Button Name="button3" Content="按鈕3" MaxWidth="200" MinWidth="100" Margin="5,10,15,20" /><Button Name="button4" Content="按鈕4" MaxWidth="200" MinWidth="100" /><Button Name="button5" Content="按鈕5" MaxWidth="200" MinWidth="100" Margin="5" /></StackPanel>?
設置最大和最小尺寸效果
?
?
容器尺寸小于控件尺寸裁剪
??
如果想在Window中獲取元素的實際大小,不能直接使用Width和Height屬性,它們代表的不是實際尺寸大小而是希望的尺寸大小。開發人員可以訪問元素的ActualWidth和ActualHeigth屬性來獲取當前窗口中元素的實際尺寸,這個兩個尺寸會隨著窗口大小的調整而變化。
?WrapPanel?
? ? ? ?與StackPanel控件類似,WrapPanel也有一個Orientation屬性,默認為Horizontal,控件從左到右進行排列。如果寬度不夠時將會換一個新行。WrapPanel通常用于一些小范圍的布局場合。而不是整體窗口的總體布局。
<WrapPanel><Button Name="button1" Content="按鈕1" VerticalAlignment="Top" /><Button Name="button2" Content="按鈕2" MinHeight="100" /><Button Name="button3" Content="按鈕3" VerticalAlignment="Bottom"/><Button Name="button4" Content="按鈕4" /><Button Name="button5" Content="按鈕5" VerticalAlignment="Center" /></WrapPanel>?
默認樣式
?
?
?縮小窗體,自動換行?
?
?DockPanel
???????? 用于拉伸控件,以停靠在指定的窗口邊緣,DockPanel中的控件將被拉伸以適應容器的邊緣。
???????? DockPanel控件的附加屬性Dock。這是一個枚舉類型屬性:可選值如下:
???????? Left:位于DockPanel左側的子元素
???????? Top:位于DockPanel頂部的資源
???????? Right:位于DockPanel右側的子元素
???????? Bottom:位于DockPanel底部的子元素
<DockPanel><Button Name="button1" Content="頂部" DockPanel.Dock="Top"/><Button Name="button2" Content="下側" DockPanel.Dock="Bottom"/><Button Name="button3" Content="左側" DockPanel.Dock="Left" /><Button Name="button4" Content="右側" DockPanel.Dock="Right"/><Button Name="button5" Content="剩余空間" /></DockPanel>
?上面代碼中分別設置了四個方向,最后一個方向沒有設置則自動占滿了剩余空間,這是因為DockPanel控件指定了LastChildFill屬性。默認情況下這個屬性為True。如果將LastChildFille設置為True無論最后一個元素停靠屬性設置為何值,此元素也是自動填充剩余空間。
<DockPanel><Button Name="button1" Content="頂部" DockPanel.Dock="Top"/><Button Name="button2" Content="下側" DockPanel.Dock="Bottom"/><Button Name="button3" Content="左側" DockPanel.Dock="Left" /><Button Name="button4" Content="右側" DockPanel.Dock="Right"/><Button Name="button5" Content="剩余空間" DockPanel.Dock="Top" /></DockPanel>
下面示例中將LastChildFill屬性設置為False,然后將最后一個元素的Dock屬性設置為top。
<DockPanel LastChildFill="False"><Button Name="button1" Content="頂部" DockPanel.Dock="Top"/><Button Name="button2" Content="下側" DockPanel.Dock="Bottom"/><Button Name="button3" Content="左側" DockPanel.Dock="Left" /><Button Name="button4" Content="右側" DockPanel.Dock="Right"/><Button Name="button5" Content="剩余空間" DockPanel.Dock="Top" /></DockPanel>?
在上面示例中上下兩側都是占滿了窗體的全部寬度,如果想使左右兩側占滿全部高度,只需要改變子元素的順序即可。
<DockPanel LastChildFill="False"><Button Name="button3" Content="左側" DockPanel.Dock="Left" /><Button Name="button4" Content="右側" DockPanel.Dock="Right"/><Button Name="button1" Content="頂部" DockPanel.Dock="Top"/><Button Name="button2" Content="下側" DockPanel.Dock="Bottom"/><Button Name="button5" Content="剩余空間" DockPanel.Dock="Top" /></DockPanel>
開發人員也可以使用HorizontaAlignment和VerticalAlignment屬性來控制子元素的顯示方式。
<DockPanel LastChildFill="False"><Button Name="button1" Content="頂部" DockPanel.Dock="Top"/><Button Name="button6" Content="頂部-居中" HorizontalAlignment="Center" DockPanel.Dock="Top"/><Button Name="button7" Content="頂部-右側" HorizontalAlignment="Right" DockPanel.Dock="Top"/><Button Name="button2" Content="下側" DockPanel.Dock="Bottom"/><Button Name="button3" Content="左側" DockPanel.Dock="Left" /><Button Name="button4" Content="右側" DockPanel.Dock="Right"/><Button Name="button5" Content="剩余空間" DockPanel.Dock="Top" /></DockPanel>
?
使用StackPanel、WarpPanel和DockPanel來實現一個簡單的對話框窗口。
<DockPanel LastChildFill="True" ><StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom" HorizontalAlignment="Right"><Button Name="btn1" Margin="5" Content="確定"/><Button Name="btn2" Margin="5" Content="取消"/></StackPanel><TextBlock Margin="10" Text="簡單對話框示例"></TextBlock></DockPanel>?
?
?
Grid
Grid就是表格布局,使用Grid可以設置行列,添加子元素需要指定所屬的行列,多個子元素可以放在同一個單元格中。
<!---定義一個3行3列的表格--><Grid ShowGridLines="True"><!--定義3行--><Grid.RowDefinitions><RowDefinition /><RowDefinition /><RowDefinition /></Grid.RowDefinitions><!--定義3列--><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions></Grid>
?
?
默認情況下所有的單元格大小是均分的,可以通過ColumnDefinition的Widht屬性來指定每一列的寬,通過RowDefinition的Height屬性來指定每一列的高。
Grid控件尺寸設置和其他控件的尺寸設置不一樣,Grid尺寸設置主要支持下面三種:
1、? 絕對尺寸:指定精確的單位大小。例如定義100個單位高度<RowDefinition Height=”100” />? 一般情況下絕對尺寸在Grid中使用較少,因為指定之后便不能根據內容大小自動伸縮。
2、? 自動內容尺寸:Grid尺寸的變化將給予行或列的子元素內容而定。在Xaml中通常使用Auto來指定。<RowDefinition Height=”Auto”/>
3、? 按比例分配剩余空間:這是默認設置,通常使用 * ,1*,2* 等樣式來指定的。按比例分配空間是指,當使用精確尺寸或自動內容尺寸分配之后,所剩的空間如何進行分配。?
這是一個相對單位,默認情況下只有一個*。當有兩個列都設置為*時,表示將其空間按比例各一半進行分配。如果一列指定為2*。則平均分為3份,*占3分之一;2*占3分之二。
??
使用不同尺寸定義方法定義Grid行高
<!---定義一個3行3列的表格--><Grid ShowGridLines="True"><!--定義3行--><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition Height="*"/><RowDefinition Height="2*"/></Grid.RowDefinitions><!--定義3列--><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><Button Content="button1" Grid.Row="0" Grid.Column="0"/><Button Content="button2" Grid.Row="1" Grid.Column="1"/><Button Content="button3" Grid.Row="2" Grid.Column="2"/></Grid>
?
合并行列
???????合并單元格與HTML中table的合并單元格一樣,使用RowSpan合并行ColumnSpan合并列。
<!---定義一個3行3列的表格--><Grid ShowGridLines="True"><!--定義3行--><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition Height="*"/><RowDefinition Height="2*"/></Grid.RowDefinitions><!--定義3列--><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><Button Content="button1" Grid.RowSpan="3" Grid.Row="0" Grid.Column="0"/><Button Content="button2" Grid.ColumnSpan="2" Grid.Row="1" Grid.Column="1"/><Button Content="button3" Grid.Row="2" Grid.Column="2"/></Grid>
窗體分割
? ? ? ? 在Grid中,通過使用GridSplitter控件為布局添加一個窗體分隔條,使布局可以由用戶來調整其大小。GridSplitter必須放置在Grid控件中,在使用GridSplitter之前需要理解下面幾點:
1、? GridSplitter控件必須放置在一個Grid中,可以與已經存在的內容放在一起。為了放置覆蓋已存在的內容,需要調整其Margin屬性。
2、? GridSplitter控件總是調整整個行或列的尺寸,而不是特定單元格的尺寸。
3、? GridSplitter的對齊屬性,比如HorizontalAlignment或VerticalAlignment屬性決定了分隔條可以拖動的方向。當設置HorizontalAlignment為Left時,則只能向左拖動分隔條,設置為Center則可以左右同時拖動。
窗體分割應用Demo
<!---定義一個3行3列的表格--><Grid ShowGridLines="True"><!--定義3行--><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="2*"/></Grid.RowDefinitions><!--定義3列--><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition Width="Auto"/><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><!--垂直Splitter--><GridSplitter Grid.Row="0" Grid.Column="1" Width="10" HorizontalAlignment="Center" Background="Blue" Grid.RowSpan="4"></GridSplitter><!---水平Splitter--><GridSplitter Grid.Row="1" Grid.Column="0" Height="10" HorizontalAlignment="Stretch" Background="Red" Grid.ColumnSpan="4"></GridSplitter><Button Content="button1" Grid.Row="0" Grid.Column="0"/><Button Content="button2" Grid.Row="2" Grid.Column="2"/><Button Content="button3" Grid.Row="3" Grid.Column="3"/></Grid>
?
UniformGrid
? UniformGrid控件是一個簡化版的Grid控件,使用該控件不需要定義行列。只需要指定Rows和Columns屬性即可,該控件會將所有的行列使用相同的尺寸。在添加子元素時不需要指定所在的行列,所有的子元素都是按從左到右的順序進行排列的。
<UniformGrid Rows="2" Columns="4"><Button Content="按鈕1" Background="Black" ></Button><Button Content="按鈕2" Background="Red"></Button><Button Content="按鈕3" Background="AntiqueWhite"></Button><Button Content="按鈕4" Background="Aqua"></Button><Button Content="按鈕5" Background="Aquamarine"></Button><Button Content="按鈕6" Background="Azure"></Button><Button Content="按鈕7" Background="Beige"></Button></UniformGrid>
?
?
如果想讓子元素進行從右到左進行排列時只需要指定FlowDirection屬性為RightToLeft即可。
<UniformGrid Rows="2" Columns="4" FlowDirection="RightToLeft"><Button Content="按鈕1" Background="Black" ></Button><Button Content="按鈕2" Background="Red"></Button><Button Content="按鈕3" Background="AntiqueWhite"></Button><Button Content="按鈕4" Background="Aqua"></Button><Button Content="按鈕5" Background="Aquamarine"></Button><Button Content="按鈕6" Background="Azure"></Button><Button Content="按鈕7" Background="Beige"></Button></UniformGrid>
?
轉載于:https://www.cnblogs.com/zhaochengshen/p/7482502.html
總結
以上是生活随笔為你收集整理的WPF 10天修炼 第四天- WPF布局容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 台湾中华汽车在厦门有公司吗
- 下一篇: 现在本田车换刹车片都换什么牌子的?