WPF 从零手动创建承载 Xamarin Forms 项目

2020-08-11 16:18:20 浏览数 (1)

现在完全开源的 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 欢迎小伙伴访问

0 人点赞