チュートリアル: WPF アプリの現代化

アプリを最初から書き換えるのではなく、最新の Windows 機能を既存のソース コードに統合することで、既存のデスクトップ アプリを最新化する方法は多数あります。 このチュートリアルでは、これらの機能を使用して、既存の WPF 基幹業務アプリを最新化するためのいくつかの方法について説明します。

  • .NET Core 3
  • XAML Islands を使用する UWP XAML コントロール
  • アダプティブ カードと Windows の通知
  • MSIX の展開

このチュートリアルでは、以下の開発スキルが必要です。

  • WPF を使用した Windows デスクトップ アプリの開発経験。
  • C# と XAML の基本的な知識。
  • UWP の基本的な知識。

概要

このチュートリアルでは、Contoso Expenses という名前のシンプルな WPF 基幹業務アプリ用のコードを提供します。 このチュートリアルの架空のシナリオでは、Contoso Expenses は、レポートで送信される経費を追跡するために Contoso Corporation のマネージャーによって使用される内部アプリです。 現在、マネージャーはタッチ対応デバイスを備えており、マウスやキーボードを使用せずに Contoso Expenses アプリを使用したいと考えています。 残念ながら、現在のバージョンのアプリはタッチ対応ではありません。

Contoso では、従業員が経費レポートをより効率的に作成できるように、新しい Windows 機能でこのアプリを最新化したいと考えています。 機能の多くは、新しい UWP アプリをビルドすることで簡単に実装できます。 しかし、既存のアプリは複雑であり、これは長期にわたるさまざまなチームによる開発の結果です。 そのため、新しいテクノロジを使用して最初から書き換えることはできません。 チームは、既存のコードベースに新機能を追加するための最適な方法を探しています。

このチュートリアルの最初に、Contoso Expenses では .NET Framework 4.7.2 をターゲットとし、次のサードパーティ製ライブラリが使用されます。

  • MVVM Light。MVVM パターンの基本実装。
  • Unity。依存関係の注入コンテナー。
  • LiteDb。データを格納するための埋め込みの NoSQL ソリューション。
  • Bogus。仮のデータを生成するためのツール。

このチュートリアルでは、次のようにして、新しい Windows 機能で Contoso Expenses を強化します。

  • 既存の WPF アプリを .NET Core 3.0 に移行する。 これにより、今後、新しい重要なシナリオが開かれます。
  • XAML Islands を使用して、Windows Community Toolkit で提供される、ラップされたコントロールの InkCanvasMapControl をホストする。
  • XAML Islands を使用して、標準の UWP XAML コントロール (この場合は、CalendarView) をホストする。
  • アダプティブ カードと Windows の通知をアプリに統合する。
  • アプリを MSIX でパッケージ化し、Azure DevOps に CI/CD パイプラインを設定して、使用可能になったらすぐに新しいバージョンのアプリをテスト担当者とユーザーに自動的に配信できるようにする。

前提条件

このチュートリアルを実行するには、開発用コンピューターにこれらの前提条件がインストールされている必要があります。

  • Windows 10 バージョン 1903 (ビルド 18362) 以降のバージョン。
  • Visual Studio 2019
  • .NET Core 3 SDK (最新バージョンをインストールする)。

必ず、Visual Studio 2019 とともに以下のワークロードとオプション機能をインストールしてください。

  • .NET デスクトップ開発
  • ユニバーサル Windows プラットフォーム開発
  • Windows SDK (10.0.18362.0 以降)

Contoso Expenses のサンプル アプリを取得する

チュートリアルを開始する前に、Contoso Expenses アプリのソース コードをダウンロードし、Visual Studio でコードをビルドできることを確認します。

  1. AppConsult WinAppsModernization ワークショップ リポジトリ[Releases]\(リリース\) タブから、アプリのソース コードをダウンロードします。 直接リンクは https://github.com/microsoft/AppConsult-WinAppsModernizationWorkshop/releases です。
  2. zip ファイルを開き、すべてのコンテンツを C: ドライブのルートに抽出します。 C:\WinAppsModernizationWorkshop という名前のフォルダーが作成されます。
  3. Visual Studio 2019 を開き、C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses\ContosoExpenses.sln ファイルをダブルクリックしてソリューションを開きます。
  4. [Start]\(開始\) ボタンまたは CTRL + F5 キーを押して、Contoso Expenses の WPF プロジェクトをビルド、実行、およびデバッグできることを確認します。

はじめに

Contoso Expenses サンプル アプリ用のソース コードを取得し、それを Visual Studio でビルドできることが確認できたら、チュートリアルを開始する準備はできています。

