【C# WPF】WPFを理解したいC#初心者の話【基礎知識編】

C# WPFについて学んでいく過程を備忘録として残して置きたいと思います。

1. そもそもWPF(ダブリューピーエフ)とは?


WPFは「Windows Presentation Foundation」の略で、マイクロソフト社が開発する .NET Framework 3.0以降に含まれるユーザーインターフェースサブシステムのことです。

同じフレームワークを利用する ASP.NET や Windows Formsなどと共通した部分を持っています。

2. WPFの特徴は?


WPFではXAML(Extensible Application Markup Language, ザムル)と呼ばれる、XMLベースのマークアップ言語を用いてアプリケーションの外観や動作をデザインします。

一方、処理部分の実装はC#で記述を行い、UIとそこで利用または表示されるようなデータのバインドを行うことができます。

外観・デザインの部分と処理の部分を分けて開発を行うことができるため、複数人で行うプロジェクト形式の開発における役割分担が行いやすいのも特徴のひとつです。

3. WPFを使うには?


実際にWPFを使ったアプリケーションの開発を行う際には、Visual Studioを利用することが多いです。

3-1. Visual Studioとは?

Visual Studioとは、マイクロソフト社が開発するC#、Visual Basic等に向けられた統合開発環境(IDE)のことです。

Visual Studioには、開発で必要になってくる「コードエディタ」「コンパイラツール」「デバッガ」などの機能が集約されており、統一的な開発を行うことができます。

4. WPFを使うメリットは?


Windows Formsと比較した際に、WPFを使用するメリットの一部を簡単に挙げていきます。

・UIやグラフィックの拡張性、柔軟性

・デザイン部分と処理部分の分離

・利用環境に依らないパフォーマンス


それぞれについて詳しく見ていきます。

4-1. UIやグラフィックの拡張性、柔軟性

従来のWindows FormsのUIは、.NET Framework で提供されるボタンやコンボボックスなどの画面のパーツをそのまま利用することが前提となっています。

カラーやフォント、サイズ等の部分のカスタマイズは可能ではあるものの、より詳細なカスタマイズを行いたい場合はかなり難易度の高い技術が必要になってきます。


一方、WPFではUIを構成するクラスのライブラリが提供されており、このライブラリを使用して画面のコントロールパーツが作られています。

このライブラリを利用することで、WPFで提供されているボタンやコンボボックスなどのカスタマイズがとなっています。また、既定のものとは全く新しいコントロールパーツの開発も可能です。

例えば、動的にUIの拡大・縮小を行ったり、ボタンの形状を好きにカスタマイズできるなど、UIのカスタマイズにおける柔軟性が非常に高くなっています。

4-2. デザイン部分と処理部分の分離

従来のWindows Formsで作成されたアプリケーションでは、画面の操作と処理が深く結びついていました。

例えば、画面に表示されているボタンに対してあらかじめ名前をつけ、その名前と操作を紐づけた処理の記述が必要でした。

そのため、ひとつの操作について変更を行うためには画面と処理の両方を修正する必要がありました。


一方、WPFでは画面側のソースコードと処理側のソースコードを完全に分けての開発が可能になりました。

画面側では画面に特化したプログラミン言語であるXAMLを使い、処理側ではC#を使ってソースコードを記述することができ、さらに画面と処理の間にWindows Formで使用していたような名前が必要ありません。

処理を関数化し、画面側のソースコードから関数名を記述するだけで処理を呼び出すことができます。


また、デザイン部分と処理部分を完全に分離できる構造のため、デザインと処理の開発で役割分担がやりやすくなっているのもメリットのひとつです。

デザイン部分を得意とする開発者とロジックの開発を得意とする開発者で協力して効率的に開発に取り組むことができます

4-3. 利用環境に依らないパフォーマンス

従来のWindows Formsで作成されたアプリケーションでは、PCやタブレットなど画面の解像度が異なる利用環境では画面のレイアウトが崩れてしまう問題が多々発生していました。

WPFで開発を行った場合、こういった問題に柔軟に対応することが可能です。

また、ベクターグラフィックスと呼ばれる画像描画の仕組みを利用することで、各コントロールパーツの拡大・縮小・回転がよりスムーズかつ画質が損なわれないというメリットもあります。

ベクタグラフィックスとは?

ベクタグラフィックスとは、画像を点の座標とそれを結ぶ線などの数値データをもとにして、描画の際には演算によって再現する方式のことです。

描画したグラフィック自体のデータ量は小さくなり、一方で変形処理が自在に行え、拡大・縮小を行っても画質が損なわれません。

その性質上、線や面の輪郭がはっきりした人工的ものやシンプルなデザインの画像に適しており、逆に写真のような複雑な配色と輪郭を持つ図形の描画には適していません。

WPFで開発を行う場合、基本的には輪郭のはっきりしたUIデザインが好まれるため、ベクタグラフィックスの方式が適しているといえます。


また、Direct3Dと呼ばれるグラフィックス描画のAPIとハードウェア・アクセラレーションにより、CPUで行っていた描画処理の一部をGPUで行うことによってCPUへの負担を最小限に抑えることができます。


開発環境では比較的スペックの高いマシンを使用することが多く、プロジェクト方式の開発ではマシンの規格がある程度統一されているため、開発時には発生しなかったが利用環境では発生してしまう問題点をWPFでは未然に防ぎやすく、発生してしまっても対処が柔軟に行えるというメリットがあります。

5. WPFのデメリットは?


Windows Formと比較した際の様々なメリットを挙げましたが、デメリットも簡単に紹介します。

・学習コストが大きい

5-1. 学習コストが大きい

従来のWindows Formでは例えばC#のみでの開発が可能であり、コントロールパーツの配置もドラッグ&ドロップで配置をしてダブルクリックでイベントハンドラを作成、ロジックの記述というシンプルかつ直観的でわかりやすい開発が可能です。

一方、WPFではそういった手法をとることは難しく、開発言語に関しても画面側のXAMLと処理側のC#のふたつを学ぶ必要があります。


また、開発手法に関してもWPFではMVVM(Model-ViewModel-View)でアプリケーションの設計を行うため、MVVMに関するフレームワークの習熟も必要になってきます。

MVVM(Model-ViewModel-View)とは?

MVVM(Model-ViewModel-View)とは、UIが存在するソフトウェアの構造を階層的に整理したモデルのひとつであり、全体を「Model」-「View」-「ViewModel」の3層に分割したものです。

「Model」ではデータの管理や保存、入出力、内部的な処理を担います。

「View」では利用者に対する画面表示や入力。操作の受付を担います。

「ViewModel」では両者の間を仲介して互いの状態変更を通知、反映させる役割を担います。


もちろん、これらのデメリットはWPFに対する慣れや学習の習熟、開発における役割分担を行えばある程度解決できるものであると感じます。

ですが、Windows Formと比較した際にある程度開発が行えるレベルに達するまでの時間はかかってしまうでしょう。

6. まとめ

今回はWPFについての概要や知識をなんとなく知るためのメモとなりました。

実際にWPFを使った開発環境の構築やアプリケーション開発に関しては改めて残していきます。

現状ではVisual Studioの利用を想定して環境構築について調査をしていこうと思います。