本文将告诉大家如何从控制台而不是 WinUI3 模版项目,从零一步步创建出 WinUI 3 应用

本文不是 WinUI 3 入门博客,本文将从比较基础层的方式创建出 WinUI 3 应用,适合于了解 WinUI 3 的伙伴阅读。阅读本文可以更好理解 WinUI 3 应用项目的初始化逻辑

在开始之前,先新建一个 dotnet 6 控制台项目,接着编辑项目的 csproj 项目文件,替换为如下代码进行初始化

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0-windows10.0.19041</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PlatformTarget>x86</PlatformTarget>
<RuntimeIdentifiers>win10-x86;win10-x64</RuntimeIdentifiers>
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<UseWinUI>true</UseWinUI>
<WindowsPackageType>None</WindowsPackageType>
</PropertyGroup> <ItemGroup>
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.3.230331000" />
</ItemGroup> </Project>

为了减少细节的干扰,本文这里采用的是引用 Microsoft.WindowsAppSDK 的方式而不是自己编写所有与 COM 连接的基础代码。如果对细节逻辑好奇的话,推荐阅读开源的 Microsoft.WindowsAppSDK 的源代码: https://github.com/microsoft/windowsAppSDK

如果自己编写所有和 COM 连接的基础代码,以上的 csproj 的 net6.0-windows10.0.19041 等限制是可以去掉的

接下来进入到 Program.cs 文件里面,咱将在这个文件里面编写创建 WinUI 3 应用的代码。在开始之前,还需要编写一个辅助类型,用于方便编写出代码,辅助类型的代码如下

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; public class App : Application
{
public event EventHandler<LaunchActivatedEventArgs>? Launched; protected override void OnLaunched(LaunchActivatedEventArgs args)
{
Launched?.Invoke(this, args);
}
}

进入到 Main 函数的第一句话就是调用 ComWrappersSupport 的 InitializeComWrappers 方法进行 WinUI 3 的 COM 调用的连接初始化,代码如下

internal class Program
{
static void Main(string[] args)
{
global::WinRT.ComWrappersSupport.InitializeComWrappers();
}

和 WPF 不相同的是 WinUI 3 是没有要求在 Main 函数采用 STA 线程的,也就是直接编写调用代码即可

接下来是调用 Microsoft.UI.Xaml.Application 的 Start 方法启动应用,如以下代码

internal class Program
{
static void Main(string[] args)
{
global::WinRT.ComWrappersSupport.InitializeComWrappers();
global::Microsoft.UI.Xaml.Application.Start((p) =>
{
});
}
}

不严谨的说,这么简单的逻辑就跑起来了 WinUI 3 应用了。如果还想看到界面,那就需要额外创建窗口,如下面代码

        global::Microsoft.UI.Xaml.Application.Start((p) =>
{
var app = new App();
app.Launched += (sender, e) =>
{
var window = new Window()
{
Title = "控制台创建应用"
};
window.Content = new Grid()
{
Children =
{
new TextBlock()
{
Text = "控制台应用",
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center
}
}
};
window.Activate();
};
});

以上代码创建了 App 类型,创建出来之后,将会由在 COM 层实现的底层调用到 OnLaunched 方法,然后到 Launched 事件。创建了窗口,调用 Activate 让窗口显示

全部代码如下

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; namespace FinayfuweewawWakibawlu; public class App : Application
{
public event EventHandler<LaunchActivatedEventArgs>? Launched; protected override void OnLaunched(LaunchActivatedEventArgs args)
{
Launched?.Invoke(this, args);
}
} internal class Program
{
static void Main(string[] args)
{
global::WinRT.ComWrappersSupport.InitializeComWrappers();
global::Microsoft.UI.Xaml.Application.Start((p) =>
{
var app = new App();
app.Launched += (sender, e) =>
{
var window = new Window()
{
Title = "控制台创建应用"
};
window.Content = new Grid()
{
Children =
{
new TextBlock()
{
Text = "控制台应用",
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center
}
}
};
window.Activate();
};
});
}
}

通过以上的代码即可在控制台创建 WinUI 3 应用

C# 从控制台创建 WinUI 3 应用的更多相关文章

  1. 中间件weblogic控制台创建数据源报错---根据真实故事改编

    1.在weblogic控制台创建数据源,有报错--不能创建数据源,图免 2.weblogic数据源管理节点所在服务器telnet测试,到数据库1521端口是通的 3.经过请教各路大神,得出结论:由于子 ...

  2. vue-cli在控制台创建vue项目时乱码的问题

    新装的win10系统,使用vue-cli在控制台创建项目时出现乱码,请问如何处理? 解决: 打开cmd,在控制台输入CHCP 65001,按回车键即可将编码格式设成utf-8,再创建就不会乱码了. 执 ...

  3. C# 从零开始写 SharpDx 应用 控制台创建 Sharpdx 窗口

    原文:C# 从零开始写 SharpDx 应用 控制台创建 Sharpdx 窗口 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http ...

