WPF 从零手动创建承载 Xamarin Forms 项目
现在完全开源的 Xamarin Forms 是支持使用 WPF 进行承载,也就是使用 Xamarin 开发的控件等是可以在 WPF 项目使用的。本文来告诉大家如何在 WPF 中运行 Xamarin Forms 项目,让 Xamarin Forms 构建为 WPF 应用
默认的 VS 没有加上 WPF 的模版,而官方文档 WPF Platform Setup - Xamarin 旧了一点,因为社区的开发比较激进,而文档没有更新
如果你按照官方文档玩,预计会在构建的时候看到如下提示
App.xaml : error : : XamlC error XFC0000 : Cannot resolve type "Application"
当然,现在是 2020.07.31 也许你看本文的博客,官方文档更新了,而本文也失效了。此时请不要以为我在骗你
上面代码的原因是此时不需要使用 App.xaml 了,也不需要使用 MainWindow.xaml 了,让咱手动从零开始创建
当然,需要先存在一个 Xamarin Forms 项目哈,最好这是一个使用模版重新创建的项目,使用的版本都是 4.8 以上。我推荐是新创建一个,这样你通过之后,才进行修改,能解决因为自己原有的 Xamarin Forms 项目的坑让代码构建失败
新建一个叫 Xx.WPF.csproj 的项目,请将 Xx 替换为你自己的名字。使用 WPF 项目没有安卓项目那么弱,对命名长度要求比较多,在安卓项目里面如果你敢将名字命名比较长,那么将会因为路径太长炸掉,详细请看 Xamarin 构建安卓失败 因为路径太长
在 Xx.WPF.csproj 添加如下代码
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net472</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Xamarin.Forms.Platform.WPF" Version="4.8.0.1269" />
</ItemGroup>
</Project>
十分简单的逻辑代码,需要注意的是 Win7 非 sp1 最高版本 .NET Framework 4.5.2 同时不支持 .NET Core 任何版本, 而 Win7 加上 Sp1 的系统能支持到 .NET Framework 4.8 的版本和 .NET Core 版本
因为 需要有 OpenTK 的支持,而 OpenTK 最低是 .NET Framework 4.6.1 因此暂时无法降级到 .NET Framework 4.5 版本用来支持 Win7 非 sp1 系统
好,继续写一个叫 Program.cs 的类,小伙伴可以看到,一个 WPF 程序是只有 csproj 文件和 Program.cs 文件就可以完成对 Xamarin Forms 项目的承载
在 Program.cs 创建主函数
static void Main(string[] args)
{
}
注意需要给 Main 添加 STA 线程
[STAThread]
static void Main(string[] args)
{
}
如果没有加上这个特性,那么将会在运行提示如下代码
System.InvalidOperationException:“调用线程必须为 STA,因为许多 UI 组件都需要。”
接下来就是创建 Application 创建 WPF 应用,然后运行消息调度,接着加载 Xamarin Forms 应用作为界面
var application = new Application();
Forms.Init();
var formsApplicationPage = new FormsApplicationPage();
formsApplicationPage.LoadApplication(new XamarinNeller.App());
application.Run(formsApplicationPage);
此时就完成了,试试运行一下
代码放在 github 欢迎小伙伴访问
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java.lang.Illegalaccessexception 或 java.lang.NoSuchMethodError
- Python 爬虫进阶必备 | 关于某电商 token 参数加密逻辑分析
- Python 爬虫进阶必备 | 某直播数据分析平台加密参数 sign 分析
- Python 爬虫进阶必备 | 某指数分析平台解密逻辑分析
- SpringBoot开发秘籍 - 事件异步处理
- Hive on Spark参数调优姿势小结
- 想跨端开发小程序?这个最流行的跨端框架一定要学习!
- 1分钟搞定 Nginx 版本的平滑升级与回滚
- 详解:如何在uni-app中选择一个合适的UI组件库
- Python处理HTTP请求之requests指北
- 习题 3: 数字和数学计算
- Python桌面图形程序美化的方法论
- Windows 入侵痕迹清理技巧
- Linux 入侵痕迹清理技巧
- 面经手册 · 第10篇《扫盲java.util.Collections工具包,学习排序、二分、洗牌、旋转算法》