演练:使用 WPF 设计器创建大小可调的应用程序

更新:2007 年 11 月

可将 GridSplitter 控件与 Grid 容器控件结合使用,以创建在运行时可由用户调整大小的窗口布局。例如,在 UI 划分为多个区域的应用程序中,用户可以根据自己的需要来拖动拆分器,从而使某个区域更大。在本演练中,您将为 Messenger 样式的应用程序创建布局。

在本演练中,您将执行下列任务:

  • 创建一个 WPF 应用程序。

  • 配置默认的网格面板。

  • 添加一个水平 GridSplitter

  • 添加停靠面板和控件。

  • 添加网格面板和控件。

  • 测试应用程序。

下面的插图说明您的应用程序将如何显示。

可调整大小的应用程序

说明:

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置

先决条件

您需要以下组件来完成本演练:

  • Visual Studio 2008

创建项目

第一个过程是为该应用程序创建项目。

创建项目

  1. 使用 Visual Basic 或 Visual C# 创建一个名为 ResizableApplication 的新 WPF 应用程序项目。有关更多信息,请参见如何:创建新的 WPF 应用程序项目

    说明:

    在本演练中,您将不会编写任何代码。为项目选择的语言是用于应用程序中代码隐藏页面的语言。

    Window1.xaml 在 WPF 设计器中打开。

  2. 在“文件”菜单上单击“全部保存”。

配置默认的 Grid Panel 控件

默认情况下,新的 WPF 应用程序包含一个带有 Grid 面板的 Window。为了遵从最佳做法,您将此 Grid 专用于 GridSplitter。网格计划如下:

第 1 行:一个用于布局第一部分的 Dock 面板。

第 2 行:一个 GridSplitter

第 3 行:一个用于布局其余部分的 Grid 面板。

配置默认的 Grid Panel 控件

  1. 在“设计”视图中选择 Grid。有关更多信息,请参见如何:在设计图面上选择和移动元素

  2. 在“属性”窗口中,找到 RowDefinitions 属性,并单击“属性值”列中的省略号按钮。

    此时将会显示“集合编辑器”。

  3. 单击“添加”三次以添加三行。

  4. 将第二行的 Height 属性设置为 Auto。

  5. 将第三行的 MinHeight 属性设置为 70。

  6. 单击“确定”以关闭“集合编辑器”并返回到 WPF 设计器。

    现在该网格中有三行,但仅有两行显示。其 Height 属性被设置为 Auto 的行会暂时隐藏,因为它没有任何内容。对于本演练,这样是可以的。为了避免将来出现这种情况,您可以在工作时使用星号调整大小,然后在完成后改成“Auto”。

  7. 在“文件”菜单上单击“全部保存”。

添加水平的 GridSplitter

然后添加 GridSplitter

添加水平的 GridSplitter

  1. 在“设计”视图中选择 Grid

  2. 从“工具箱”中将一个 GridSplitter 控件拖到 Grid 上。

  3. 在“属性”窗口中设置 GridSplitter 的下列属性:

    属性

    ResizeDirection

    Rows

    Grid.Column

    0

    Grid.ColumnSpan

    1

    Grid.Row

    1

    Grid.RowSpan

    1

    Width

    Auto

    Height

    10

    HorizontalAlignment

    Stretch

    VerticalAlignment

    Stretch

    Margin

    0

  4. 在“文件”菜单上单击“全部保存”。

添加停靠面板和控件

接下来您将添加一个 DockPanel 并设置应用程序上半部分的布局。DockPanel 包含一个 Label 和一个 RichTextBox。设置 LabelRichTextBox 的颜色,以便在移动 GridSplitter 时突出显示应用程序上半部分的大小。

