WPF/C#學習筆記.1:WPF中的布局TabControl,Grid與GridSpliter等

WPF/C#學習筆記.1

WPF中的布局TabControl,Grid與GridSpliter等


WPF布局原則

由于WPF窗體中只能包含單個元素谭羔。為了在WPF窗體中放置多個元素,需要在窗體中布置一個容器(TablControl麦向,StackPanel瘟裸,Grid等,其中Grid是WPF中功能最強大的布局控件)诵竭,然后在這個容器中添加別的元素话告。

核心布局面板

  • StackPanel 在水平或者垂直的堆棧中放置元素。這個布局容器通常用于更大更復雜的窗體中的一些小區(qū)域卵慰。
  • WrapPanel 在一系列可換行的行中放置元素(默認):在水平(行)方向上沙郭,從左向右放置條目;在垂直(列)方向上裳朋,自上而下放置條目病线。
  • DockPanel 根據容器的整個邊界調整條目。
  • Canvas 使用固定坐標絕對定位元素鲤嫡,不適合用于尺寸可變的窗口送挑。一般用于圖形繪制,可以在其外層再布置一個ViewBox以實現對Canvas中的圖形動態(tài)地等比例縮放暖眼。
  • Grid 根據不可見的表格在行和列中排列元素惕耕,這是最靈活和最常用的容器之一。
  • GridSplitter Grid面板的分割條诫肠,用以實現讓用戶在使用APP時自己通過拖動分割條動態(tài)地決定各個部分占據窗體的比例司澎。可以與別的元素共享一個表格單元区赵,更好的方法是預留一列或一行來放置分割條惭缰,并將預留列或行的Width或Height的屬性設置為auto。

容器修飾與封裝

  • Border 裝飾元素只能包含一段嵌套內容(通常是布局面板)笼才,并為其添加背景或在其周圍添加邊框(必須設置其BorderBrushBorderThickness屬性才會顯示邊框效果)漱受。
  • ScrollViewer 可以包含任何內容通常用于封裝布局容器,使得面板可以滾動以查看超出當前顯示范圍的內容骡送。

WPF代碼實例

<Window x:Class="PowerFlight.MainWindow"
        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:PowerFlight"
        mc:Ignorable="d"
        Title="PowerFlight" Height="768" Width="1366" Icon="Image/Airplane.ico">
    <TabControl TabStripPlacement="Left" Margin="3" >
        <TabItem Header="Simulator">
            <Grid ShowGridLines="False" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto" /> 
                    <ColumnDefinition Width="2*" />
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="8*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="2*"/>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="3*"/>
                </Grid.RowDefinitions>
                
<!-- Element in Grid.Column="0" -->
                <Border Grid.Column="0" Grid.Row="0" Grid.RowSpan="3" Margin="3" 
                        BorderBrush="#FFACACAC" BorderThickness="1" >
                    <TextBlock Margin ="3" FontSize="20" Text="This is auto width"/>
                </Border>
<!-- End of Element in Grid.Column="0" -->
                
<!-- Element in Grid.Column="1" -->
                <Border Grid.Column="1" Grid.Row="0" Margin="0,3,0,0" 
                        BorderBrush="#FFACACAC" BorderThickness="1" >
                    <DockPanel LastChildFill="True">
                        <Label DockPanel.Dock="Top" FontSize="20" Content="This 2* weight"/>
                        <TextBlock Padding="2" Margin="3" TextWrapping="Wrap">
                            xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                        </TextBlock>
                    </DockPanel>
                </Border>

                <GridSplitter Grid.Column="1" Grid.Row="1" Height="3"                              
                              VerticalAlignment="Center" HorizontalAlignment="Stretch"
                              ResizeDirection="Rows" Opacity="0" />

                <Border  Grid.Column="1" Grid.Row="2"  Margin="0,0,0,3" 
                         BorderBrush="#FFACACAC" BorderThickness="1" >
                    <ScrollViewer HorizontalScrollBarVisibility="Auto"
                                  VerticalScrollBarVisibility="Auto">
                        <StackPanel Margin="3,6,3,6" >
                            <Label Content="This 2* weight"/>
                            <TextBlock Margin="3" FontSize="20" >
                            xxxxxxxxxxxxxxxxxxxxxxxxxxxx
                            </TextBlock>
                        </StackPanel>
                    </ScrollViewer>
                </Border>
<!-- End of Element in Grid.Column="1" -->
                
                <GridSplitter Grid.Column="2" Grid.RowSpan="3" Width="3"
                              VerticalAlignment="Stretch" HorizontalAlignment="Center"
                              Opacity="0"/>

<!-- Element in Grid.Column="3" -->
                <Border Grid.Column="4" Grid.Row="0" Grid.RowSpan="3"  Margin="0,3,3,3" 
                        BorderBrush="#FFACACAC" BorderThickness="1" >
                    <TextBlock FontSize="20" Text="This 8* weight"/>
                </Border>
<!-- End of Element in Grid.Column="3" -->
                
            </Grid>
        </TabItem>
