一.章節目標
這幾章節我們會創建一個完整的Window程序,包括使用DataGrid空間,數據綁定是把.NET類中的數據提供給用戶界面的一個重要概念,還允許修改數據,包括.NET4.5新增的INotifyDataErrorInfo接口。Commanding可以把UI的事件映射到代碼上。
TreeView和DataGrid控件是顯示數據綁定的UI控件.TreeView控件可以在樹形結構中顯示數據,其中數據根據用戶的選擇進行動態加載。通過DataGrid控件學習如何使用過濾、排序、分組,以及.NET4.5中添加的功能----實時成型,它可以實時改變排序或過濾選項。這篇只是簡單的說下WPF控件。
二.簡單控件
TextBox | 用於顯示簡單無格式文本 |
RichTextBox | 通過FlowDocument類支持帶格式的文本,它與TextBox都派生於TextBoxBase |
Calendar | 顯示你年份月份 |
DataPicker | 控件會打開Calendar屏幕,提供選擇日期 |
PasswordBox | 輸入密碼,可以通過PasswordChar修改顯示的格式,通過PasswordChanged可以觸發輸入事件 |
ScrollBar | 包含一個Thumb,用戶可以從Thumb中選擇一個值,如果內容超過這個了,我就可以顯示滾動條 |
ProgressBar | 可以指示時間較長的操作的進度 |
Slider | 用戶可以移動Thumb,選擇一個范圍的值,它和ScrollBar,ProgressBar都來源一個基類RanGeBase |
簡單控件是沒有Content屬性的控件,例如Button類可以包含任意形狀和任意元素。
三.內容控件
ContentControl有一個content屬性,利用Content屬性,可以給空間添加任意內容,因為Button類派生自基類ContentControl.所以在這個地方可以添加任何內容
例如:Button、RepeatButton、toggleButton、CheckBox、RadioButton、Label、
Frame 該控件支持導航、使用Navigate()方法可以導航到一個頁面的內容上、如果內容是HTML、就是用WebBrowser控件來顯示。
ListBoxItem 是ListBox的一項 、 ToolTip 創建一個彈窗 、其中UserControl也是內容控件
四.帶標題的內容控件
帶標題的內容控件派生自HeaderContentControl基類。HeaderContentControl類又派生於ContentControl,HeaderContentControl類的Header屬性定義了標題的內容,HeaderTemplate屬性可對標題金泉完全的定制。HeaderContentControl的控件如表
Expander | 可以創建一個帶對話框的“高級”模式,它在默認情況下不顯示所有的信息,只有用戶展開它。才會顯示更多的信息,在未展開下,只顯示標題信息,在展開的情況下,顯示內容 |
GroupBox | 提供了邊框和標題來組合控件 |
TabItem | TabItem的Header屬性定義了標題內容,這些內容都是用TabControl的標簽顯示 |
Expander空間的簡單用法如下列代碼,把Expander控件的Header屬性設置未Click formove 這個文本用於顯示擴展,這個控件的內容只有在控件展開的時候才顯示。
另外有兩個屬性可以修飾Content,HorizontalAlignment與VerticalAlignment 屬性就Center、Left、Right
五.項內容
ItemsControl類包含一個可以用Items屬性訪問的數據項列表。派生自ItemsControl的類。
Menu、ContextMenu | Menu類和ContextMenu類派生自抽象基類MenuBase。把MenuItem元素放在數據項列表和相關聯的命令中 |
StatusBar | StatusBar控件通常在應用程序的底部、為用戶提供狀態信息、可以把StatusBarItem元素放在StatusBar列表中 |
TreeView | 要分層顯示數據項 |
ListBox、ComboBox、TabControl | 都有相同的抽象基類Selector、這個基類可以選擇數據項 |
DataGrid | 顯示數據、可定制網格 |
下面例子說明了Border ViewBox和BulletDecorator類
ViewBox將子元素拉伸並縮放到可用的空間中。StretchDirection和Streth屬性專用於ViewBox的功能,它們允許設置子元素是否雙向拉伸,以及是否保持寬高比
BulletDecorator類用一個項目符號修飾其子元素。子元素可以是任何元素,項目符號也可以是任何元素。
<StackPanel>
<Border BorderBrush="Violet" BorderThickness="5">
<Label>呵呵噠</Label>
</Border>
<Viewbox StretchDirection="Both" Stretch="Uniform">
<Label Width="79">么么噠</Label>
</Viewbox>
<BulletDecorator Height="99.874">
<BulletDecorator.Bullet>
<Image Width="196.968" HorizontalAlignment="Center" Margin="5,5,-166.968,-51.636"
Source="http://p4.123.sogoucdn.com/imgu/2018/10/20181019163410_194.jpg"/>
</BulletDecorator.Bullet>
<BulletDecorator.Child>
<TextBlock>案說法</TextBlock>
</BulletDecorator.Child>
</BulletDecorator>
</StackPanel>
六.布局
1.StackPanel
在window程序中只能包含一個子元素。作為其內容。如果要在其中包含多個元素,就可以將StackPanel當作成一個子元素,並將在它當中添加子元素。它是一個簡單的控件,可以通過StackPanel控制顯示方向。ToolBarPanel類派生於StackPanel
2.WrapPanel
WrapPanel將子元素字左右逐個排列,若一個書評行中放不下,就排在下一行,面板的方向可以是水平或是垂直。
<WrapPanel> <WrapPanel.Resources> <Style TargetType="Button"> <Setter Property="Margin" Value="5"></Setter> </Style> </WrapPanel.Resources> <Button>button</Button> <Button>button</Button> <Button>button</Button> </WrapPanel>
3.Canvas
Canvas是一個允許顯式指定控件位置的面板,它定義了Left、right、top、bottom 屬性。這個我們后續詳解。
4.DockPanel
它非常類似於winform中的停靠功能,DockPanel可以指定排列子空間的區域。Panel定義了Dock附加屬性,代碼如下:
<DockPanel> <Border Background="AliceBlue" Height="25" DockPanel.Dock="Top"> <TextBlock>menu</TextBlock> </Border> <Border Background="DarkMagenta" DockPanel.Dock="Top"> <TextBlock>ribbon</TextBlock> </Border> <Border Background="LightPink" DockPanel.Dock="Bottom"> <TextBlock>status</TextBlock> </Border> <Border Background="LightPink" DockPanel.Dock="left"> <TextBlock>left side</TextBlock> </Border> <Border Background="HotPink"> <TextBlock>remaining part</TextBlock> </Border> </DockPanel>
七.Grid
使用grid可以在行和列中排序控件,對於每一列可以指定一個ColumnDefintion,對於每一行可以指定一個RowDefintion,在每一列和每一行中都可以指定高度和寬度,其中前面說到的兩個屬性中分別有一個Width以及Height 依賴屬性,其中單位有像素、厘米
英寸或點為單位定義高度和寬度,或者把它們設置為Auto,根據內容來確定其大小、在為列提供可用控件時,可以將width屬性設置為*,要使擴大到兩倍,就設置為2. 寫個示例大家就了解了。這個grid包含幾個label和textbox控件,因為這些控件的父控件是grid,所以可以設置附加column、columnspan、row、rowspan.
<Grid ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0"
VerticalAlignment="Center" HorizontalAlignment="Center" Content="Title"/>
<Label Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" Content="firstname:" Margin="10"/>
<TextBox Grid.Column="1" Grid.Row="1" Width="100" Height="30"></TextBox>
<Label Grid.Column="0" Grid.Row="2" VerticalAlignment="Center" Content="lastname:" Margin="10"/>
<TextBox Grid.Column="1" Grid.Row="2" Width="100" Height="30"></TextBox>
</Grid>
為了發方便看到行和列,把showgridlines屬性設置為True;注意:要使Grid的每個單元格有相同的尺寸,可以使用UniformGrid類。