  4. 用chrome的snippets片段功能创建页面js外挂程序,从控制台创建js小脚本

    用chrome的snippets片段功能创建页面js外挂程序,从控制台创建js小脚本 Chrome的snippets是小脚本,还可以创作并在Chrome DevTools的来源面板中执行.可以访问和从 ...

  5. 2018-8-17-C#-从零开始写-SharpDx-应用-控制台创建-Sharpdx-窗口

    title author date CreateTime categories C# 从零开始写 SharpDx 应用 控制台创建 Sharpdx 窗口 lindexi 2018-8-17 9:3:3 ...

  6. DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色

    本文将告诉大家如何使用 Vortice 底层库从零开始,从一个控制台项目,开始搭建一个最简单的使用 Direct2D1 的 DirectX 应用.本文属于入门级博客,期望本文能让大家了解 Vortic ...

  7. vue初级学习--控制台创建vue项目

    一.导语 困困的我,好想睡啊,但还是敲下这边有的没的的笔记吧 二.正文 1.输入 vue list 可查看此环境下,vue能创建的项目模板 没将webpack.vue-route啃精了的话,老实用we ...

  8. 我的Oracle控制台创建数据库的工具

    Oracle windows 11.2.0.4 在控制台cmd下的创建工具,不依赖于服务和监听 工具及下载:Oracle控制台工具 注意:其中的 “seeddatabase.gbk.7z”文件为从Or ...

  9. asp.net core-1.在控制台创建ASP.NET Core应用程序

    创建asp.net core应用程序,需要先把环境安装好,我这边选的是vs2017 第一步先执行dotnet 我执行dotnet --help可以把所有的命令全部列出来: 红框内就是我们可以用来初始化 ...

  10. chrome浏览器控制台创建js脚本并执行

    Chrome的snippets是小脚本,还可以创作并在Chrome DevTools的来源面板中执行.您可以访问和从任何页面运行它们.当你运行一个片段,它从当前打开的页面的上下文中执行.本文主要讲如何 ...

随机推荐

  1. 一天涨 23k Star 的开源项目「GitHub 热点速览」

    ​在 GitHub 上做过开源项目的小伙伴,可能都经历过截图自己项目 100 Star.1000 Star 的时刻,但有些时候事情发生的太快来不及截图,因为可能一觉醒来就破万了.这件事看似有些天方夜谭 ...

  2. HeaderedContentControl实现左右对称

    在我们使用TextBlock却想给前面添加固定字段的时候,发现TextBlock没有Header属性, 这个时候我们可以用到HeaderedContentControl 然而,默认情况下Headere ...

  3. TP6框架--EasyAdmin学习笔记:数据表添加新参数,如何强制清除缓存

    这是我写的学习EasyAdmin的第六章,这一章我给大家分享下如何在数据表中添加新参数,并强制清除缓存 这一章的主题是我在开发中碰到的一个问题,当我在网上疯狂查找解决方法依旧一无所获后,我又尝试了从底 ...

  4. elasticsearch聚合桶排序、分页实战

    很多时候业务上需要分组排序分页的场景,类似于mysql的group by xxx limit 0 10.so,当数据同步到es后,相同的需求场景也出现了.背景:商品根据商品销量排序,销量数据是以sku ...

  5. 02 jQuery选择器

    02 jQuery选择器 jQuery的逻辑和css选择器的逻辑是一样的. // 语法: $(选择器) 可以使用jQuery选择器快速的对页面结构进行操作. 案例: <!DOCTYPE html ...

  6. #Dijkstra,二进制拆位#洛谷 5304 [GXOI/GZOI2019]旅行者

    题目 分析(\(logk\)次Dijkstra) 首先为什么\(O(nklogn)\)的多次\(dijkstra\)为什么会TLE, 因为中间有许多的冗余状态,即使两点求出的路径是最短的,它也不一定是 ...

  7. nginx使用入门的笔记

    本文于2016年4月底完成,发布在个人博客网站. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 从源码安装nginx 下载软件 编译nginx,必备pcre,zlib ...

  8. clang的lto特性的资料

    clang对lto的支持,如下文章介绍的清晰.易懂. ThinLTO llvm+clang 添加 LTO(Link Time Optimization) 支持 编译优化之 - 链接时优化(LTO)入门 ...

  9. Redis之父萨尔瓦多·桑菲利波又名安蒂雷斯

    萨尔瓦多·桑菲利波又名安蒂雷斯 个人博客连接 嗨,我是萨尔瓦多·桑菲利波,也被称为安提雷斯, 一位居住在卡塔尼亚的意大利计算机程序员. 我于7年1977月2020日出生在坎波贝洛迪利卡塔. 2022 ...

  10. “最新趋势:R语言lavaan结构方程模型(SEM)的实践应用与技巧”

    结构方程模型(Sructural Equation Modeling,SEM)是分析系统内变量间的相互关系的利器,可通过图形化方式清晰展示系统中多变量因果关系网,具有强大的数据分析功能和广泛的适用性, ...