Emotion Wave Tech Blog

福岡にあるエモーションウェーブ株式会社のエンジニアが書いています。

WPFの画面でジェネリック・クラスを継承

WPFの画面でジェネリック・クラスを継承させることってできるのかな? と思い調べてみたらできました。

こんな感じです。

まず、継承させるジェネリック・クラスを作成します。

namespace WpfBaseWindow
{   public abstract class BaseWindow<T> : System.Windows.Window where T : BaseWindow<T>
    {
    }
}

そして、このBaseWindowを継承した画面を作成します。

C#のコード

    public partial class MyWindow: BaseWindow<MyWindow>
    {
        public MyWindow()
        {
            InitializeComponent();
        }
    }

xamlコード

<base:BaseWindow x:Class="Sample.MyWindow"
        x:TypeArguments="local:MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Sample"
        xmlns:base="clr-namespace:WpfBaseWindow;assembly=WpfBaseWindow"
        Title="MyWindow" Height="1024" Width="1280" WindowStartupLocation="CenterScreen">
    <Grid>
        ・・・
    </Grid>
</base:BaseWindow>

xamlでは「x:TypeArguments」を使ってジェネリックの制約型引数をコンストラクターに渡すことができるみたいです。