一.样式
在 WPF(Windows Presentation Foundation)中,样式(Style)是一种定义控件外观和行为的机制。通过样式,您可以定义控件的属性,如背景、前景、字体样式、边框等,并将这些属性应用于一个或多个控件。
如果不通过样式,我们在生命标签对时,需要在每个标签对中都声明大量的属性,比如说我们要声明四个文本,代码如下:
<Grid>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="Text1" FontFamily="宋体" FontSize="18" Foreground="Red" FontWeight="Bold"/>
<TextBlock Text="Text2" FontFamily="宋体" FontSize="18" Foreground="Red" FontWeight="Bold"/>
<TextBlock Text="Text3" FontFamily="宋体" FontSize="18" Foreground="Red" FontWeight="Bold"/>
<TextBlock Text="Text4" FontFamily="宋体" FontSize="18" Foreground="Red" FontWeight="Bold"/>
</StackPanel>
</Grid>
运行结如下图所示,可以看到四个红色的文本。
为了避免在标签对中出现大量重复的内容我们重新定义样式,代码如下:
<Window.Resources>
<Style x:Key="text2" TargetType="{x:Type TextBlock}" >
<!-- TargetType 说明属性应用的类型 -->
<Setter Property="FontFamily" Value="宋体"/>
<Setter Property="FontSize" Value="18"/>
<Setter Property="Foreground" Value="Red"/>
<Setter Property="FontWeight" Value="Bold"/>
</Style>
</Window.Resources>
<Grid>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="Text1" Foreground="BlueViolet" Style="{StaticResource text2}"/>
<TextBlock Text="Text2" Style="{StaticResource text2}"/>
<TextBlock Text="Text3" Style="{StaticResource text2}"/>
<TextBlock Text="Text4" Style="{StaticResource text2}"/>
</StackPanel>
</Grid>
样式定义在<Window.Resources>包裹的标签对当中,TargetType关键字定义该样式作用的组件类型,我们要定义文本的样式,这里便直接选择文本。同时,应用样式时支持就近原则,即重复定义的属性会有优先<Grid>当中的的属性为准,上段代码中的运行结果如下图所示:
因为我们在后面的标签对中定义了紫色,所以会覆盖样式之中的红色。
二.布局
布局是一种用于安排和组织控件在用户界面中位置和大小的机制。WPF提供了多种布局容器,每个容器都具有不同的布局方式和特性,以满足各种布局需求。
下是WPF中常用的布局容器及其简要介绍:
Grid(网格布局):Grid 是最常用的布局容器之一,它将控件划分为行和列的网格,并可以在网格单元中放置控件。Grid 具有灵活的布局能力,可以使用行和列的定义来确定控件的位置和大小。
<Grid.RowDefinitions>和<Grid.ColumnDefinitions>定义每个Grid当中的行数和列数,测试代码如下:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<!-- 第一行,自动调整高度 -->
<RowDefinition Height="*"/>
<!-- 第二行,占据剩余空间 -->
<RowDefinition Height="100"/>
<!-- 第三行,固定高度为100 -->
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<!-- 第一列,自动调整宽度 -->
<ColumnDefinition Width="*"/>
<!-- 第二列,占据剩余空间 -->
<ColumnDefinition Width="200"/>
<!-- 第三列,固定宽度为200 -->
</Grid.ColumnDefinitions>
<!-- 在 Grid 中放置控件 -->
<Button Grid.Row="0" Grid.Column="0" Content="Button 1"/>
<Button Grid.Row="1" Grid.Column="1" Content="Button 2"/>
<Button Grid.Row="2" Grid.Column="2" Content="Button 3"/>
</Grid>
输入的结果图如下:
其他的布局使用的较少,之后会在使用的过程当中补充实例代码
StackPanel(堆栈布局):StackPanel 按照水平或垂直方向依次排列其子元素。它可用于创建简单的布局,其中控件按顺序堆叠在一起。
WrapPanel(自动换行布局):WrapPanel 与 StackPanel 类似,但它具有自动换行的特性。当空间不足时,WrapPanel 会将子元素自动放置到下一行或下一列
DockPanel(停靠布局):DockPanel 将其子元素停靠在容器的边缘或中心位置。子元素可以停靠在顶部、底部、左侧、右侧或中间位置,并可以指定停靠的顺序
Canvas(画布布局):Canvas 允许您以绝对位置坐标放置子元素。您可以使用 Canvas.Left、Canvas.Top 等属性来指定子元素在画布上的位置。
UniformGrid(均匀网格布局):UniformGrid 将其子元素平均分配到一个网格中。您可以指定行数、列数和子元素的对齐方式。
WrapGrid(换行网格布局):WrapGrid 类似于 UniformGrid,但它支持换行。它可以将子元素按照指定的行数和列数进行排列,并在空间不足时自动换行。