[C#][.NET][WPF] WPFと関連知識まとめ

C# + WPF(Windows Presentation Foundation) の開発に関わる便利ツール、情報のまとめ

# この記事について
WPFでデスクトップアプリケーションを作成する目的として、関連するC#知識とライブラリの情報をまとめた記事になります。本記事の内容はUWP/Xamarin/Unity環境では異なる点が多いため注意してください。

マルチプラットフォーム対応が視野にある場合はWPFではそのままの移植が難しいため、UWP/Xamarin/Unity環境で実現が可能かの検討をすることをおすすめします。(.NET Core環境では現状動作しませんし今後対応される予定もなさそうなため)

# C#の基本
## 文法
[C# によるプログラミング入門 | ++C++; // 未確認飛行 C](http://ufcpp.net/study/csharp/)

C#7も含めて網羅されているため、ネット上の情報なら上のサイトが詳しかったです。

## LINQ
[LINQの拡張メソッド一覧と、ほぼ全部のサンプルを作ってみました。 - 地平線に行く](http://d.hatena.ne.jp/chiheisen/20111031/1320068429)
[Modern C# 入門の備忘録 - Linq入門編 - Qiita](http://qiita.com/acple@github/items/e77bc70d8eeeec3939f8)
[[C#][LINQ] nullを除外する - Qiita](http://qiita.com/koara-local/items/b811f780a06a7c575f71)

## 例外
[Exception クラス (System)](https://msdn.microsoft.com/ja-jp/library/system.exception(v=vs.110).aspx#Standard)
[頻繁に使用する例外の一覧 - プログラマーな日々](http://blog.jhashimoto.net/entry/20120302/1330686239)

# WPF
## 概要
+ [Windows Presentation Foundation | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/index)
+ [むずかしくないWPF - Qiita](http://qiita.com/karno/items/f30f661b40d9adec6a6d)
+ [WPF 4.6 での修正点、透明な子ウィンドウや High DPI 改善について | grabacr.nét](http://grabacr.net/archives/5341)

## XAML
### 基本
+ [WPF4.5入門 その62「まとめ」 - かずきのBlog@hatena](http://blog.okazuki.jp/entry/2014/12/27/200015)
+ [連載：Windowsストア・アプリ開発入門：第3回　画面は「XAML」で作る（前編） (1/5) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1310/03/news078.html)

### Binding
+ [[WPF] XAMLでの文字列のフォーマット指定とバインディング - Qiita](http://qiita.com/koara-local/items/815eb5146b3ddc48a8c3)

### RelativeSource関連
+ [WPFのRelativeSourceのはなし - HIDARI日記（右）](http://hidari-lab.hatenablog.com/entry/wpf_relativesource_self_and_findancestor)
+ [[WPF][MVVM] TreeViewItemの右クリックメニューからViewModelのCommandを実行する - Qiita](http://qiita.com/koara-local/items/9e5f9cbcf4a937c1d34d)

### Style
+ [wpf - XAMLのStyle.Triggersで複合条件を指定したい - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/7653/xaml%E3%81%AEstyle-triggers%E3%81%A7%E8%A4%87%E5%90%88%E6%9D%A1%E4%BB%B6%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%84)
+ [【WPF】Visibilityってご存じですよね？ | 創造的プログラミングと粘土細工](http://pro.art55.jp/?eid=969079)
+ [[WPF][XAML] デザインモード時のみ有効な背景色を設定する - Qiita](http://qiita.com/koara-local/items/9ae4b1f63b248c1c5e83)
+ [WPF DataGridを使ってみた - Qiita](https://qiita.com/kuro4/items/6be2e1e95db4714c8d7a)

### Converter
MVVMフレームワークでViewModelを実装する場合は責務的に微妙ですが、Converterという機能もあります。

+ [（XAML#15）「バインディングと値コンバーター」：IT's my business：オルタナティブ・ブログ](http://blogs.itmedia.co.jp/mohno/2013/12/xaml15-c9fe.html)
+ [WPFのデータ変換 - Qiita](http://qiita.com/paralleltree/items/449a96debdade0adb377)
+ [Nine Works　WPFのStringFormatによるフォーマット指定](http://nineworks2.blog.fc2.com/blog-entry-10.html)
+ [WPF DataConverter 用の基底クラス - Qiita](http://qiita.com/hugo-sb/items/a3ad07f2314688b4467f)

### Behavior
+ [プログラミングな日々: WPFのScrollViewerやScrollBarのスクロール位置を同期させる](https://days-of-programming.blogspot.jp/2015/01/wpfscrollviewerscrollbar.html)

### Event
+ [WPF Windowが最初に表示されたときに処理を行いたい - Qiita](https://qiita.com/tricogimmick/items/79e85baa1e99eec840d8)

### ドラッグ & ドロップ
#### Behaviorを利用した実装
+ [WPFのドラッグ＆ドロップ実装 - Qiita](https://qiita.com/takanemu/items/d459677b8ddee91172f5)

#### ライブラリ(GongSolutions.WPF.DragDrop)を利用した実装
+ [[WPF]エクスプローラーからD&Dされたファイルパスを取得する - Qiita](https://qiita.com/shiroma77_/items/0b8c97307ee52c67d0d2)

## デザインツールキット
### Material Design
Google の Material Design を利用するためのツールキットと、同作者のドラッグ可能コントロールライブラリ。

+ [ButchersBoy/MaterialDesignInXamlToolkit: Google's Material Design in XAML & WPF, for C# & VB.Net.](https://github.com/ButchersBoy/MaterialDesignInXamlToolkit)
+ [ButchersBoy/Dragablz: Dragable and tearable tab control for WPF](https://github.com/ButchersBoy/Dragablz)

### Metro / Modern UI
マイクロソフトの Modern UI を利用するためのツールキット。
MetroWindowが使いやすいため、部分的に上記のマテリアルデザインと組み合わせて利用されることもあるようです。

+ [MahApps/MahApps.Metro: A toolkit for creating Metro / Modern UI styled WPF apps.](https://github.com/MahApps/MahApps.Metro)

### WindowsAPICodePack
ディレクトリ選択用ダイアログなどを拡張する。

#### 参考

+ [WPF でファイル、フォルダーを選択するダイアログボックスを表示する [C#] | JOHOBASE](https://johobase.com/wpf-file-folder-common-dialog/)
+ [夕暮ログ Windows7とC#でコモンダイアログを簡単に拡張する](http://tinqwill.blog59.fc2.com/blog-entry-86.html)

## パフォーマンス
WPFのデータバインディングは便利ですが、速度が要求される部分になるとチューニングが必要になります。
特にItemControlなどで大量にオブジェクトを再描画したりなどで劇的に遅くなったりします。
WPFではUIの仮想化が一部の標準のコントロール(WrapPanel,Canvas等)だとできないので注意が必要です。

### 公式ドキュメント
+ [WPF アプリケーションのパフォーマンスの最適化](https://msdn.microsoft.com/ja-jp/library/aa970683(v=vs.110).aspx)

### 関連ブログ記事
+ [WPFパフォーマンス関連の記事まとめ - Qiita](http://qiita.com/Koki_jp/items/f6ef5bbb2da9be44744c)
+ [WPFでコレクションの表示を高速化するオプションとか - ゆうなんとかさんの雑記帳的な。](http://yuuxxxx.hatenablog.com/entry/2014/02/01/232320)
+ [WPFパフォーマンスの調整について - 開発備忘録](http://iyemon018.hatenablog.com/entry/2016/03/04/145708)
+ [速いXAMLの書き方と設計の話 - Qiita](https://qiita.com/proprogrammer0/items/22a8c6ee13f940f13623)

# MVVMフレームワーク
## MVVM Light Toolkit
ViewModelLocaterとMessanger機能が使いたい人向けMVVMフレームワーク。
今だとReactivePropertyと組み合わせて使うのをおすすめします。

+ 本家サイト：[MVVM Light Toolkit](http://www.mvvmlight.net/)
+ GitHub：[lbugnion/mvvmlight](https://github.com/lbugnion/mvvmlight)

### 機能
+ ViewModelLocaterを利用した View <=> ViewModel の紐付け (Prismと違って自動紐付け機能はない簡易版)
+ Messanger 機能のサポート (ViewModelBaseを継承したオブジェクト同士のみ)
+ RelayCommandによるコマンド実装補助（これはReactiveProperyのReactiveCommandのほうがよい）

使用感としては小規模なC#プロダクトでは十分かとは思いますが、ある程度大きくなるとViewModelLocaterが肥大化してきて困るかもしれません。その場合はPrismの方に乗り換えたほうが良いかもです。
### ドキュメント
日本語ドキュメントはあんまり無いですが、機能も最低限なのであまり困らないかとは思います。

+ [MVVMパターンのシンプルなサンプル（MVVM Light + ReactiveProperty) 言語: C#, XAML Visual Studio 2013 用](https://code.msdn.microsoft.com/windowsdesktop/MVVMMVVM-Light-ReactiveProp-e998b7b1)
+ [結局最後は「MVVM + Messenger + Behavior パターン」に行き着いた - present](http://tnakamura.hatenablog.com/entry/20110221/mvvm_messenger_behavior)

## Prism
マイクロソフトの中の人が作ってるMVVMフレームワーク。

[PrismLibrary/Prism: Prism is a framework for building loosely coupled, maintainable, and testable XAML applications in WPF, Windows 10 UWP, and Xamarin Forms.](https://github.com/PrismLibrary/Prism)

### 機能

+ 名前付けルールによる View <=> ViewModel の自動紐付け
+ DIコンテナとの連携 (Unity等)

### ドキュメント

+ [Developer's Guide to Microsoft Prism Library 5.0 for WPF](https://msdn.microsoft.com/ja-jp/library/gg406140.aspx)
+ [Prismドキュメント](http://vdlz.xyz/Csharp/ToolKit/MVVM/Prism/Doc/Prism_doc.html)
+ [「Developer's Guide to Prism Library 5.0 for WPF」の和訳](http://vdlz.xyz/Csharp/ToolKit/MVVM/Prism/Doc/DG50/DG50_index.html)

## Reactive UI
todo: 調査中
[reactiveui/ReactiveUI](https://github.com/reactiveui/ReactiveUI)

# Rx
## Reactive Extention
[ReactiveX](http://reactivex.io/)
[Reactive-Extensions/Rx.NET: The Reactive Extensions for .NET](https://github.com/Reactive-Extensions/Rx.NET)

### 解説記事
[Reactive Extensionsのはじめかた - かずきのBlog@hatena](http://blog.okazuki.jp/entry/2015/03/23/203825)
[今更ですがRx再入門の記事をPDF化したやつをSlideShareに入れました - かずきのBlog@hatena](http://blog.okazuki.jp/entry/20121024/Rx_Slide)

## Reactive Property
WPFのViewModelを記述する際にReactivePropertyはとても便利なので使える環境ならぜひ使いましょう。

+ [runceel/ReactiveProperty](https://github.com/runceel/ReactiveProperty)
+ [NuGet Gallery | ReactiveProperty 3.6.0](https://www.nuget.org/packages/ReactiveProperty/3.6.0)

### ドキュメント

+ [Home - ReactiveProperty documentation](https://runceel.github.io/ReactiveProperty/)

### 解説記事
+ [ReactiveProperty オーバービュー - かずきのBlog@hatena](http://blog.okazuki.jp/entry/2014/05/07/014133)
+ [MVVMとリアクティブプログラミングを支援するライブラリ「ReactiveProperty v2.0」オーバービュー - かずきのBlog@hatena](http://blog.okazuki.jp/entry/2015/02/22/212827)
+ [ReactiveProperty v2.7.4をリリースしました - かずきのBlog@hatena](http://blog.okazuki.jp/entry/2016/06/24/222331)
+ [ReactiveProperty v2.9.0とv3.0.0-pre5をリリースしました。 - かずきのBlog@hatena](http://blog.okazuki.jp/entry/2016/07/20/182102)
+ [ReactivePropertyのコードスニペット - かずきのBlog@hatena](http://blog.okazuki.jp/entry/2016/05/12/210745)
+ [ReactivePropertyの後始末 - かずきのBlog@hatena](http://blog.okazuki.jp/entry/2016/04/30/073755)
+ [neue cc - ReactiveProperty ver 0.3.0.0 - MとVMのバインディングという捉え方](http://neue.cc/2011/11/20_354.html)
+ [【C#】ReactiveProperty全然分からねぇ！って人向けのFAQ集【修正済】 - Qiita](https://qiita.com/YSRKEN/items/5a36fb8071104a989fb8)

### 使用例
+ [INotifyPropertyChangedなViewModelをReactivePropertyに移行するとどう変わるか - ぴーさんログ](http://ticktack.hatenablog.jp/entry/2015/12/07/193806)
+ [AsyncReactiveCommandでWPFのお手軽ダブルクリック抑制 - Qiita](https://qiita.com/soi/items/eca0601ad0fc4e401623)

# テンプレートエンジン
## T4 (Text Template Transformation Toolkit)
C#でテンプレートからテキスト生成が可能な機能。文法としてはJavaのJSPに似ている？
VisualStudioと標準で統合されており、ビルド前に任意のC#のコードを生成したりとメタプログラミング的な利用も可能。

[コード生成と T4 テキスト テンプレート](https://msdn.microsoft.com/ja-jp/library/bb126445(v=vs.140).aspx)

### 参考
[Visual Studio搭載のT4テンプレートエンジンの3通りの活用方法 - seraphyの日記](http://d.hatena.ne.jp/seraphy/20140419)
[Visual Studio × T4 × 属性で Entity コード大量生成 - Qiita](http://qiita.com/matatabi_ux/items/f02b2dd6bbb92d39553f)
[[C#][Visual Studio] T4テキストテンプレート 内でJSON.NET(3rd Party製ライブラリ)を利用する - Qiita](http://qiita.com/koara-local/items/ec78e35a2c725d877cd3)

# ロギング
## NLog
[NLog](http://nlog-project.org/)

# テスト
## ChainingAssertion
[neuecc/ChainingAssertion: Method Chaining base UnitTesting Extension Methods and Dynamic Private Accessor for MSTest, NUnit, xUnit.net.](https://github.com/neuecc/ChainingAssertion)

テスト時にいろいろと便利な拡張メソッドを定義してくれるパッケージ。

+ MSTest, NUnit, MbUnit, xUnitに対応。
+ 一般的な `Assert.AreEqual(A, B)` などの代わりに、`A.Is(B)` などのアサートを追加することが出来る。
+ MSTestでxUnitのようにParameterized Testを実行できる拡張を提供

### 概要
[neue cc - テストを簡単にするほんの少しの拡張メソッド](http://neue.cc/2010/08/02_270.html)
[neue cc - Chaining Assertion for MSTest](http://neue.cc/2011/02/23_304.html)

### 使用時の注意点
Parameterized Test, TestCaseSource使用時には `public TestContext TestContext { get; set; }` の定義が必須になります。
（こちらを定義しないとTextContext.Run()が存在しないというエラーで散々悩む羽目に・・・）
https://github.com/neuecc/ChainingAssertion#parameterized-test-for-mstest

```csharp
[TestClass]
public class UnitTest
{
    public TestContext TestContext { get; set; } //必須

    [TestMethod]
    [TestCase(1, 2, 3)]
    [TestCase(10, 20, 30)]
    [TestCase(100, 200, 300)]
    public void TestMethod2()
    {
        TestContext.Run((int x, int y, int z) =>
        {
            (x + y).Is(z);
            (x + y + z).Is(i => i < 1000);
        });
    }
}
```

### 参考
[JUnit実践入門 MSTest用パッチ #TddAdventJp - 亀岡的プログラマ日記](http://posaune.hatenablog.com/entry/2012/12/13/085507)

# テストカバレッジ
## OpenCover
[OpenCover/opencover: A code coverage tool for .NET 2 and above (WINDOWS OS only), support for 32 and 64 processes with both branch and sequence points](https://github.com/OpenCover/opencover)
[NuGet Gallery | OpenCover - an open source code coverage tool for .NET 4.6.519](https://www.nuget.org/packages/opencover)
※注意：Nugetでリリースされているものはv4.6.519 時点ではVS2017(C#7.0)に未対応。対応版を現在開発中の様子

### 使用例記事
[AppVeyorとCodecovを使ってC#のコードカバレッジを計測する - YoshinoriN's Memento](https://yoshinorin.net/2016/09/21/appveyor-codecov-csharp/)

## dotCover
こちらは有料のプラグインになりますが、EnterpriseのVisual Studioを買うよりは安いので検討してもいいかもしれないです。
[dotCover: A Code Coverage Tool for .NET by JetBrains](https://www.jetbrains.com/dotcover/)

# CI サービス
## Appveyor
Windowsの.NET環境のビルドができるCIサービス。VS2017にもすでに対応済みです。
publicなオープンソースプロジェクトなら無料で使用できます。

[Continuous Integration and Deployment service for Windows developers | AppVeyor](https://www.appveyor.com/)

TODO: 使用方法をまとめるか、いい記事があればリンクする。

# その他
## ReSharper
こちらは有料のプラグインになりますが、WPF(XAML) の編集も含めてだいぶIDEが賢くなるためおすすめです。
企業向けライセンスと、個人向けライセンスの２つがあります。個人向けライセンスでは US$129/year 程度です。
(その他のIDEも一緒に含んだ All Products Pack で買ったほうがお買い得かもしれないです。)
[ReSharper for Visual Studio: JetBrains Toolbox subscription](https://www.jetbrains.com/resharper/buy/#edition=personal)