Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件

WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件

作者头像
walterlv
发布于 2020-02-10 07:51:42
发布于 2020-02-10 07:51:42
6K00
代码可运行
举报
运行总次数:0
代码可运行

WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项。不过,通常更有实际价值的是更复杂的 UWP 控件的引入,通常是一整个 Page。

本文将介绍如何在 WPF 项目中引用 UWP 的控件库。

创建一个 UWP 控件库

建议专门为你复杂的 UWP 控件创建一个 UWP 控件库。在这个控件库中的开发就像普通 UWP 应用一样。这样比较容易创建出更复杂的 UWP 控件出来,而不会与 WPF 项目产生太多的影响。

▲ 创建一个 UWP 控件库

▲ 选择 SDK 版本

对 WPF 项目的准备工作

你依然需要阅读 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文,以便将你的 WPF 项目改造成可以访问 UWP 类型的项目。

不方便的引入方式

你如果直接让 WPF 项目添加 UWP 项目的引用,将会得到一个错误提示:

也就是说并不能直接完成这样的引用。

也许将来 WPF 项目格式更新或者 Visual Studio 的更新能为我们带来这样更直接此引用方式。不过现在来看,还不能如此方便地使用。

编辑 UWP 项目文件

是的,你需要手工编写 UWP 的项目文件。

