现在完全开源的 Xamarin Forms 是支持使用 WPF 进行承载,也就是使用 Xamarin 开发的控件等是可以在 WPF 项目使用的。本文来告诉大家如何在 WPF 中运行 Xamarin Forms 项目,让 Xamarin Forms 构建为 WPF 应用
默认的 VS 没有加上 WPF 的模版,而官方文档 WPF Platform Setup - Xamarin 旧了一点,因为社区的开发比较激进,而文档没有更新
如果你按照官方文档玩,预计会在构建的时候看到如下提示
代码语言:javascript复制 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 添加如下代码
代码语言:javascript复制<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 创建主函数
代码语言:javascript复制 static void Main(string[] args)
{
}
注意需要给 Main 添加 STA 线程
代码语言:javascript复制 [STAThread]
static void Main(string[] args)
{
}
如果没有加上这个特性,那么将会在运行提示如下代码
代码语言:javascript复制System.InvalidOperationException:“调用线程必须为 STA,因为许多 UI 组件都需要。”
接下来就是创建 Application 创建 WPF 应用,然后运行消息调度,接着加载 Xamarin Forms 应用作为界面
代码语言:javascript复制 var application = new Application();
Forms.Init();
var formsApplicationPage = new FormsApplicationPage();
formsApplicationPage.LoadApplication(new XamarinNeller.App());
application.Run(formsApplicationPage);
此时就完成了,试试运行一下
代码放在 github 欢迎小伙伴访问