◆ バグが多くて放置されてるのは致命的だと思う
◆ Windows Forms 使うのは 昔の IE 使うようなもの
◆ バグ修正してる自作コントロールがいっぱいな人ならともかく新しく始める人が Windows Forms 使う理由はないと言っていいと思う
  ◆ 最近の WPF, Windows 8 ストアアプリ, UPW などは全部 XAML を使ってる
  ◆ Windows Forms は使えないからデザインが大変
  ◆ 凄くシンプルで固定なデザインでもないと Windows Forms の利点がない
◆ HTML, CSS, JavaScript の知識ある人は XAML の難易度がかなり下がる
  ◆ 使ってみると意外と簡単と感じるはず (高度なことをしようとしなければ)

Windows Forms を使ってみたら

少し前に Electron と C# で簡単な何か作って比べてみようかな という思いつきのために Windows Forms と WPF 辺りをかるーくイジってました

Windows Forms は昔からあるもので パワポのようにオブジェクトを好きなところに配置して コードでそれの値を書き換えたり動かしたり消したり追加したりするもので 単純です
直感的に扱えると思います

WPF は新しいもので(といっても 5 年以上は前にできたはず) xaml という XML ベースなもので UI のデザイン部分を作ります
データ駆動?とかいう仕組みで MVVM とかいう考え方つかってたり…… で初心者からすると入りづらいものです


そんなわけで Windows Forms でいっか と Windows Forms を選んだのでした
その後すごく後悔することも知らずに……

問題は

はっきり言って問題点は  バグ  です

機能がない とかは WPF とそこまで変わらないですし 自分で作っていくものだと思います
機能は少なめ 必要な物を自分で作る というスタイルな JavaScript (最近はそうでもない) ユーザからするとそこまで困るものでもないです
むしろ多すぎるくらい

ですが 用意されているのに バグで動かないのは困ります
しかもそれのせいでかなり時間取られて調べてみるとバグ しかも放置されていて改善される余地なし だとイライラがたまりますしやる気をなくします
Windows Forms が悪くて C# 自体は悪くないのに C# 自体の印象が悪くなりました

実際マイクロソフトがここ数年出してるソフトって全部 WPF スタイルの特徴的なデザインのものだと思います
VisualStudio も Office も ICE も Skype? も

それに Windows 8 からあるタッチ向けなストアアプリも XAML と C# で作るようです
正確には WPF ではないらしいですが XAML 使ってる辺り WPF よりだと思います

なにがあると WPF なのかよくわからなくなってきましたが マイクロソフト的にも Windows Forms は終わったもので一応サポートも続けている程度に感じられると思います


ただサポートがあるといっても昔の IE みたいなものと言っていいと思います
最低限のセキュリティ修正はあると思います
ですが 新機能は追加されずやセキュリティに関係ないバグは放置です

調べてみても最近になって 新コントロールができたという情報は見当たらなかったです
それに現実問題として ググると何年も前からバグとして報告が上がっているものが 2016 年にもなって直ってないのがほとんどです
ものによっては報告がもう 10 年くらい前になるものもありました

特殊な使い方をして稀に当たる頻度ならまだいいのですが 今回は簡単によくみるような UI を作ろうとして複数のバグに当たるくらいに普通に問題となるものです


Windows Forms を選ぶことは今 IE の 6 や 7 向けになにか作ろうというのと同じようなものと考えたほうが良いと思います

対策

とはいってもまだ WindowsForms で作る人はいますし 情報が多いのも確かです

私が感じた範囲ではバグのほとんどはコントロールです
さすがにフレームワーク全体に影響あるようなものは修正されているんでしょう

となれば そのコントロールを継承して対処したユーザコントロールを作ればどうにかなります
バグ報告のある海外の掲示版では対策も書いてくれているのが多いので対処できるものが多いです

対処方法が書かれていないものは 原因がわかりそうなら自分でなんとかして 無理そうならそのコントロール使うデザインを諦めます

margin や padding などサイズ関係とリサイズ時の問題が多い気がするので 使い方を変えて回避できそうなものもあります


ググっていても Windows Forms がダメだと言ってる人は多くて自作でコントロール作ってる上級者な人も多いようです
Windows Forms は昔からある分 長く使ってる人は自分でバグ対策してしまっていて その対策済みを使い回すから困ること無く使い続けられるのでしょうね
特に大きい会社なんかは .NET Framework をラップした独自のフレームワークレベルになってそうです

そういうノウハウがある人ならともかく新規にはじめようという人は Windows Forms は基本避けたほうがいいと思います

デザイナ

バグの一つであって バグじゃない仕様でも不便なところがあるデザイナ

これのせいで多くの制限がかかります
かといってコンパイル言語なので HTML みたいにちょっと修正 リロード を繰り返したり Chrome 上で修正してしまって見た目と同時にソースも修正という便利さはないです

