XAML を分割して記述する方法

WPF でカスタムコントロールを作る場合、Generic.xamlXAML を記述していきます。コントロールの数が増えると Generic.xaml が肥大化し、保守が困難になってしまいます。

WPF では、ResourceDictionary の Source プロパティと MergedDictionaries プロパティを使うことで、別の XAML ファイルを読み込み、マージすることが可能です。この仕組みを使って、肥大化した XAML を複数のファイルに分割すれば、保守が楽になります。

例えば次のプロジェクト構成。

f:id:griefworker:20091014115033p:image

このとき、Generic.xaml に記述する内容は次の通りです。

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/WpfSamples;component/LocationBar/LocationBar.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

ResourceDictionary を使って、別の XAML を読み込みます。Source の指定方法に注意。

Source="/アセンブリ名;component/対象XAMLのプロジェクトルートからのパス"

読み込まれる XAML ファイルは、通常の ResourceDictionary で OK。ちなみに内容は次の通り。コントロールの詳細な XAML は割愛しています。雛型です。

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfSamples">

    <Style TargetType="{x:Type local:LocationBar}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:LocationBar}">

                    <!-- ここにコントロールのテンプレートを記述します。 -->

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>

コントロールライブラリを作成する場合は、XAML をコントロール毎に分けて記述した方がいいですね。