C# 使用 WinUI 3 项目模板创建桌面应用程序

文章目录

  • 1. 概述
  • 2. 先决条件
  • 3. 创建项目步骤
  • 4. 项目结构简介
  • 5. 代码示例
    • 5.1. `MainWindow.xaml` (UI 定义)
    • 5.2. `MainWindow.xaml.cs` (逻辑代码)
  • 6. 生成和运行应用程序
  • 7. 关键概念

1. 概述

本示例演示如何使用 Visual Studio 中的 “Blank App, Packaged (WinUI 3 in Desktop)” C# 项目模板创建一个简单的 WinUI 3 桌面应用程序。这个应用程序将包含一个按钮和一个文本块,点击按钮后,文本块的内容会发生改变。

2. 先决条件

  • Visual Studio 2022 或更高版本: 确保已安装 “.NET Multi-platform App UI development” (MAUI) 工作负载,或者至少是 “Universal Windows Platform development” 工作负载,并确保 WinUI 3 模板可用。通常,安装最新的 Windows App SDK 扩展会自动添加这些模板。
  • Windows App SDK: 确保已安装最新版本的 Windows App SDK。Visual Studio 安装程序通常会处理这个问题。
  • 启用开发者模式: 在 Windows 设置中启用开发者模式(设置 -> 更新和安全 -> 开发者选项 -> 开发者模式)。

3. 创建项目步骤

(1) 打开 Visual Studio。
(2) 点击 “创建新项目 (Create a new project)”。
(3) 在搜索框中输入 “WinUI”。
(4) 选择 C# 版本的 空白应用,已打包(桌面版中的WinUI 3)“Blank App, Packaged (WinUI 3 in Desktop)” 模板。
* 注意: 不要选择 UWP 版本的模板,也不要选择 “Blank App, Packaged with WAP (WinUI 3 in Desktop)”(除非你有特定需求并了解其差异)。

项目模板
(5) 给项目命名(例如 MyWinUI3AppCS),选择一个位置,然后点击 “创建 (Create)”。

创建项目

(6) Visual Studio 可能会提示你选择目标 Windows 版本和最低 Windows 版本。通常可以接受默认设置。

4. 项目结构简介

