C#で画面をつくる。何でつくる？

# C#で画面を作るときの選択肢について

## はじめにの前に

Qiitaユーザーは[zenn](https://zenn.dev/)に引越したのでしょうか。
投げ銭システムは魅力的ですよね。

Qiitaランキングの載っている記事が、個々人の備忘録のレベルに下がってきている気がしています（余計なお世話）

個人的には、記事を書くハードルが下がるので、棲み分けはよいことだと思います。

## はじめに

**.NET 6**やら**WinUI 3**など、いろいろな技術がリリースされる中
私の主戦場はもっぱら**WinForms**です。

たまに**WPF**も触るけど、**UWP**は触ったことなく
でもそろそろクロスプラットフォーム開発とかもしてみたいなー、と。

というわけで、この記事では
いろいろ知りたいこと（以下）を、ググりつつ情報をまとめていくための記事です。

- **UWP**はユニバーサルらしいけど、**WPF**と何が違うの？
- **Uno Platform**や、[COCOAで話題のXamarin](https://it.srad.jp/story/21/02/15/1636231/)の違いは何なのか？

**※注意：はじめに　に対する結論があるとはかぎりません**

## WinForm, WPF, UWPの違い

マイクロソフト公式サイトに比較表があった。

[プラットフォームの比較:UWP、WPF、Windows フォーム](https://docs.microsoft.com/ja-jp/windows/apps/desktop/choose-your-platform#platform-comparison-uwp-wpf-and-windows-forms)

表を見てもよく分からない。
勝手なイメージは・・・↓
**WinFormn** ||||||||すごい隔たり|||||||||　**WPF** || **UWP**

とくに**WPF**と**UWP**の違いが分からない。

- **UWP**は*C++/WinRT*、 *C++/CX*
- **WPF**は*C++/CLI (C++マネージド拡張）*

[C++/CLI, C++/CX, WRL, C++/WinRT違いメモ](https://qiita.com/hidetaka0/items/cb84f12914c1f3679d5d)
↑記事では、C++/CLIは[グルー言語](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AB%E3%83%BC%E8%A8%80%E8%AA%9E)として使えると書いてある。
確かにC++ネイティブをC#から呼ぶときに、ラッパーとして使ったことがある。
そのとき参考にしたサイト↓
[C#から、C++の関数の実行（クラス）](https://waku-take-a.github.io/%25EF%25BC%258804%25EF%25BC%2589C%2523%25E3%2581%258B%25E3%2582%2589%25E3%2580%2581C%252B%252B%25E3%2581%25AE%25E9%2596%25A2%25E6%2595%25B0%25E3%2581%25AE%25E5%25AE%259F%25E8%25A1%258C%25EF%25BC%2588%25E3%2582%25AF%25E3%2583%25A9%25E3%2582%25B9%25EF%25BC%2589.html)

### WinFormからWPF/UWPへの移行は大変？

たやすくはない。しかし得るものも多い。
よく見るのは、XAMLの学習コストが高いからWinFormのままにしておけという引き止め意見。

UWPは"Xbox、HoloLens、IoT、または Surface Hub のサポート"らしいけど、そんなに手広くやるつもりもない。

[OpenCV](https://opencv.org/)なんかは、[OpenCvSharp](https://github.com/shimat/opencvsharp)に比べて参考サイトが多いから
画像処理をC++で書いてC#から使うときは、WPFのほうが障壁が少なそうなイメージ。

あと綺麗な画面が比較的つくりやすい。
[すでにあるWPFアプリをマテリアルデザインにする]( https://qiita.com/shuhey/items/a360d822686033667b2a)

## クロスプラットフォーム開発について

### C-SHARP

C#だったら**Xamarin**(Xamarin.Forms?)、**Uno Platform**、あと新しい**MAUI**

[Xamarin とは](https://docs.microsoft.com/ja-jp/xamarin/get-started/what-is-xamarin)

> Xamarin は、.NET を使用して、iOS、Android、Windows 向けの最新で高性能なアプリケーションをビルドするためのオープンソースのプラットフォームです。

[What is the Uno Platform?](https://platform.uno/docs/articles/intro.html#what-is-the-uno-platform)
> Unoプラットフォームは、UWPベースのコード（C＃およびXAML）をiOS、Android、および**WebAssembly**で実行できるようにするユニバーサルWindowsプラットフォームブリッジです。

[.NET MAUI is:](https://github.com/dotnet/maui#introducing-net-multi-platform-app-ui-maui)
> マルチプラットフォームのネイティブUI
> モバイルとデスクトップ全体の複数のデバイスにデプロイ
> 単一のプロジェクト、単一のコードベースを使用
> **Xamarin.Forms進化**
> .NET 6

つまり・・・
**Xamarin.Forms**は**MAUI**に進化した。
**WebAssembly**に対応しているのは**Uno Platform**だけ。

**WPF**の参考記事を多数執筆されている[okazuki](https://qiita.com/okazuki)さんによる**Uno Platform**デモ
[C# で湯婆婆を Windows アプリと WebAssembly 対応してみた（無駄に MVVM）](https://qiita.com/okazuki/items/abf0469527c2e67b4840)

### 脱線してC++

Qtがデファクトスタンダードなんですかね。
できることが多すぎる・・・

[What is Qt?](https://wiki.qt.io/About_Qt/)
> Qtは、デスクトップ、組み込み、モバイル向けのクロスプラットフォームのアプリケーション開発フレームワークです。サポートされているプラ​​ットフォームには、Linux、OS X、Windows、VxWorks、QNX、Android、iOS、BlackBerry、SailfishOSなどがあります。

WebAssemblyにも対応
[Qtを使って、デスクトップアプリ開発とWebAssemblyアプリ開発を同時に学ぼう](https://qiita.com/soramimi_jp/items/0cb28436f67bb42690ee)

![qt-wiki00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/eece835a-5da9-dd4c-c822-29478d97f320.png)


### さらに脱線してPython

**Qt** + **Python** = デスクトップアプリケーションを作ることもできる

![qt-creator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/d84eb9bf-b587-97be-da43-34667ac5b591.png)

## 結論

**MAUI**を使います。
Visual Studio 2019での使い方を調べる

以上

## 参考

- [Windows Forms から移行するべきプラットフォームは？](https://qiita.com/kakisoft/items/6cc9b6869010599c5824)
- [MAUI: .NETのマルチプラットフォーム用アプリケーションUI](https://www.infoq.com/jp/news/2020/07/maui-multi-platform-ui-dotnet/)
- [.NET Multi-platform App UI（.NET MAUI）の要点まとめ](https://qiita.com/nskydiving/items/927b39c2983eb1f2d2b3)