添加停靠面板和控件

  1. 在“设计”视图中选择 Grid

  2. 从“工具箱”中将一个 DockPanel 控件拖到 Grid 上。

  3. 在“属性”窗口中设置 DockPanel 的下列属性:

    属性

    Grid.Column

    0

    Grid.ColumnSpan

    1

    Grid.Row

    0

    Grid.RowSpan

    1

    LastChildFill

    True (Checked)

    Width

    Auto

    Height

    Auto

    HorizontalAlignment

    Stretch

    VerticalAlignment

    Stretch

    Margin

    0

  4. 从“工具箱”中将一个 Label 控件拖到 DockPanel 上。

  5. 在“属性”窗口中,设置 Label 的下列属性:

    属性

    Background

    Blue (#FF0000FF)

    Foreground

    White (#FFFFFFFF)

    Content

    Display

    DockPanel.Dock

    Top

    Width

    Auto

    Height

    23

    HorizontalAlignment

    Stretch

    VerticalAlignment

    Stretch

    Margin

    0

  6. 在“设计”视图中选择 DockPanel

    提示:

    由于有多个控件覆盖网格,因此可以使用 Tab 键、“文档大纲”窗口或 XAML 视图更加轻松地选择 DockPanel。有关更多信息,请参见如何:在设计图面上选择和移动元素

  7. 从“工具箱”中将一个 RichTextBox 控件拖到 DockPanel 上。

  8. 在“属性”窗口中设置 RichTextBox 的下列属性:

    属性

    Background

    LightBlue (#FFADD8E6)

    DockPanel.Dock

    Bottom

    Width

    Auto

    Height

    Auto

    HorizontalAlignment

    Stretch

    VerticalAlignment

    Stretch

    Margin

    0

    IsReadOnly

    True (Checked)

  9. 在“文件”菜单上单击“全部保存”。

添加网格面板和控件

接下来您将添加一个 Grid 并设置应用程序下半部分的布局。Grid 包含一个 Button 和一个 RichTextBox。设置 RichTextBox 的颜色,以便在移动 GridSplitter 时突出显示应用程序下半部分的大小。

添加网格面板和控件

  1. 在“设计”视图中选择 Grid

  2. 从“工具箱”中将一个 Grid 控件拖到 Grid 上。

  3. 在“属性”窗口中设置新 Grid 的下列属性:

    属性

    Grid.Column

    0

    Grid.ColumnSpan

    1

    Grid.Row

    2

    Grid.RowSpan

    1

    Width

    Auto

    Height

    Auto

    HorizontalAlignment

    Stretch

    VerticalAlignment

    Stretch

    Margin

    0

  4. 在“属性”窗口中,找到 ColumnDefinitions 属性,并单击“属性值”列中的省略号按钮。

    此时将会显示“集合编辑器”。

  5. 单击两次“添加”添加两列。

  6. 将第二列的 Width 属性设置为 Auto。

  7. 单击“确定”以关闭“集合编辑器”并返回到 WPF 设计器。

  8. 从“工具箱”中将一个 Button 控件拖到 Grid 上。

  9. 在“属性”窗口中,设置 Button 的下列属性:

    属性

    Content

    OK

    Grid.Column

    1

    Grid.ColumnSpan

    1

    Grid.Row

    0

    Grid.RowSpan

    1

    Width

    60

    Height

    60

    HorizontalAlignment

    Stretch

    VerticalAlignment

    Stretch

    Margin

    5

  10. 从“工具箱”中将一个 RichTextBox 控件拖到 Grid 上。

  11. 在“属性”窗口中设置 RichTextBox 的下列属性:

    属性

    Background

    PaleGoldenrod (#FFEEE8AA)

    Grid.Column

    0

    Grid.ColumnSpan

    1

    Grid.Row

    0

    Grid.RowSpan

    1

    Width

    Auto

    Height

    Auto

    HorizontalAlignment

    Stretch

    VerticalAlignment

    Stretch

    Margin

    0

    IsReadOnly

    False (Unchecked)

  12. 在“文件”菜单上单击“全部保存”。

测试应用程序

最后一个过程是测试该应用程序。

测试应用程序

  1. 在“调试”菜单上单击“启动调试”。

    该应用程序启动并将显示“Window1”。

  2. 在垂直方向和水平方向调整该窗口的大小。

    应用程序的上半部分和下半部分展开,并按协定使用可用空间。

  3. 拖动拆分器,以调整应用程序各个部分的大小。使应用程序的一部分比另一部分小。

  4. 再次调整窗口的大小。

    应用程序的上半部分和下半部分展开,并根据拆分器的位置按协定成比例分布。

  5. 将拆分器尽量向应用程序顶部拖动。

    应用程序的上半部分消失,只显示下半部分。

  6. 将拆分器尽量向应用程序底部拖动。

    应用程序的下半部分仍然显示。这是因为您将第三行的 MinHeight 属性设置为 70。

    说明:

    70 = 60(按钮高度)+ 5(按钮的上边距)+ 5(按钮的下边距)

  7. 关闭该窗口。

汇总所有内容

下面是完成的 Window1.xaml 文件:

<Window x:Class="Window1"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
            <RowDefinition MinHeight="70" />
        </Grid.RowDefinitions>
        <DockPanel Grid.Row="0" Grid.RowSpan="1" HorizontalAlignment="Stretch" Margin="0" Name="DockPanel1">
            <Label DockPanel.Dock="Top" Height="23" Width="Auto" Background="Blue" Foreground="White" Name="Label1">Display</Label>
            <RichTextBox DockPanel.Dock="Bottom" Height="Auto" Width="Auto" Background="LightBlue" IsReadOnly="True" Name="RichTextBox1" />
        </DockPanel>
        <GridSplitter Grid.Row="1" Grid.RowSpan="1" ResizeDirection="Rows" Width="Auto" Height="10" HorizontalAlignment="Stretch" Margin="0" Name="GridSplitter1" />
        <Grid Grid.Row="2" HorizontalAlignment="Stretch" Margin="0" Name="Grid1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <Button Grid.Column="1" HorizontalAlignment="Stretch" Margin="5" Width="60" Height="60" Name="Button1">OK</Button>
            <RichTextBox Grid.Column="0" Grid.ColumnSpan="1" HorizontalAlignment="Stretch" Margin="0" Background="PaleGoldenrod" Name="RichTextBox2" />
        </Grid>
    </Grid>
</Window>

后续步骤

您在本演练中创建的应用程序包含一个水平拆分器。可以改用垂直拆分器来创建相同的应用程序,以进行试验。

您创建的应用程序只演示了布局技术。您可以通过添加代码进行试验,以使应用程序具有功能。例如,您可以向按钮单击事件中添加代码,从而将按钮文本框中的文本复制到顶部文本框中。

请参见

任务

如何:用 GridSplitter 创建用户可调整大小的应用程序

概念

使用绝对定位和动态定位进行布局

其他资源

布局演练