その Chrome に当たるのがデザイナなのですが 制限が多くて使わなくて済むなら使わないほうが楽なレベルにやっかいです
継承したとか ジェネリックが入ってたりとかそれくらいで表示できなくなったり コンストラクタに何か書くとエラーが出たりと使っていてストレスがたまる一方です

さらにときどきよくわからないエラーで表示できないときもあったり
そんな時はバグの可能性が高く 開いてるデザイナのタブを閉じてリビルドしてもう一度開いたら直ってることが多いです

デザイナ周りは自分のミスだろうと色々コード見直すより バグじゃないのとググッてみたほうが早いかもしれません


そんなデザイナですが WPF では XAML という XML ベースなもので書くことが多いので デザイナのよくわからない動きに悩まされることも減ります
デザイナ側を操作したらわかりやすい XAML が出力されますし XAML を直接書いて表示だけデザイナで確認するのでもいいです

Windows Forms では デザイナが出力するコードの最中に自分で書いたコードを入れたくても再生成の都合で消えてしまうのでデザイナのコードの中に混ざっていてほしい初期化コードが別のところにあって浮いているという気持ち悪いことも減ります

また XAML をかけたりバグなど扱いづらいのが減っただけでなくて ベクタグラフィックスを扱うソフトのように目のアイコンでオブジェクトを非表示にしたり鍵アイコンでうごかせないようロックしたりという機能を簡単に使えるようになってます
Windows Forms だとなかったと思います
あっても気づいてないくらいのでわかりやすく使いやすいものではないと思います

一応 WPF でもデザイナにバグはあるらしいですが使ってみたところ Windows Forms と比べるとほぼ問題が起きずに使えてます

WPF

デザイン

じゃあ WPF にしようといっても上で書いたように初心者的にはハードルが高く見えます

ですが 意外と楽に使えます
データバインディングとか MVVM とかそういうのは慣れてきてから使えばいいんです
初心者なら Windows Forms と同じようにコントロール並べてそれぞれのオブジェクトをコードから操作すればいいんです

それで特に困らないですし もっと高度なことしたいなと思ったり デザインとロジックわけたいなと思ったりそんな余裕が出てきてからやればいいんです

レイアウト部分を XAML にするだけで自由度が上がりますし 書きやすさも大幅にあっぷです
動的に色々レイアウトを変える Web ページ風なものもお手軽です
なによりバグに悩まされることが減るので精神的負担が減ります


XAML ですが HTML と JavaScript でなにか作ったことがあるなら難しいと思わなくて大丈夫です
HTML と CSS に書くことを XAML にするだけです

div みたいな感じで コントロール名を書いて属性に Width とか Height とか Margin とか Padding とか HorizontalAlignment とか レイアウトに関する情報を書きます
CSS を使わず全部 style タグで書いてる感じがして気持ち悪くもありますが こういうものです

イベントも Click="on_click" という感じで定義します on_click は関数名になります
onclick="fn();" ……
HTML 内に JavaScript 書いてるようで見ていて気分が悪くなりますが 我慢です

これは HTML に似ていますが HTML じゃないんです
タグにイベント時の関数書いてもいいんです

HTML 的に気持ち悪くても やっていることはわかりますよね
パネルとかコンテンツとか もうちょっと複雑なものがありますが 最初はデザイナの方で適当にコントロール配置して XAML を見てこう書けばいいんだー くらいに使ってると自然とわかってくると思います

デザイン的には CSS な感じで考えたのと近いはず
position 付きの要素や flexbox の知識があったほうがわかりやすいかもしれません


CSS がないので このパネルの要素全部に同じスタイル当てないのに全部に繰り返し書かないといけないのって思いますが XML 形式でスタイルを表現するものもあるようです
この辺りは軽く見ただけなので 私もよくわかってません

コード

XAML で書いて設置したコントロールは Windows Forms と同じように this.listView のような感じでプロパティとして存在します
this.label.Content = "らべる";

でラベルのテキストを設定できます

こんな感じで Windows Forms と同じ感じで使えます
ただ プロパティ名や構造は同じ名前でも基本的には違っているので Windows Forms 使っていた人が移行するときに XAML だけ書いて コントロールのオブジェクト名を合わせればそれだけで動くというわけじゃないです

UWP

ただこれから新しくするなら UWP という新しい物がいいのかもしれないです
私も使ったことないです

Windows 10 からの新しいもので 開発にも Windows 10 がいるとか

WPF と同じく XAML を使うようです
また Windows 8 のストアアプリに近いもので ストアからしかインストールできないようですが クロスプラットフォームで使えるようです
モバイルでも Xbox でも動くらしいです

それに対して Windows Forms や WPF はデスクトップ向け Windows だけです

モバイルでもというところなので Windows 8 アプリみたいに デスクトップだとほとんど使わないものなのか WPF みたいにメインなソフトを作るのにも使われるのかがわかりませんが Windows 8 のストアアプリみたいにすぐになかったものにはならないんじゃないかと思います


新しい選択肢が増えるわけですが WPF 以降はどれも XAML が使われてるようですし XAML を使わない Windows Forms は特別な理由がない限り使う必要ないと思います