C# + WPF(Windows Presentation Foundation) の開発に関わる便利ツール、情報のまとめ
この記事について
WPFでデスクトップアプリケーションを作成する目的として、関連するC#知識とライブラリの情報をまとめた記事になります。本記事の内容はUWP/Xamarin/Unity環境では異なる点が多いため注意してください。
マルチプラットフォーム対応が視野にある場合はWPFではそのままの移植が難しいため、UWP/Xamarin/Unity環境で実現が可能かの検討をすることをおすすめします。(.NET Core環境では現状動作しませんし今後対応される予定もなさそうなため)
C#の基本
文法
C# によるプログラミング入門 | ++C++; // 未確認飛行 C
C#7も含めて網羅されているため、ネット上の情報なら上のサイトが詳しかったです。
LINQ
LINQの拡張メソッド一覧と、ほぼ全部のサンプルを作ってみました。 - 地平線に行く
Modern C# 入門の備忘録 - Linq入門編 - Qiita
[C#][LINQ] nullを除外する - Qiita
例外
Exception クラス (System)
頻繁に使用する例外の一覧 - プログラマーな日々
WPF
概要
- Windows Presentation Foundation | Microsoft Docs
- むずかしくないWPF - Qiita
- WPF 4.6 での修正点、透明な子ウィンドウや High DPI 改善について | grabacr.nét
XAML
基本
Binding
RelativeSource関連
- WPFのRelativeSourceのはなし - HIDARI日記(右)
- [WPF][MVVM] TreeViewItemの右クリックメニューからViewModelのCommandを実行する - Qiita
Style
- wpf - XAMLのStyle.Triggersで複合条件を指定したい - スタック・オーバーフロー
- 【WPF】Visibilityってご存じですよね? | 創造的プログラミングと粘土細工
- [WPF][XAML] デザインモード時のみ有効な背景色を設定する - Qiita
- WPF DataGridを使ってみた - Qiita
Converter
MVVMフレームワークでViewModelを実装する場合は責務的に微妙ですが、Converterという機能もあります。
- (XAML#15)「バインディングと値コンバーター」:IT's my business:オルタナティブ・ブログ
- WPFのデータ変換 - Qiita
- Nine Works WPFのStringFormatによるフォーマット指定
- WPF DataConverter 用の基底クラス - Qiita
Behavior
Event
ドラッグ & ドロップ
Behaviorを利用した実装
ライブラリ(GongSolutions.WPF.DragDrop)を利用した実装
デザインツールキット
Material Design
Google の Material Design を利用するためのツールキットと、同作者のドラッグ可能コントロールライブラリ。
- ButchersBoy/MaterialDesignInXamlToolkit: Google's Material Design in XAML & WPF, for C# & VB.Net.
- ButchersBoy/Dragablz: Dragable and tearable tab control for WPF
Metro / Modern UI
マイクロソフトの Modern UI を利用するためのツールキット。
MetroWindowが使いやすいため、部分的に上記のマテリアルデザインと組み合わせて利用されることもあるようです。
WindowsAPICodePack
ディレクトリ選択用ダイアログなどを拡張する。
参考
パフォーマンス
WPFのデータバインディングは便利ですが、速度が要求される部分になるとチューニングが必要になります。
特にItemControlなどで大量にオブジェクトを再描画したりなどで劇的に遅くなったりします。
WPFではUIの仮想化が一部の標準のコントロール(WrapPanel,Canvas等)だとできないので注意が必要です。
公式ドキュメント
関連ブログ記事
- WPFパフォーマンス関連の記事まとめ - Qiita
- WPFでコレクションの表示を高速化するオプションとか - ゆうなんとかさんの雑記帳的な。
- WPFパフォーマンスの調整について - 開発備忘録
- 速いXAMLの書き方と設計の話 - Qiita
MVVMフレームワーク
MVVM Light Toolkit
ViewModelLocaterとMessanger機能が使いたい人向けMVVMフレームワーク。
今だとReactivePropertyと組み合わせて使うのをおすすめします。
- 本家サイト:MVVM Light Toolkit
- GitHub:lbugnion/mvvmlight
機能
- ViewModelLocaterを利用した View <=> ViewModel の紐付け (Prismと違って自動紐付け機能はない簡易版)
- Messanger 機能のサポート (ViewModelBaseを継承したオブジェクト同士のみ)
- RelayCommandによるコマンド実装補助(これはReactiveProperyのReactiveCommandのほうがよい)
使用感としては小規模なC#プロダクトでは十分かとは思いますが、ある程度大きくなるとViewModelLocaterが肥大化してきて困るかもしれません。その場合はPrismの方に乗り換えたほうが良いかもです。
ドキュメント
日本語ドキュメントはあんまり無いですが、機能も最低限なのであまり困らないかとは思います。
- MVVMパターンのシンプルなサンプル(MVVM Light + ReactiveProperty) 言語: C#, XAML Visual Studio 2013 用
- 結局最後は「MVVM + Messenger + Behavior パターン」に行き着いた - present
Prism
マイクロソフトの中の人が作ってるMVVMフレームワーク。
機能
- 名前付けルールによる View <=> ViewModel の自動紐付け
- DIコンテナとの連携 (Unity等)
ドキュメント
- Developer's Guide to Microsoft Prism Library 5.0 for WPF
- Prismドキュメント
- 「Developer's Guide to Prism Library 5.0 for WPF」の和訳
Reactive UI
todo: 調査中
reactiveui/ReactiveUI
Rx
Reactive Extention
ReactiveX
Reactive-Extensions/Rx.NET: The Reactive Extensions for .NET
解説記事
Reactive Extensionsのはじめかた - かずきのBlog@hatena
今更ですがRx再入門の記事をPDF化したやつをSlideShareに入れました - かずきのBlog@hatena
Reactive Property
WPFのViewModelを記述する際にReactivePropertyはとても便利なので使える環境ならぜひ使いましょう。
ドキュメント
解説記事
- ReactiveProperty オーバービュー - かずきのBlog@hatena
- MVVMとリアクティブプログラミングを支援するライブラリ「ReactiveProperty v2.0」オーバービュー - かずきのBlog@hatena
- ReactiveProperty v2.7.4をリリースしました - かずきのBlog@hatena
- ReactiveProperty v2.9.0とv3.0.0-pre5をリリースしました。 - かずきのBlog@hatena
- ReactivePropertyのコードスニペット - かずきのBlog@hatena
- ReactivePropertyの後始末 - かずきのBlog@hatena
- neue cc - ReactiveProperty ver 0.3.0.0 - MとVMのバインディングという捉え方
- 【C#】ReactiveProperty全然分からねぇ!って人向けのFAQ集【修正済】 - Qiita
使用例
- INotifyPropertyChangedなViewModelをReactivePropertyに移行するとどう変わるか - ぴーさんログ
- AsyncReactiveCommandでWPFのお手軽ダブルクリック抑制 - Qiita
テンプレートエンジン
T4 (Text Template Transformation Toolkit)
C#でテンプレートからテキスト生成が可能な機能。文法としてはJavaのJSPに似ている?
VisualStudioと標準で統合されており、ビルド前に任意のC#のコードを生成したりとメタプログラミング的な利用も可能。
参考
Visual Studio搭載のT4テンプレートエンジンの3通りの活用方法 - seraphyの日記
Visual Studio × T4 × 属性で Entity コード大量生成 - Qiita
[C#][Visual Studio] T4テキストテンプレート 内でJSON.NET(3rd Party製ライブラリ)を利用する - Qiita
ロギング
NLog
テスト
ChainingAssertion
テスト時にいろいろと便利な拡張メソッドを定義してくれるパッケージ。
- MSTest, NUnit, MbUnit, xUnitに対応。
- 一般的な
Assert.AreEqual(A, B)
などの代わりに、A.Is(B)
などのアサートを追加することが出来る。 - MSTestでxUnitのようにParameterized Testを実行できる拡張を提供
概要
neue cc - テストを簡単にするほんの少しの拡張メソッド
neue cc - Chaining Assertion for MSTest
使用時の注意点
Parameterized Test, TestCaseSource使用時には public TestContext TestContext { get; set; }
の定義が必須になります。
(こちらを定義しないとTextContext.Run()が存在しないというエラーで散々悩む羽目に・・・)
https://github.com/neuecc/ChainingAssertion#parameterized-test-for-mstest
[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 - 亀岡的プログラマ日記
テストカバレッジ
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
NuGet Gallery | OpenCover - an open source code coverage tool for .NET 4.6.519
※注意:Nugetでリリースされているものはv4.6.519 時点ではVS2017(C#7.0)に未対応。対応版を現在開発中の様子
使用例記事
AppVeyorとCodecovを使ってC#のコードカバレッジを計測する - YoshinoriN's Memento
dotCover
こちらは有料のプラグインになりますが、EnterpriseのVisual Studioを買うよりは安いので検討してもいいかもしれないです。
dotCover: A Code Coverage Tool for .NET by JetBrains
CI サービス
Appveyor
Windowsの.NET環境のビルドができるCIサービス。VS2017にもすでに対応済みです。
publicなオープンソースプロジェクトなら無料で使用できます。
Continuous Integration and Deployment service for Windows developers | AppVeyor
TODO: 使用方法をまとめるか、いい記事があればリンクする。
その他
ReSharper
こちらは有料のプラグインになりますが、WPF(XAML) の編集も含めてだいぶIDEが賢くなるためおすすめです。
企業向けライセンスと、個人向けライセンスの2つがあります。個人向けライセンスでは US$129/year 程度です。
(その他のIDEも一緒に含んだ All Products Pack で買ったほうがお買い得かもしれないです。)
ReSharper for Visual Studio: JetBrains Toolbox subscription