创建项目后,你会看到以下关键文件和文件夹:

  • App.xaml / App.xaml.cs: 应用程序的入口点。App.xaml.cs 中的 OnLaunched 方法负责创建和显示主窗口。
  • MainWindow.xaml / MainWindow.xaml.cs: 应用程序的主窗口。
    • MainWindow.xaml: 定义窗口的 UI 布局(使用 XAML)。
    • MainWindow.xaml.cs: 包含窗口的逻辑代码(C#)。
  • Package.appxmanifest: 应用程序包的清单文件,包含应用程序的元数据、功能声明等。

5. 代码示例

我们将修改 MainWindow.xamlMainWindow.xaml.cs

5.1. MainWindow.xaml (UI 定义)

打开 MainWindow.xaml 文件,将其内容替换为以下 XAML 代码:

<Windowx:Class="MyWinUI3AppCS.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:MyWinUI3AppCS"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"><StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="20"><TextBlock x:Name="myTextBlock" Text="Hello, WinUI 3!" FontSize="24" HorizontalAlignment="Center"/><Button x:Name="myButton" Content="Click Me" Click="MyButton_Click" HorizontalAlignment="Center"/></StackPanel>
</Window>

XAML 说明:

  • <Window>: 应用程序的主窗口根元素。
  • <StackPanel>: 一个布局控件,将其子元素垂直(Orientation="Vertical")或水平排列。
    • HorizontalAlignment="Center"VerticalAlignment="Center": 使 StackPanel 及其内容在窗口中居中。
    • Spacing="20": 设置子元素之间的间距。
  • <TextBlock x:Name="myTextBlock">: 用于显示文本。
    • x:Name="myTextBlock": 为文本块指定一个名称,以便在 C# 代码中引用它。
    • Text="Hello, WinUI 3!": 初始显示的文本。
    • FontSize="24": 设置字体大小。
  • <Button x:Name="myButton">: 一个按钮控件。
    • x:Name="myButton": 为按钮指定名称。
    • Content="Click Me": 按钮上显示的文本。
    • Click="MyButton_Click": 指定当按钮被点击时要调用的事件处理程序方法(在 C# 代码中定义)。

5.2. MainWindow.xaml.cs (逻辑代码)

打开 MainWindow.xaml.cs 文件,确保它包含以下代码(模板通常会生成构造函数,我们主要添加事件处理程序):

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.namespace MyWinUI3AppCS
{/// <summary>/// An empty window that can be used on its own or navigated to within a Frame./// </summary>public sealed partial class MainWindow : Window{public MainWindow(){this.InitializeComponent();// Optional: Set a title for the windowthis.Title = "My First WinUI 3 App (C#)";}private void MyButton_Click(object sender, RoutedEventArgs e){myTextBlock.Text = "Button Clicked! Welcome!";}}
}

C# 代码说明:

  • public sealed partial class MainWindow : Window: 定义了 MainWindow 类,它继承自 Microsoft.UI.Xaml.Windowpartial 关键字表示该类的定义分布在多个文件中(XAML 生成的代码和我们编写的代码)。
  • public MainWindow(): 类的构造函数。
    • this.InitializeComponent();: 非常重要! 这个方法由 XAML 编译器生成,它负责加载 XAML 中定义的 UI 元素并将它们连接到代码。必须在构造函数中首先调用它。
    • this.Title = "My First WinUI 3 App (C#)";: (可选) 设置窗口的标题栏文本。
  • private void MyButton_Click(object sender, RoutedEventArgs e): 这是在 XAML 中为按钮的 Click 事件指定的处理程序。
    • myTextBlock.Text = "Button Clicked! Welcome!";: 当按钮被点击时,这行代码会通过 myTextBlock (在 XAML 中定义的 TextBlockx:Name) 访问该文本块,并将其 Text 属性更改为新的字符串。

6. 生成和运行应用程序

  1. 在 Visual Studio 顶部工具栏中,确保选择了正确的启动项目(应该是你刚创建的项目)。
  2. 选择一个目标平台(例如 x64x86)。
  3. 点击 “启动 (Start)” 按钮(通常是一个绿色的播放箭头)或按 F5
  4. 应用程序将会编译并启动。你会看到一个窗口,其中包含文本 “Hello, WinUI 3!” 和一个 “Click Me” 按钮。点击按钮后,文本会变为 “Button Clicked! Welcome!”。

程序运行

程序点击后

7. 关键概念

  • XAML (Extensible Application Markup Language): 用于声明式地定义 WinUI 3 应用程序的用户界面。
  • Code-Behind: 与 XAML 文件关联的 C# (或 C++) 代码文件,用于处理 UI 逻辑和事件。
  • Controls: UI 的构建块,如 Button, TextBlock, TextBox, StackPanel 等。
  • Events: 用户与 UI 交互时触发的动作,如按钮点击 (Click)。
  • Windows App SDK: 提供了一组库和工具,使桌面应用程序能够使用现代 Windows UI (WinUI 3)、API 和平台特性。
  • Packaged App: 应用程序被打包成 .msix 格式,可以通过 Microsoft Store 或旁加载方式分发和安装。

打包后的目录如下:
文件结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式简述(十八)享元模式

享元模式 描述基本组件使用 描述 当内存中存在大量类似的对象时&#xff0c;可以考虑使用享元模式减少整体内存占用。 可以将相同的部分和不同的部分进行拆分&#xff0c;以达到多个对象共享相同部分内存的目的。 基本组件 通常享元对象通过共享的属性映射一个享元对象。 公…

大数据狙击金融欺诈——技术如何守护交易安全?

大数据狙击金融欺诈——技术如何守护交易安全? 金融领域一直是欺诈行为的“重灾区”,从传统的信用卡盗刷到精心策划的网络诈骗,攻击者不断进化手法,使得防御变得越来越复杂。然而,大数据技术的出现,让金融欺诈检测从被动防守转向主动狙击,通过深度学习、行为分析和实时…

如何通过DNS解析实现负载均衡?

在当今的互联网时代&#xff0c;随着网络应用的飞速发展&#xff0c;网站和各类在线服务面临着海量的用户请求。为了保障服务的高可用性和高性能&#xff0c;负载均衡技术应运而生。DNS&#xff08;域名系统&#xff09;负载均衡作为其中一种重要的实现方式&#xff0c;凭借其简…

MySQL解决主从复制的报错问题

MySQL 8.4 非 GTID 模式部分数据库主从复制指南 在进行MySQL 8.4非GTID模式下部分数据库主从复制时&#xff0c;以下是详细的操作步骤以及对应的执行位置说明&#xff0c;还有报错处理方法介绍&#xff1a; 操作步骤 1. 备份主库指定数据库&#xff08;db1、db2&#xff09;…

Linux的域名解析服务器

什么是DNS DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分 布式数据库&#xff0c;能够使人更方便的访问互联网 DNS使用的是53端口&#xff0c; 通常DNS是以UDP这个较快速的数据传输协议来查询的&…

vue 中绑定样式 【class样式绑定】

class 样式绑定 在 Vue 中&#xff0c;可以通过 :class&#xff08;或简写 v-bind:class&#xff09;实现类名&#xff08;class&#xff09;样式的绑定。Vue 提供了几种常用的绑定方式&#xff0c;分别支持字符串、对象和数组语法。 绑定字符串 <div :class"active…

Unity3D 序列化机制:引擎内的应用场景和基本原理

前言 Unity3D 的序列化机制是其核心功能之一&#xff0c;用于在编辑器和运行时之间持久化数据、管理场景状态、处理预制体&#xff08;Prefab&#xff09;以及实现跨平台兼容性。以下是其应用场景和基本原理的详细解析&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小…

Python 字典键 “三变一” 之谜

开头&#xff1a;读者的“玄学”字典谜题 上周&#xff0c;朋友发来了一段让他抓耳挠腮的代码&#xff1a; >>> {True: foo, 1: bar, 1.0: baz} {True: baz} “我明明定义了布尔True、整数1、浮点数1.0三个键&#xff0c;结果字典里只剩True一个键&#xff0c;值…

如何选择 RabbitMQ、Redis 队列等消息中间件?—— 深度解析与实战评估

如何选择 RabbitMQ、Redis 队列等消息中间件?—— 深度解析与实战评估 1. 引言 在现代分布式系统架构中,消息队列(Message Queue,MQ) 作为解耦服务、异步处理和高效通信的关键组件,被广泛应用于高并发、微服务和数据流处理场景。选择合适的消息中间件不仅能提高系统的稳…

特征工程四:数据特征提取TfidfVectorizer的使用

TfidfVectorizer 深度解析 TfidfVectorizer 是 scikit-learn 中用于文本特征提取的核心工具&#xff0c;它将原始文本转换为 TF-IDF 特征矩阵&#xff0c;是自然语言处理(NLP)和文本挖掘的基础组件。 一、核心原理 1. TF-IDF 计算 TF (Term Frequency)&#xff1a;词频&…

c/c++爬虫总结

GitHub 开源 C/C 网页爬虫探究&#xff1a;协议、实现与测试 网页爬虫&#xff0c;作为一种自动化获取网络信息的强大工具&#xff0c;在搜索引擎、数据挖掘、市场分析等领域扮演着至关重要的角色。对于希望深入理解网络工作原理和数据提取技术的 C/C 开发者&#xff0c;尤其是…

PostgreSQL 的表连接方法

PostgreSQL 的表连接方法 PostgreSQL 提供了多种高效的连接算法&#xff0c;每种方法适用于不同的查询场景。以下是 PostgreSQL 支持的四种主要表连接方法及其特点&#xff1a; 1 Nested Loop Join&#xff08;嵌套循环连接&#xff09; 工作原理 对外表的每一行&#xff0…

【Qt】qss语法详解

QSS (Qt Style Sheets) 语法格式详解 QSS 是 Qt 的样式表语言&#xff0c;类似于 CSS&#xff0c;用于自定义 Qt 应用程序的外观。以下是 QSS 的完整语法格式说明&#xff1a; 基本语法结构 selector {property: value;property: value;... }1. 选择器 (Selectors) 基本选择…

Azure资源创建与部署指南

本文将指导您如何在Azure平台上创建和配置必要的资源,以部署基于OpenAI的应用程序。 资源组创建 资源组是管理和组织Azure资源的逻辑容器。 在Azure门户顶端的查询框中输入"Resource groups"(英文环境)或"资源组"(中文环境)在搜索结果中点击"资…

Java后端快速生成验证码

Hutool是一个小而全的Java工具类库&#xff0c;它提供了很多实用的工具类&#xff0c;包括但不限于日期处理、加密解密、文件操作、反射操作、HTTP客户端等。 核心工具类&#xff1a;CaptchaUtil&#xff0c;CaptchaUtil 是 Hutool 提供的一个工具类&#xff0c;用于创建各种类…

sql 备份表a数据到表b

备份表a数据到表b mysql CREATE TABLE sys_dict_240702 LIKE sys_dict;INSERT INTO sys_dict_240702 SELECT * FROM sys_dict;mssql select * into t_Dict_240702 from t_Dict

2.4GHz无线通信芯片选型指南:集成SOC与低功耗方案解析

今天给大家分享几款2.4GHz无线通信芯片方案&#xff1a; 一、集成SOC芯片方案 XL2407P&#xff08;芯岭技术&#xff09; 集成射频收发机和微控制器&#xff08;如九齐NY8A054E&#xff09; 支持一对多组网和自动重传 发射功率8dBm&#xff0c;接收灵敏度-96.5dBm&#xff08…

Tomcat与纯 Java Socket 实现远程通信的区别

Servlet 容器​​&#xff08;如 Tomcat&#xff09; 是一个管理 Servlet 生命周期的运行环境&#xff0c;主要功能包括&#xff1a; ​​协议解析​​&#xff1a;自动处理 HTTP 请求/响应的底层协议&#xff08;如报文头解析、状态码生成&#xff09;&#xff1b; ​​线程…

[超级简单]讲解如何用PHP实现LINE Pay API!

在 PHP 中实现 LINE Pay API 之前我应该​​做哪些准备&#xff1f;如何在 PHP 中实现 LINE Pay API&#xff1f; 目录 [前提] 环境使用 PHP 实现 LINE Pay API 的准备工作使用 PHP 实现 LINE Pay API概括 [前提] 环境 这次我们将使用SandBox环境&#xff08;测试环境&a…

centos7.x下,使用宝塔进行主从复制的原理和实践

操作原理&#xff1a; 一、主库配置 1.修改 MySQL 配置文件 # 编辑主库配置文件&#xff08;路径根据实际系统可能不同&#xff09; vim /etc/my.cnf # 添加以下配置 [mysqld] server-id 1 # 唯一 ID&#xff0c;主库设置为 1 log-bin mysql-bin …