看了一周多了C#和.NET了,还没有搞清楚 visual C# 中WPF的界面设计器的布局怎么弄,以及常用的控件分别有哪些。
接下来看看WPF中的控件与布局。
继承关系?
没有图片,用表格凑活一下
继承关系 | 该类继承的Interface | ||
| | ContentControl | IAddChild | --> Window、Button等各类控件都派生自这儿 |
Control | |||
FrameworkElement | IFrameworkInputElement | -->布局Panel,各类形状Shape 都派生自这儿 | |
UIElement | IAnimatable | ||
Visual | DUCE.IResource | ||
DependencyObject | |||
DispatcherObject |
布局
在WPF中,这些东西被称为Panel。在Qt中称为 Layout
Canvas | 画布,感觉上,这个东西应该不算布局了,需要手动指定其上各个控件的位置和大小。(WPF,每一个控件中只能指定一个子控件?) |
DockPanel | 水平或竖直地布局子元素,相对于另一个 |
Grid | 网格状布局,类比Qt中的QGridLayout |
StackPanel | 水平或竖直布局所有子元素,类比 Qt中的 QBoxLayout,而和QStackedLayout没有共同点 |
VirtualizingPanel | 使部分子元素可见(抽象类) |
WrapPanel | 子元素可以自动换行,类比Qt中的 Flow Layout |
在Qt中,每个Widget都有一个被称为QSizePolicy的东西,用来控制自己在布局中的变化的意愿。在 WPF 中,类似的东西称为Alignment(对齐)
HorizontalAlignment | Left |
VerticalAlignment | Top |
除此外,每个控件还有两个重要属性
- Margin
- Padding
Grid
1个2X2的网格布局,
-
首先定义行和列的属性(自动,固定,按比例)
- 放置各个控件(控件通过自己的附加属性来告诉布局额外的信息)
<Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition /> </Grid.ColumnDefinitions> <Slider Name="slider1" VerticalAlignment="Center" /> <Slider Name="slider2" VerticalAlignment="Center" Grid.Row="1" /> <TextBox Name="textBox1" VerticalAlignment="Center" Grid.Column="1" /> <TextBox Name="textBox2" VerticalAlignment="Center" Grid.Column="1" Grid.Row="1" /> </Grid>
StackPanel
相当于Qt中QBoxLayout,重要属性就是方向:水平、竖直
<StackPanel Orientation="Horizontal"> <ListBox Name="listBox1" Width="100" /> <TabControl Name="tabControl1" Width="200"> <TabItem Header="tabItem1" Name="tabItem1"> <Grid /> </TabItem> </TabControl> </StackPanel>
DockPanel
这个东西比较有意思,应该也是很有用了。由于每个控件都要Top/Botton/Left/Right这样靠在一个边上,所以剩下的空间总是一个矩形,而后来的控件占据该矩形一边后,又形成一个新的矩形。
<DockPanel Name="dockPanel1"> <ProgressBar Height="20" Name="progressBar1" DockPanel.Dock="Top" VerticalAlignment="Top" /> <MediaElement Name="mediaElement1" Width="160" HorizontalAlignment="Left" /> <ScrollBar Name="scrollBar1" Orientation="Horizontal" Height="20" VerticalAlignment="Bottom" /> <WebBrowser Name="webBrowser1" /> </DockPanel>
一个重要属性是:LastChildFill
其他
类似于Qt中的QSplitter,WPF中有个GridSplitter
<Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition /> </Grid.ColumnDefinitions> <GridSplitter Grid.Column="0" Grid.RowSpan="2" Width="10" Background="Red" /> <Slider Name="slider1" VerticalAlignment="Center" /> <Slider Name="slider2" VerticalAlignment="Center" Grid.Row="1" /> <TextBox Name="textBox1" VerticalAlignment="Center" Grid.Column="1" /> <TextBox Name="textBox2" VerticalAlignment="Center" Grid.Column="1" Grid.Row="1" /> </Grid>