Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

概要

XAML

基本

Binding

RelativeSource関連

Style

Converter

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

Behavior

Event

ドラッグ & ドロップ

Behaviorを利用した実装

ライブラリ(GongSolutions.WPF.DragDrop)を利用した実装

デザインツールキット

Material Design

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

Metro / Modern UI

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

WindowsAPICodePack

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

参考

パフォーマンス

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

公式ドキュメント

関連ブログ記事

MVVMフレームワーク

MVVM Light Toolkit

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

機能

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

使用感としては小規模なC#プロダクトでは十分かとは思いますが、ある程度大きくなるとViewModelLocaterが肥大化してきて困るかもしれません。その場合はPrismの方に乗り換えたほうが良いかもです。

ドキュメント

日本語ドキュメントはあんまり無いですが、機能も最低限なのであまり困らないかとは思います。

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.

機能

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

ドキュメント

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はとても便利なので使える環境ならぜひ使いましょう。

ドキュメント

解説記事

使用例

テンプレートエンジン

T4 (Text Template Transformation Toolkit)

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

コード生成と T4 テキスト テンプレート

参考

Visual Studio搭載のT4テンプレートエンジンの3通りの活用方法 - seraphyの日記
Visual Studio × T4 × 属性で Entity コード大量生成 - Qiita
[C#][Visual Studio] T4テキストテンプレート 内でJSON.NET(3rd Party製ライブラリ)を利用する - Qiita

ロギング

NLog

NLog

テスト

ChainingAssertion

neuecc/ChainingAssertion: Method Chaining base UnitTesting Extension Methods and Dynamic Private Accessor for MSTest, NUnit, xUnit.net.

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

  • 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした