本文告诉大家在 dotnet 5 里,如何使用 WinRT 加上 Microsoft.Windows.SDK 的辅助来调用 WindowsRuntime 方法。当前是 2021.10 此时的 Windows App SDK 还没准备好,也因此构建起来等逻辑都有点锅。本文和大家演示如何在 WPF 应用里面用上 UWP 提供的 FolderPicker 类型

需要将原有的基于 .NET 5 的 WPF 应用的 csproj 替换 net5.0-windowsnet5.0-windows10.0.19041.0 代码如下

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

  <PropertyGroup>
<OutputType>WinExe</OutputType>
<UseWPF>true</UseWPF>
<TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>
</PropertyGroup> </Project>

以上表示采用 10.0.19041.0 的 SDK 版本,更多可用的版本请参阅 CsWinRT/authoring.md at master · microsoft/CsWinRT

当前有以下的 SDK 可用

  • net5.0-windows10.0.17763.0
  • net5.0-windows10.0.18362.0
  • net5.0-windows10.0.19041.0
  • net5.0-windows10.0.20348.0
  • net6.0-windows10.0.17763.0
  • net6.0-windows10.0.18362.0
  • net6.0-windows10.0.19041.0
  • net6.0-windows10.0.20348.0

我当前也理不清 CsWinRT 和 Windows App SDK 等仓库和技术线的关系,请不要问我为什么会碰到这些仓库

接下来需要在 cs 代码里面定义一个 COM 接口,通过此接口进行初始化。尽管官方文档说可以使用 WinRT.Interop.InitializeWithWindow.Initialize 方法进行初始化,然而实际上我没有找到此 InitializeWithWindow 类型。好在这些都是 COM 接口,可以自己定义,代码如下

        [ComImport]
