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

**※以下の記事で使用したファイル群をGitHubにアップロードしています。**
　[YSRKEN/HelloXamarin](https://github.com/YSRKEN/HelloXamarin)

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

　　[Xamarin.Formsで Windows (Classic) Desktop アプリ開発を今からしてみる](https://qiita.com/tan-y/items/cf5088c6853ebb1b6c64)
　　[もう少し簡単に Xamarin.Forms で Windows (Classic) Desktop アプリ開発を今からしてみる](https://qiita.com/tan-y/items/e08d297c2d013214eb83)

# 操作手順を総ざらい

1. Visual Studioで「ツール→オプション→NuGet パッケージマネージャー→パッケージソース」と進み、パッケージソースにNightly Builds のソースを追加する
 - 名前は「Xamarin.Forms Nightly」、URLは[https://www.myget.org/F/xamarinforms-ci/api/v2](https://www.myget.org/F/xamarinforms-ci/api/v2)とする
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. [この記述を読みながら](https://qiita.com/tan-y/items/cf5088c6853ebb1b6c64#wpf-の場合)、WPF側のスタートアップコードを整える

# いったいどこが分からなかったのか？
　操作手順5.までは滞りなく進んだ……と言いたいところでしたが、操作手順3.の「**Shared ProjectをWPF側のプロジェクトの参照に追加**」がなかなかできませんでした。この「追加→参照→共有プロジェクト→ソリューション」で出てくるこれにチェックを入れる必要があるようですが、初見でそれを察するのは厳しい……。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/31f9f99e-8ddc-9a70-f18e-0acde566b152.png)

　また、↑を行った後に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側のプロジェクトにもエラーが出ていますが、そちらはビルド・実行できてしまう不思議。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/b32adf32-2d88-3785-efa7-b97f2679a6eb.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/339a1775-5363-11cf-5c90-e3586767cc3c.png)

# おまけ：GTKアプリの場合
　手順自体は前述の記事に書いてある通りなので省略します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/86b042f4-d8d1-8fd9-9897-1ea444a6fefc.png)