如果你阅读过 (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序 这篇文章,或者已经 理解了 C# 项目 csproj 文件格式的本质和编译流程,那么对这里 csproj 文件的编辑应该不会感觉到陌生或者害怕。当然,即便你没有编辑过或者不理解 csproj 也不用担心,你只需要按照本文要求进行操作即可。

现在,右击卸载项目,再右击编辑项目文件:

▲ 编辑项目文件

找到 Import targets 的哪一行,你需要在那一行前面的任意位置添加以下特别标注为新增的几行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
++  <PropertyGroup>
++    <EnableTypeInfoReflection>false</EnableTypeInfoReflection>
++    <EnableXBindDiagnostics>false</EnableXBindDiagnostics>
++  </PropertyGroup>
    <Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />

随后,还要在以上 targets 之后再添加以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<PropertyGroup>
  <!-- 这里需要填写你的 WPF 项目的路径 -->
  <HostFrameworkProjectFolder>$(ProjectDir)..\Whitman.Wpf</HostFrameworkProjectFolder>
  <ObjPath>obj\$(Platform)\$(Configuration)\</ObjPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
  <ObjPath>obj\$(Configuration)\</ObjPath>
</PropertyGroup>
<PropertyGroup>
  <!-- 把此项目的输出文件都拷贝到 WPF 项目的生成路径下 -->
  <PostBuildEvent>
    md $(HostFrameworkProjectFolder)\$(ProjectName)
    md $(HostFrameworkProjectFolder)\bin\$(Configuration)\$(ProjectName)
    copy $(TargetDir)*.xbf            $(HostFrameworkProjectFolder)\bin\$(Configuration)\$(ProjectName)
    copy $(ProjectDir)*.xaml          $(HostFrameworkProjectFolder)\bin\$(Configuration)\$(ProjectName)
    copy $(ProjectDir)*.xaml.cs       $(HostFrameworkProjectFolder)\$(ProjectName)
    copy $(ProjectDir)$(ObjPath)*.g.* $(HostFrameworkProjectFolder)\$(ProjectName)
  </PostBuildEvent>
</PropertyGroup>

需要注意:

  • 一定要在 targets 之后添加这些代码,因为 $(TargetDir)$(ProjectName) 等属性是在那里的 targets 执行完后才生成的。
  • 你的 UWP 项目中需要有 xaml,比如可以添加一个 MainPage.xaml 和 MainPage.xaml.cs,不然编译的时候可能会出现错误。

重新加载项目并编译

现在,重新加载那个 UWP 控件库,将其编译,以便将 UWP 项目的生成文件复制到 WPF 目录下。

▲ 生成的文件已复制到 WPF 目录下

在 WPF 项目中间接引用 UWP 控件库

现在,在 WPF 项目中开启所有文件夹的显示,然后将 UWP 项目中生成的文件添加到 WPF 项目中:

▲ 在 WPF 的项目中添加 UWP 的控件库

为了能够在每次编译 WPF 项目的时候确保 UWP 项目先编译,需要为 WPF 项目设置项目依赖。在依赖对话框中将 UWP 项目设为依赖。

▲ 添加项目依赖

现在,编译 WPF 项目的时候,会将 UWP 项目编译后的源码也一起编译到 WPF 项目中;相当于间接使用了 UWP 的控件库。

特别的,如果你的项目被 git 进行版本管理,你可能需要忽略 UWP 控件库项目中的文件。方法是在 WPF 项目内生成的 UWP 文件夹下添加一个 .gitignore 文件,填写所有内容忽略:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*.*

但记得需要额外通过 git add ./Whitman.Wpf/Whitman.Uwp/.gitignore 把这个文件添加到版本管理中,不然其他人不会生效。

在 WPF 项目中使用 UWP 控件库中的控件

这时,在 WindowsXamlHost 中就可以添加 UWP 控件库中的 MainPage 了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<XamlHost:WindowsXamlHost InitialTypeName="Walterlv.Whitman.Universal.MainPage" />

于是,你可以在局部获得 UWP 完整 Page 的支持。或者你整个界面都是用 UWP 开发都没问题,并且还能获得 .NET Framework 的完全访问支持。(当然,未来一定是 .NET Core。)

▲ 运行后的效果

可以使用 UWP 的 Page,并且也能弹出 UWP 的 MessageDialog

而 MainPage 就是普通的 UWP MainPage:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Page
    x:Class="Walterlv.Whitman.Universal.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Walterlv.Whitman.Universal"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <StackPanel Width="400" VerticalAlignment="Center">
        <TextBlock>
            <Run Text="欢迎访问 吕毅的博客" />
            <LineBreak />
            <Run Text="https://blog.walterlv.com" />
        </TextBlock>
        <Button Content="Click" Click="DemoButton_Click" />
    </StackPanel>
</Page>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace Walterlv.Whitman.Universal
{
    public sealed partial class MainPage : Page
    {
        public MainPage() => InitializeComponent();

        private async void DemoButton_Click(object sender, RoutedEventArgs e)
        {
            var button = (Button) sender;
            await new MessageDialog("UWP 的消息框,在 WPF 的窗口中。", "walterlv").ShowAsync();
        }
    }
}
参考资料
本文会经常更新,请阅读原文: https://blog.walterlv.com/post/use-uwp-con

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
发布于 2018-07-25 01:27 更新于 2018-07-26 23:23
walterlv
2018/09/18
1.4K0
(1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj
发布于 2018-01-15 16:04 更新于 2018-09-07 04:40
walterlv
2018/09/18
1.5K0
将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj
从以前的项目格式迁移到 VS2017 新项目格式 必须删除必须修改添加文件项目引用引用包删除多余文件输入注释多个框架使用条件判断迁移 WPF 项目
以前的项目格式使用的是 csproj 的格式,但是 .net core 支持使用 project.json 格式的项目文件,后来还是决定不使用这个格式。 VS2017 的项目格式更好读、更简单而且减少了 git 冲突。 本文来告诉大家如何从 VS2015 和以前的项目格式修改为 VS2017 项目格式。
林德熙
2018/09/18
3.9K0
WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit)
Windows Community Toolkit 再次更新到 5.0。以前可以在 WPF 中使用有限的 UWP 控件,而现在有了 WindowsXamlHost,则可以使用更多 UWP 原生控件了。
walterlv
2020/02/10
4.8K0
.NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
.NET/C# 程序从 Main 函数开始执行,基本上各种书籍资料都是这么写的。不过,我们可以写多个 Main 函数,然后在项目文件中设置应该选择哪一个 Main 函数。
walterlv
2023/10/22
8620
.NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
[WPF]是时候将WPF控件库从.Net Framework升级到.NET Core 3.1
去年中我曾考虑将我的控件库项目Kino.Toolkit.Wpf升级到.NET Core,不过很快放弃了,因为当时.NET Core是预览版,编译WPF还需要使用最新的Visual Studio 2019,这样作为一个教学项目不够友好。到了今天.NET Core 3.1都出来了,已经正式支持WPF和Winform,Visual Studio 2019也已经普及,我觉得应该是时候将我的控件库升级到.NET Core。那么现在是WPF正式迁移到.NET Core的好时机吗?我认为还不是,把一个成熟的WPF程序迁移到.NET Core风险任然较大,而且不见得有多少好处。但对各种WPF类库/控件库来说情况又不一样了,为了可以满足更多的用户,让控件库可以同时支持.NET Framework和.NET Core十分重要;而且通常类库对其它组件的依赖较少,升级的风险没那么大。所以要玩.NET Core的WPF,从类库/控件库开始是一个好的选择。
dino.c
2020/04/10
4.3K0
[WPF]是时候将WPF控件库从.Net Framework升级到.NET Core 3.1
从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目)
默认情况下,我们打包 NuGet 包时,目标项目安装我们的 NuGet 包会引用我们生成的库文件(dll)。除此之外,我们也可以专门做 NuGet 工具包,还可以做 NuGet 源代码包。然而做源代码包可能是其中最困难的一种了,目标项目安装完后,这些源码将直接随目标项目一起编译。
walterlv
2023/10/23
1.2K0
从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目)
将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF;同时还发布了 Visual Studio 2019 预览版。你可以基于 .NET Core 3 创建 WPF 程序。不过,如果你已经有基于 .NET Framework 的 WPF 项目,那么如何快速迁移到基于 .NET Core 的版本呢?
walterlv
2023/10/22
3930
将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
WPF 程序的编译过程
基于 Sdk 的项目进行编译的时候,会使用 Sdk 中附带的 props 文件和 targets 文件对项目进行编译。Microsoft.NET.Sdk.WindowsDesktop 的 Sdk 包含 WPF 项目的编译过程。
walterlv
2023/10/22
4910
WPF 程序的编译过程
制作通过 NuGet 分发的源代码包时,如果目标项目是 WPF 则会出现一些问题(探索篇,含解决方案)
在使用 NuGet 包来分发源代码时,如果目标项目是 WPF 项目,那么会有一大堆的问题。
walterlv
2023/10/22
5410
制作通过 NuGet 分发的源代码包时,如果目标项目是 WPF 则会出现一些问题(探索篇,含解决方案)
新 csproj 对 WPF/UWP 支持不太好?有第三方 SDK 可以用!MSBuild.Sdk.Extras
发布于 2018-05-22 07:07 更新于 2018-07-25 23:21
walterlv
2018/09/18
1.8K0
新 csproj 对 WPF/UWP 支持不太好?有第三方 SDK 可以用!MSBuild.Sdk.Extras
WPF 使用 Microsoft.Toolkit.Wpf.UI.Controls 的 InkCanvas 做高性能笔迹应用
本文告诉大家如何在 WPF 中应用上 UWP 的笔迹控件,从而实现性能超级高的笔迹应用的方法
林德熙
2021/12/23
1.2K0
使用 WPF 做一个可以逼真地照亮你桌面的高性能阳光
本文想要做的,可不是随便弄一点阳光的半透明形状,然后简单地放到桌面上,而是真真正正地要照亮桌面上的窗口元素!并且,全程使用 GPU 加速,而且代码超简单。
walterlv
2023/10/23
5710
使用 WPF 做一个可以逼真地照亮你桌面的高性能阳光
在UWP项目中使用Entity Framework (20210505)
代码链接:scirem/EntityFrameworkLovesUWP (github.com)
ZhangYang
2021/05/05
6000
在UWP项目中使用Entity Framework (20210505)
WPF 讲讲 Microsoft.NET.Sdk.WindowsDesktop 的原理
在使用 .NET Core 3.0 和以上版本,可以使用新的 SDK 版本支持的 csproj 项目文件,这个 SDK 格式的项目文件可以支持 .NET Core 以及 .NET Framework 版本的 WPF 核心就是在 csproj 项目的第一句话。本文就来和大家聊这个 Microsoft.NET.Sdk.WindowsDesktop 的原理
林德熙
2020/03/23
1.5K0
WPF 应用完全模拟 UWP 的标题栏按钮
发布于 2018-08-04 09:35 更新于 2018-08-05 02:21
walterlv
2018/09/18
2.3K0
WPF 应用完全模拟 UWP 的标题栏按钮
WPF:无法对元素“XXX”设置 Name 特性值“YYY”。“XXX”在元素“ZZZ”的范围内,在另一范围内定义它时,已注册了名称。
2020-04-03 06:44
walterlv
2020/04/08
3.3K0
MSBuild/Roslyn 和 NuGet 的 100 个坑
发布于 2018-07-04 13:29 更新于 2018-09-04 13:08
walterlv
2018/09/18
1.4K0
MSBuild/Roslyn 和 NuGet 的 100 个坑
使用 Uno Islands 在现有 WPF 里面嵌入 Uno 框架
随着 2022 9 月份 Uno 发布了 4.5 版本,现有的 WPF 应用多了一个新的开发模式,那就是通过 Uno Islands 技术,在现有的 WPF 应用里面嵌入 Uno 应用。通过此方式可以辅助在现有的 WPF 项目里面,部分功能迁入 Uno 项目,或者是某些新开发功能通过 Uno 实现,从而利用 Uno 跨平台的能力,逐个功能点支持跨平台功能。逐个小功能接入的方式,让开发者不需要为一次性迁移一个庞大的项目而烦恼
林德熙
2023/04/07
6510
用 WiX 制作安装包:制作 WPF 安装包界面(入门篇)
本文是 WiX Toolset 安装包制作入门教程 系列中的一篇,可前往阅读完整教程。
walterlv
2023/10/23
1.2K0
用 WiX 制作安装包:制作 WPF 安装包界面(入门篇)
推荐阅读
(1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
1.4K0
将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj
1.5K0
从以前的项目格式迁移到 VS2017 新项目格式 必须删除必须修改添加文件项目引用引用包删除多余文件输入注释多个框架使用条件判断迁移 WPF 项目
3.9K0
WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit)
4.8K0
.NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
8620
[WPF]是时候将WPF控件库从.Net Framework升级到.NET Core 3.1
4.3K0
从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目)
1.2K0
将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
3930
WPF 程序的编译过程
4910
制作通过 NuGet 分发的源代码包时,如果目标项目是 WPF 则会出现一些问题(探索篇,含解决方案)
5410
新 csproj 对 WPF/UWP 支持不太好?有第三方 SDK 可以用!MSBuild.Sdk.Extras
1.8K0
WPF 使用 Microsoft.Toolkit.Wpf.UI.Controls 的 InkCanvas 做高性能笔迹应用
1.2K0
使用 WPF 做一个可以逼真地照亮你桌面的高性能阳光
5710
在UWP项目中使用Entity Framework (20210505)
6000
WPF 讲讲 Microsoft.NET.Sdk.WindowsDesktop 的原理
1.5K0
WPF 应用完全模拟 UWP 的标题栏按钮
2.3K0
WPF:无法对元素“XXX”设置 Name 特性值“YYY”。“XXX”在元素“ZZZ”的范围内,在另一范围内定义它时,已注册了名称。
3.3K0
MSBuild/Roslyn 和 NuGet 的 100 个坑
1.4K0
使用 Uno Islands 在现有 WPF 里面嵌入 Uno 框架
6510
用 WiX 制作安装包:制作 WPF 安装包界面(入门篇)
1.2K0
相关推荐
(1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验