[WPF] ウィンドウ・ユーザーコントロールを使用できるDLLの作成

同じウィンドウやユーザーコントロールをいろんなプロジェクトで使いたい。
ですが通常DLLを作成する際に使用する「クラスライブラリ」プロジェクトではウィンドウやユーザーコントロール含めることができません。

ここでは、WPFのウィンドウやユーザーコントロールを使用できるDLLの作成手順を解説します。

環境

Windows 10 Home
Microsoft Visual Studio Community 2019 Version 16.4.2

DLL用のプロジェクトを作成

プロジェクト作成

VIsual Studioで「WPF アプリ(.NET Framework)」のプロジェクトを新規作成します。

WPFプロジェクトの作成

DLLに含めるウィンドウを作成

DLLに含めたいウィンドウを作成します。
ソリューションエクスプローラー > (プロジェクト)を右クリック > 追加 > 新しい項目
の順に進むと「新しい項目の追加」ダイアログが開きます。
そこで「ウィンドウ(WPF)」を選択して名前を入力後「追加」をクリックします。

Window(WPF)の新規作成

XAMLを編集してウィンドウを作っていきます。
今回は以下のようなログインウィンドウを作成しました。

ログインウィンドウ
ログインウィンドウ(LoginWindow.xaml)

DLLに含めるユーザーコントロールを作成

DLLに含めたいユーザーコントロールを作成します。
ソリューションエクスプローラー > (プロジェクト)を右クリック > 追加 > 新しい項目
の順に進むと「新しい項目の追加」ダイアログが開きます。
そこで「ユーザーコントロール(WPF)」を選択して名前を入力後「追加」をクリックします。

ユーザーコントロール(WPF)の新規作成

XAMLを編集してユーザーコントロールを作っていきます。
今回はTextBox1つとButton 1つのシンプルなユーザーコントロールを作りました。

ファイル選択ユーザーコントロール
FileSelectControl.xaml

出力の種類を「クラスライブラリ」に変更

作成した「WPFアプリ(.NET Framework)」プロジェクトのプロパティを開きます。
アプリケーション > 出力の種類 を「クラスライブラリ」に変更します。

プロジェクトのプロパティ

App.xamlのビルドアクション変更

App.xamlのプロパティを開きます。
ビルドアクションを「なし」に変更します。

App.xamlのプロパティ

上記の変更をしてビルドを行うと、DLLファイルが生成されます。

「出力の種類」「App.xamlのビルドアクション」を元に戻すと、
WPFアプリとしてデバッグ実行が可能です。
私は開発中は状況によって以下のように設定を切り替えています。

● DLL出力するとき
 出力の種類:クラスライブラリ
 App.xamlのビルドアクション:なし

● デバッグ実行するとき
 出力の種類:Windows アプリケーション
 App.xamlのビルドアクション: ApplicationDefinition

作成したDLLからウィンドウ・ユーザーコントロールを使用する

別のWPFプロジェクトから前述で作成したDLLからウィンドウ・ユーザーコントロールを使用する方法について解説します。

プロジェクトにDLLの参照を追加

Visual Studioのツールバーの
プロジェクト > 参照の追加 をクリックします。
参照マネージャーが開きます。

参照の追加

「参照」ボタンをクリックして、作成したDLLを選択します。

実装

今回は以下の画面を実装しました。
「DLLからWindow呼び出し」ボタンをクリックすると、DLL内のLoginWindow.xamlを表示する。
また、MainWindow.xaml内にユーザーコントロールを組み込んでいます。

サンプルWPF画面
ログインウィンドウ

ソースコード

MainWindow.xaml

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfTest"
        xmlns:WpfDllTest="clr-namespace:WpfDllTest;assembly=WpfDllTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350.681" Width="587.875">
    <Grid>
        <Button Content="DLLからWindow呼び出し" HorizontalAlignment="Left" Margin="10,31,0,0" VerticalAlignment="Top" Width="214" Height="46" Click="Button_Click"/>
        <GroupBox Header="DLLからユーザーコントロール呼び出し" HorizontalAlignment="Left" Height="192" Margin="10,106,0,0" VerticalAlignment="Top" Width="544">
            <Grid>
                <WpfDllTest:FileSelectControl Height="33" Width="500" Margin="10,14,22,122" />
                <WpfDllTest:FileSelectControl Height="33" Width="500" Margin="10,47,22,89" />
                <WpfDllTest:FileSelectControl Height="33" Width="500" Margin="10,80,22,56" />
                <WpfDllTest:FileSelectControl Height="33" Width="500" Margin="10,113,22,23" />
            </Grid>
        </GroupBox>
    </Grid>
</Window>

MainWindow.xaml.cs

using System.Windows;
using WpfDllTest;

namespace WpfTest
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        /// <summary>
        /// ボタンクリックイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // DLLからWindowを呼び出し
            LoginWindow loginWindow = new LoginWindow();
            loginWindow.Owner = this;
            loginWindow.ShowDialog();
        }
    }
}

ソースコードの解説

DLLからウィンドウを呼び出す

MainWindow.xaml.csの2行目で、ネームスペースの参照を追加しています。
WpfDllTestは任意のネームスペースに置き換えてください。

using WpfDllTest;

24~26行目でDLL内で定義している、ウィンドウを表示しています。
尚、この処理は「DLLからWIndow呼び出し」ボタンのクリックイベント時に呼び出されます。

LoginWindow loginWindow = new LoginWindow();
loginWindow.Owner = this;
loginWindow.ShowDialog();

XAMLでDLL内のユーザーコントロールを追加する

7行目でネームスペースの参照を追加しています。
各設定の意味は
xmlns:(任意の名前)=”clr-namespace:(ネームスペース名);assembly=(DLL名)”
となります。

xmlns:WpfDllTest="clr-namespace:WpfDllTest;assembly=WpfDllTest"

14~17行目ではDLL内のユーザーコントロールを配置しています。
下記の「WpfDllTest」はxmlnsで設定した名前を記述します。

<WpfDllTest:FileSelectControl Height="33" Width="500" Margin="10,14,22,122" />
<WpfDllTest:FileSelectControl Height="33" Width="500" Margin="10,47,22,89" />
<WpfDllTest:FileSelectControl Height="33" Width="500" Margin="10,80,22,56" />
<WpfDllTest:FileSelectControl Height="33" Width="500" Margin="10,113,22,23" />

上記のように、同じコントロールを複数個使うときは、ユーザーコントロール等を使い共通化することで効率がアップします。

コメント

タイトルとURLをコピーしました