跳到主要内容

2.1 环境准备与第一个窗口

学习目标​

完成本节后,你能判断电脑是否具备 WPF 开发条件,创建一个 net10.0-windows 项目,并说清楚应用、窗口和代码后置之间的关系。建议先读从 ASP.NET Core 到 WPF,建立桌面进程与 Web 请求的区别。

开发环境与运行环境​

WPF 是 Windows 桌面 UI 框架。本教程使用 .NET 10,开发和实际运行都以 Windows 为前提。把项目目标写成 net10.0 不会自动获得 WPF;需要 Windows 目标框架和 UseWPF 开关。其他系统上的跨目标构建能力,也不意味着可以在那些系统运行 WPF 窗口。

SDK 用来开发,运行时用来执行已经编译好的程序。 SDK 提供编译器、项目模板和构建工具,并包含相应运行时。普通 .NET Runtime 主要支持非桌面应用;框架依赖的 WPF 程序需要匹配版本和架构的 .NET Desktop Runtime。电脑上能运行某个 .NET 程序,并不能证明它能创建或编译项目。

在终端检查环境:

PowerShell:检查 .NET 安装
dotnet --list-sdks
dotnet --list-runtimes

第一条应列出 10.0.xxx SDK。第二条中的 Microsoft.WindowsDesktop.App 10.0.x 表示桌面运行时。若只看到运行时,请安装 .NET 10 SDK;若使用 Visual Studio,选择支持 .NET 10 的版本,并安装“.NET 桌面开发”工作负载。Visual Studio 的 XAML 编辑、断点和实时可视化树很适合入门,但下面的命令不依赖它。

创建并运行项目​

在你保存练习的目录执行以下命令。这里的项目名同时决定默认命名空间,后续基础示例统一使用 WpfBasics。

PowerShell:创建 WpfBasics
dotnet new wpf -n WpfBasics -f net10.0
Set-Location WpfBasics
dotnet run

模板参数使用 net10.0,生成的项目文件会使用 Windows 目标框架。若模板提示不支持该参数,先核对当前生效的 SDK,以及上级目录是否有 global.json 固定了旧版本。不要仅通过修改文件掩盖 SDK 缺失的问题。

运行后会出现默认窗口。关闭它,检查项目文件;下面是本教程使用的完整项目文件。

WpfBasics.csproj(完整文件)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net10.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>

WinExe 创建 Windows 应用,通常不额外显示控制台。UseWPF 使构建过程处理 XAML、生成对应的部分类,并引用 WPF 所需程序集。你不需要像 ASP.NET Core 那样配置 HTTP 管道才能显示窗口。

让第一个窗口显示内容​

保留模板中的 App.xaml 和 App.xaml.cs,把两个 MainWindow 文件替换为以下完整内容。

MainWindow.xaml(完整文件)
<Window x:Class="WpfBasics.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WPF 学习窗口" Width="640" Height="360"
MinWidth="400" MinHeight="240">
<Grid Margin="24">
<TextBlock Text="你好,WPF!"
FontSize="28"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</Window>
MainWindow.xaml.cs(完整文件)
using System.Windows;

namespace WpfBasics;

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}

Window 是操作系统看到的顶层窗口;Grid 是它的内容容器;TextBlock 负责显示文字。Width 和 Height 使用 WPF 的设备独立单位,通常每单位对应 1/96 英寸,不宜理解为永远等于一个物理像素。

x:Class 指向 C# 中的 WpfBasics.MainWindow。构建过程生成另一部分代码,InitializeComponent() 负责加载 XAML 中声明的对象。应用入口则由模板中的 App.xaml 提供:StartupUri="MainWindow.xaml" 启动这个窗口。默认应用会在最后一个窗口关闭后结束,不是每次点击按钮就创建一次“请求”。

:::tip 使用 .NET 8 的已有项目

这些基础机制在 .NET 8 中同样成立。若组织暂时固定使用 .NET 8,可把目标框架改为 net8.0-windows,并安装对应 SDK 和桌面运行时。教程后续的包版本和实战项目仍以 .NET 10 为准,需要分别核对兼容性。

:::

常见错误​

  • 命令找不到模板或不能编译:优先确认 SDK,而不是只查看运行时列表。
  • 提示找不到 InitializeComponent 或窗口类型:检查 XAML 的 x:Class、C# 命名空间和类名是否完全一致,确保文件属于项目。
  • 修改后看不到效果:确认运行的是当前项目;先结束旧进程,再重新运行。窗口标题是辨认练习版本的好方法。
  • 把窗口宽高都写死:窗口可以调整大小,但内部内容仍可能被固定尺寸裁剪。下一节与布局章节会逐步处理这个问题。

动手练习与验收​

把标题改为“我的任务客户端”,正文改为“今天开始学习 WPF”,设置最小宽度为 480。重新运行并拖动窗口边缘。

验收标准:项目能够启动;标题栏和正文都显示新文字;窗口无法缩到最小宽度以下;关闭最后一个窗口后应用结束。还应能解释为什么仅安装 Desktop Runtime 无法完成编译,以及 x:Class 指向哪个 C# 类型。

官方延伸资料​