<!-- End Of TabItem Heardear="Simulator" -->
        
        <TabItem Header="Data">
        </TabItem>
        
    </TabControl>
</Window>

布局結果

  • 拉伸前
  • 拉伸后

Tips

通用屬性

  • Margin Margin="3" 在元素四周添加Thickness=new Thickness(3,3,3,3)的空間昂羡;Margin="0,3,0,0" 在元素四周添加Thickness=new Thickness(0,3,0,0)(順序依次為:左,上摔踱,右虐先,下)的空間。
  • Padding 定義元素的內邊距派敷,例如TextBlock中的文本距離其邊框的距離
  • Opacity 不透明系數1-->0(完全透明)

TabControl

  • TabStripPlacement 設置選項卡的陀寂靠位置

TabItem

  • Header 選項卡中顯示的文本

Grid

  • ShowGridLines 是否顯示網格虛線
  • ColumnDefinition Width="auto"撰洗,列的寬度取決于其中所包含的最大元素的寬度;Width="2"/Width="8"腐芍,列的寬度占未定義的剩余寬度的權重為2/8差导,若只有這兩個列分割剩下的寬度,則寬度切割為2+8=10份猪勇,這兩個列分別占2份和8份设褐。行高度(Height)的定義與之相同。

Grid子元素屬性

  • Grid.Column="1" Grid.Row="0" 該子元素占據Grid的行1列0泣刹。
  • Grid.RowSpan="3"/Grid.ColumnSpan="2" 該子元素穿越Grid的3列/2行布置助析。

GridSplitter

  • VerticalAlignment/HorizontalAlignment GridSplitter外觀在垂直/水平方向上的對齊與拉伸
  • ResizeDirection ="Rows"/="Columns" GridSplitter對表格的調整方向

DockPanel

  • LastChildFill 最后一個子元素占據DockPanel的所有剩余空間。

DockPanel子元素屬性椅您。

  • DockPanel.Dock 子元素在DockPanel中的位置外冀。

ScrollViewer

  • HorizontalScrollBarVisibility/VerticalScrollBarVisibility ="Auto",APP運行時根據其中具體元素大小自行決定是否啟用滾動條襟沮。

TextBlock

  • TextWrapping 定義當前句子超出文本框時文本框的行為(=“Wrap”,自動排版到下一行)锥惋。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市开伏,隨后出現的幾起案子膀跌,更是在濱河造成了極大的恐慌,老刑警劉巖固灵,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捅伤,死亡現場離奇詭異,居然都是意外死亡巫玻,警方通過查閱死者的電腦和手機丛忆,發(fā)現死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仍秤,“玉大人熄诡,你說我怎么就攤上這事∈Γ” “怎么了凰浮?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苇本。 經常有香客問我袜茧,道長,這世上最難降的妖魔是什么瓣窄? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任笛厦,我火速辦了婚禮,結果婚禮上俺夕,老公的妹妹穿的比我還像新娘裳凸。我一直安慰自己贱鄙,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布姨谷。 她就那樣靜靜地躺著贰逾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菠秒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天氯迂,我揣著相機與錄音践叠,去河邊找鬼。 笑死嚼蚀,一個胖子當著我的面吹牛禁灼,可吹牛的內容都是我干的。 我是一名探鬼主播轿曙,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼弄捕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了导帝?” 一聲冷哼從身側響起守谓,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎您单,沒想到半個月后斋荞,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡虐秦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年平酿,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悦陋。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜈彼,死狀恐怖,靈堂內的尸體忽然破棺而出俺驶,到底是詐尸還是另有隱情幸逆,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布痒钝,位于F島的核電站秉颗,受9級特大地震影響,放射性物質發(fā)生泄漏送矩。R本人自食惡果不足惜蚕甥,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栋荸。 院中可真熱鬧菇怀,春花似錦凭舶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呼伸,卻和暖如春身冀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背括享。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工搂根, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铃辖。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓剩愧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親娇斩。 傳聞我的和親對象是個殘疾皇子仁卷,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,737評論 1 92
  • 前言 溫馨提示:本文較長犬第,圖片較多锦积,本來是想寫一篇 CSS 布局方式的,但是奈何 CSS 布局方式種類太多并且實現...
    sunshine小小倩閱讀 3,123評論 0 59
  • 簡介CSS網格布局(又稱“網格”)瓶殃,是一種二維網格布局系統充包。CSS在處理網頁布局方面一直做的不是很好。一開始我們用...
    _leonlee閱讀 64,966評論 25 173
  • 簡介 CSS Grid布局 (又名"網格")遥椿,是一個基于二維網格布局的系統基矮,旨在改變我們基于網格設計的用戶界面方式...
    咕咚咚bells閱讀 2,488評論 0 4
  • 1、窗體 1冠场、常用屬性 (1)Name屬性:用來獲取或設置窗體的名稱家浇,在應用程序中可通過Name屬性來引用窗體。 ...
    Moment__格調閱讀 4,528評論 0 11