[Guid("3E68D4BD-7135-4D10-8018-9FB6D9F33FA1")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IInitializeWithWindow
{
void Initialize(IntPtr hwnd);
}

以上接口是通过 Pin secondary tiles from desktop apps - Windows apps 文档了解的

先创建 FolderPicker 对象

            var folderPicker = new Windows.Storage.Pickers.FolderPicker();
folderPicker.FileTypeFilter.Add("*");

接着将当前的窗口给到 FolderPicker 对象,让这个对象可以作为窗口的模态

            var hwnd = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle; //WinRT.Interop.WindowNative.GetWindowHandle(this);

            //WinRT.Interop.InitializeWithWindow.Initialize(folderPicker, hwnd);
//IInitializeWithCoreWindow initializeWithCoreWindow;// 这个不能使用
var initializeWithCoreWindow = folderPicker.As<IInitializeWithWindow>();
initializeWithCoreWindow.Initialize(hwnd);

接下来就可以和 UWP 一样使用 FolderPicker 让用户选择文件夹

            var folder = await folderPicker.PickSingleFolderAsync();
Debug.WriteLine(folder.Path);

使用本文的方法,应用是不需要进行打包为 MSIX 包在用户端进行部署就可以使用,双击 exe 就可以使用,和之前的相同。因为调用 WindowsRuntime 的原理是 COM 调用,不需要进行打包

本文所有代码放在 githubgitee 欢迎访问

可以通过如下方式获取本文代码

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 26b7b6eec1f8e734bb9dbd49447f62fe2e116a9c

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git

获取代码之后,进入 WelhearyalluneaceKujalwhekiraqi 文件夹

大概可以从 Breaking change: Built-in support for WinRT is removed from .NET 文档了解到为什么在 .NET 5 需要用到 CsWinRT 的原因

dotnet 5 让 WPF 调用 WindowsRuntime 方法的更多相关文章

  1. WPF调用Matlab函数方法

    有的时候用C#写图像处理方法,比较费事,不如Matlab简单,但是Matlab又做不出WPF那样的好看界面,怎么办呢. 今天正好我要实现这个功能,就顺便写个小例子,给需要的人做个借鉴. 想要用WPF调 ...

  2. Python/dotNET Redis服务连接客户端调用SET方法的同时获取Redis服务器返回的内容

    在用Python或dotNET redis客户端连接redis服务器的时候,当你调用客户端的SET方法后同时还想得到其返回的字符串,那么需要处理一下. 1. Redis Python redis客户端 ...

  3. .NET混合开发解决方案12 网页JS调用C#方法访问WinForm或WPF窗体

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  4. .Net中的AOP系列之《间接调用——拦截方法》

    返回<.Net中的AOP>系列学习总目录 本篇目录 方法拦截 PostSharp方法拦截 Castle DynamicProxy方法拦截 现实案例--数据事务 现实案例--线程 .Net线 ...

  5. dotNET使用DRPC远程调用运行在Storm上的Topology

    Distributed RPC(DRPC)是Storm构建在Thrift协议上的RPC的实现,DRPC使得你可以通过多种语言远程的使用Storm集群的计算能力.DRPC并非Storm的基础特性,但它确 ...

  6. WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变

    本文说明WPF [调用线程无法访问此对象,因为另一个线程拥有该对象.] 解决方案以及如何实现字体颜色的渐变 先来看看C#中Timer的简单说明,你想必猜到实现需要用到Timer的相关知识了吧. C# ...

  7. WPF调用图片路径,或资源图片

    一.加载本项目的图片WPF引入了统一资源标识Uri(Unified Resource Identifier)来标识和访问资源.其中较为常见的情况是用Uri加载图像.Uri表达式的一般形式为:协议+授权 ...

  8. 纠正网上乱传的android调用Webservice方法。

    1.写作背景: 笔者想实现android调用webservice,可是网上全是不管对与错乱转载的文章,结果不但不能解决问题,只会让人心烦,所以笔者决定将自己整理好的能用的android调用webser ...

  9. PCB Genesis脚本C#使用WPF窗体实现方法

    用C#写脚本做UI界面基本上都是用WinForm界面,如果想制作很漂亮动态的界面用WPF界面挺不错的选择, 这里介绍如何使用控制台程序调用WPF窗口 一.方法一 在控制台程序中,通过Main方法启动W ...

  10. dotnet 获取程序所在路径的方法

    在 dotnet 有很多方法可以获取当前程序所在的路径,但是这些方法获取到的路径有一点不相同,特别是在工作路径不是当前的程序所在的路径的时候 通过下面几个方法都可以拿到程序所在的文件夹或程序文件 Ap ...

随机推荐

  1. 记录--卸下if-else 侠的皮衣!- 策略模式

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 当我是if-else侠的时候 怕出错 给我一个功能,我总是要写很多if-else,虽然能跑,但是维护起来确实很难受,每次都要在一个方法里面 ...

  2. JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简单集成教程

    JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简单集成教程 JS文件在最下面: 引入 <script src="${path}/js/jquery-2.0.3.mi ...

  3. #组合计数,全排列#洛谷 2518 [HAOI2010]计数

    题目 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数. 比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. ...

  4. #主席树#CF813E Army Creation

    题目 \(n\) 个数 \(a_i\) , \(k\) 为给定值, \(q\) 次询问. 每次问 \([l,r]\) 内最多可以选多少个数, 满足同一个数的出现次数不超过 \(k\) 不带修,强制在线 ...

  5. OpenHarmony 4.0 Beta2新版本发布,邀您体验

     2023年8月3日,OpenAtom OpenHarmony(简称"OpenHarmony")发布了Beta2版本,相较于历史版本我们持续完善ArkUI.文件管理.媒体.窗口.安 ...

  6. OpenHarmony社区运营报告(2022年10月)

    本月快讯 ● <深圳市推动软件产业高质量发展的若干措施>于10月24日发布. ● 社区共发展逾5000位贡献者累计为社区提交超过11万个PR,深圳市优博终端科技有限公司(以下简称" ...

  7. 全面指南:技术写作与编辑工具 Markdown、Git 研究工具

    技术写作工具 在技术写作领域,"工具"是指技术写作者用于创建.管理和发布高质量技术文档的各种软件和应用程序.这包括文字处理器.桌面出版应用程序.XML 编辑器.内容管理系统等等.一 ...

  8. Numpy数组索引和切片

    数组可以通过索引或切片的方式进行访问或修改,数组切片x[start:stop:step],与Ptyhon内置的list标准索引和切片类似,只是数组产生的是一个非副本视图,根据条件索引的值如果修改,直接 ...

  9. JS 取Json中对象特定属性值

    解析JSON JSON 数据 var str = '[{"a": "1","b": "2"}, {"a&quo ...

  10. Qt Create开发,修改 .Pro 文件改变 exe 的名称

    // .pro // 修改 TARGET 就可以改变生成的exe的名称 TARGET = Test // 要是生成的exe名称中需要带有空格,需要用到$$quote TARGET = $$quote( ...