読者です 読者をやめる 読者になる 読者になる

tmori3y2のブログ

主にWindowsのプログラムなど

サクッと自家製NuGetを作ってReacitiveCollectionを使用したプロジェクトに機能を追加する

C# MVVM NuGet WPF

良く使用するヘルパークラスやXAMLのスタイルはNuGet Packageにしておくと便利です。

今回は、Viewで使いまわせる以下のヘルパークラスやコンテンツを含むパッケージを作成してみました。

  • Window Close前に編集中のコントロールの強制評価をしてエラーをブロックするためのヘルパークラス
  • Open File Dialogを表示して選択ファイル名をコマンドに渡してファイルの中身をテーブルにインポートできるようにするヘルパークラス
  • プロジェクトにコピーして使うStyleを定義したXAMLファイル

NuGet Packageの作成手順は、きよくら大先生のこちらの記事を参照したら良いと思います。

kiyokura.hateblo.jp

kiyokura.hateblo.jp

しばやん大先生のこちらの記事も参考にさせていただきました。

blog.shibayan.jp

難しいことをしなければ、自家製NuGet Packageを利用する方法は意外と簡単です。

そのため、以下のように割り切って使用することにしました。

フォルダ構成は以下のようにします。

  • プロダクトルート

    • Nuget.config

    • nuget.exe

    • Deploy

      • NuGetPackages
    • packages

    • 自家製 NuGet Packageソリューション

      • 自家製 NuGet Package その1
    • プロジェクトソリューション

      • プロジェクト その1

自家製 NuGet Packageのプロジェクトフォルダでコマンドプロンプトを開き、以下のコマンドを実行します。

> ..\..\nuget.exe spec

(階層が変わった場合は適宜修正願います)

  • 出来たファイルをプロジェクトに追加
  • copyrightを$copyright$に差し替え
  • その他の部分を適当に埋める

f:id:tmori3y2:20160218031618p:plain

AssemblyInfo.csを開き必要な情報を埋めます。

NuGet Packageを作成するときにエラーが出る場合は、出なくなるまで修正します。

細かなバージョン管理をする必要がなければAssemblyFileVersionを削除すると楽です。

ビルドして他のプロジェクトに取り込んだら、次の修正では必ずバージョンを上げるようにします。

今回は、シンボルサーバを使うのは仰々しいし、複数パッケージを用意するのも面倒なので、以下の方針で行きます。

  • XAMLファイルはプロジェクト出力としてではなく、インストール先のStylesフォルダにインストールする
  • リリースビルドでデバッグシンボルをインストール先の出力フォルダにインストールする
  • System.Windows.Interactivityの参照も追加しておく

.nupkgの作成はプロジェクトファイルをエディタで開いて最後に以下を挿入します。

これで、ReleaseビルドしたらNuGet PackageがローカルフォルダにDeployされるので、NuGet Package ManagerのPackage Sourcesにフォルダを追加して、プロジェクトにインストールできるようにします。

後は、中身と使い方です。

まず、編集中のコントロールの強制評価を行うためのヘルパーはstackoverflowにStackクラスを使った実装が紹介されていたので拝借。

stackoverflow.com

OpenFileDialogを開いてファイル名を取得するActionは、ファイル名やコマンドをバインドしてViewModelのコマンドを起動するものです。

まあ、System.Windows.Interactivityを参照する必要のある奴なら何でも良かったのですが・・・

XAMLのスタイルは以前の記事のものを分離しただけです。

tmori3y2.hatenablog.com

参照側は、こちらのgriefworker大先生の記事が見つかったので参考にさせていただきました。

tnakamura.hatenablog.com

f:id:tmori3y2:20160503174914p:plain

UserControlのResourceDictionaryはこうなります・・・

XAML相対パスも使えますが、UserControlとアプリが別アセンブリの場合は、アセンブリ名は省略できないようです。

ImportFileCommandは例えば以下のように実装します・・・

UserControlの編集状態の強制評価は以下のメソッドを追加して、

Windowの終了処理で以下のような処理を追加します。

(UserControlの名前をControlBodyにした場合)

ソースコード

github.com