Xamarin.FormsでWPF・GTKアプリも開発してみたかった


※以下の記事で使用したファイル群をGitHubにアップロードしています。
 YSRKEN/HelloXamarin

概要

 @tan-y さんの記事を読んで試してみました。
 なお操作環境は、Windows 10 64bitの上でVisual Studio Community 2017 Version 15.6.2を使用するとしています。

  Xamarin.Formsで Windows (Classic) Desktop アプリ開発を今からしてみる
  もう少し簡単に Xamarin.Forms で Windows (Classic) Desktop アプリ開発を今からしてみる

操作手順を総ざらい

  1. Visual Studioで「ツール→オプション→NuGet パッケージマネージャー→パッケージソース」と進み、パッケージソースにNightly Builds のソースを追加する
  2. 新規プロジェクトをテンプレート「Cross-Platform App (Xamarin.Forms)」から作成する。
    • 使用フレームワークは「.NET Framework 4.7」以降とし、PCLではなくShared Projectを選択する
  3. 2.で作成したソリューションに、新規プロジェクトをテンプレート「WPF アプリ (.NET Frameowrk)」から追加する
    • その際、2.で作成したShared ProjectをWPF側のプロジェクトの参照に追加すること
  4. NuGetパッケージマネージャーを開き、パッケージソースを「Xamarin.Forms Nightly」に切り替え、Nightly BuildsのXamarin.Formsを全プロジェクトに追加
  5. WPFのプロジェクトに、NugetでNightly BuildsのXamarin.Forms.Platform.WPFを追加
  6. この記述を読みながら、WPF側のスタートアップコードを整える

いったいどこが分からなかったのか?

 操作手順5.までは滞りなく進んだ……と言いたいところでしたが、操作手順3.の「Shared ProjectをWPF側のプロジェクトの参照に追加」がなかなかできませんでした。この「追加→参照→共有プロジェクト→ソリューション」で出てくるこれにチェックを入れる必要があるようですが、初見でそれを察するのは厳しい……。

 また、↑を行った後に6.を実装してみましたが、WPFのMainWindow.xamlは、結局

MainWindowOld.xaml
<Window
    x:Class="HelloXamarin.WPF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Window>

MainWindowNew.xaml
<wpf:FormsApplicationPage
    x:Class="HelloXamarin.WPF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:wpf="clr-namespace:Xamarin.Forms.Platform.WPF;assembly=Xamarin.Forms.Platform.WPF"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</wpf:FormsApplicationPage>

に書き換えろということですよね? また、App.xamlも

AppOld.xaml
<Application
    x:Class="HelloXamarin.WPF.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:HelloXamarin.WPF"
    StartupUri="MainWindow.xaml">
    <Application.Resources>
    </Application.Resources>
</Application>

AppNew.xaml
<Application
    x:Class="HelloXamarin.WPF.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:HelloXamarin.WPF"
    StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/WPFLightToolkit;component/Assets/Default.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <SolidColorBrush x:Key="AccentColor" Color="#303F9F" />
        </ResourceDictionary>
    </Application.Resources>
</Application>

に書き換えろということですよね?
 ……ただ、こうして書き換えてからWPF側をビルドしようとすると、次のようなビルドエラーが出てしまいます。Android側のプロジェクトにもエラーが出ていますが、そちらはビルド・実行できてしまう不思議。

 エラー内容を見ると、たぶん「Microsoft.Windows.Design.Extensibility」が抜けているのだと思われますので、「参照→参照の追加→アセンブリ→拡張」から追加してやると、WPF側もビルド・実行できました(これが正しい処置かは知らない)。

おまけ:GTKアプリの場合

 手順自体は前述の記事に書いてある通りなので省略します。