重要な概念

以下のセクションでは、このチュートリアルで説明するいくつかの主な概念の背景を示します。 これらの概念について既によく理解している場合は、このセクションを省略してかまいません。

ユニバーサル Windows プラットフォーム (UWP)

Microsoft では、Windows 8 で Windows ランタイム (WinRT) の一部として設定された新しい API を導入しました。 .NET Framework とは異なり、WinRT は、アプリに直接公開される API のネイティブ レイヤーです。 また、WinRT では、ランタイムの上に追加されたレイヤーである言語プロジェクションが導入されており、開発者は C# に加え、C# や JavaScript などの言語を使ってやり取りすることができます。 プロジェクションを使えば、開発者は .NET Framework でのアプリのビルドで得られたのと同じ C# と XAML の知識を活用するアプリを WinRT の上にビルドすることができます。

Microsoft では、WinRT の上にビルドされた ユニバーサル Windows プラットフォーム (UWP) を Windows 10 で導入しました。 UWP の最も重要な機能は、すべてのデバイス プラットフォームで共通の API セットを提供することです。アプリがデスクトップ、Xbox One、HoloLens のいずれで実行されているかに関係なく、同じ API を使用できます。

今後は、Windows の新機能のほとんどが、タイムライン、Project Rome、Windows Hello などの機能を含め、WinRT API を介して公開されます。

MSIX パッケージ作成ツール

MSIX は、Windows アプリ用の最新のパッケージング モデルです。 MSIX では UWP アプリだけでなく、Win32、WPF、Windows フォーム、Java、Electron などのテクノロジを使用するデスクトップ アプリのビルドもサポートされます。 MSIX パッケージでデスクトップ アプリをパッケージ化する場合、アプリを Microsoft Store に公開できます。 デスクトップ アプリでは、インストール時にパッケージ ID が取得されます。これにより、デスクトップ アプリでより広範な WinRT API を使用できるようになります。

詳細については、これらの記事を参照してください。

XAML Islands

Windows 10 バージョン 1903 以降では、XAML Islands という機能を使用して、UWP 以外のデスクトップ アプリで UWP コントロールをホストすることができます。 この機能を使用すると、既存のデスクトップ アプリの外観、操作性、および機能を、UWP コントロールでのみ使用できる最新の Windows UI 機能で強化することができます。 つまり、既存の WPF、Windows フォーム、C++ Win32 アプリで Fluent Design System をサポートする、Windows Ink やコントロールなどの UWP 機能を使用できます。

詳細については、デスクトップ アプリケーションの UWP コントロール (XAML Islands) に関するページを参照してください。 このチュートリアルでは、異なる 2 種類の XAML Island コントロールを使用するプロセスについて説明します。

  • Windows Community Toolkit のInkCanvasMapControl。 これらの WPF コントロールでは、対応する UWP コントロールのインターフェイスと機能をラップし、Visual Studio デザイナーの他の WPF コントロールと同様に使用できます。

  • UWP の カレンダー ビュー コントロール。 これは、Windows Community Toolkit の WindowsXamlHost コントロールを使用してホストする、標準 UWP コントロールです。

.NET Core 3

.NET Core は、完全な .NET Framework のクロスプラットフォームで軽量かつ容易に拡張可能なバージョンを実装するオープンソース フレームワークです。 完全な .NET Framework と比べ、.NET Core の起動時間は大幅に短縮されており、API の多くが最適化されています。

その最初のいくつかのリリースでは、.NET Core の焦点は、Web またはバックエンド アプリをサポートすることにありました。 .NET Core を使用すれば、Windows、Linux、または Docker コンテナーのようなマイクロサービス アーキテクチャでホストできる、スケーラブルな Web アプリまたは API を簡単にビルドできます。

.NET Core 3 は、.NET Core の最新リリースです。 このリリースのハイライトは、Windows フォーム、WPF アプリを含む Windows デスクトップ アプリのサポートです。 .NET Core 3 で新規および既存の Windows デスクトップ アプリを実行し、.NET Core で提供されるすべての特典を利用することができます。 XAML Islandsでホストされている UWP コントロールを、.NET Core 3 を対象とする Windows フォームや WPF アプリでも使用できます。

注意

WPF と Windows フォームがクロスプラットフォームになっていないため、Linux および MacOS で WPF や Windows フォームを実行することはできません。 WPF と Windows フォームの UI コンポーネントは、引き続き Windows レンダリング システムに依存しています。

詳細については、「.NET Core 3.0 の新機能」をご覧ください。