WPF でカスタムコントロールを作る場合、Generic.xaml に XAML を記述していきます。コントロールの数が増えると Generic.xaml が肥大化し、保守が困難になってしまいます。
WPF では、ResourceDictionary の Source プロパティと MergedDictionaries プロパティを使うことで、別の XAML ファイルを読み込み、マージすることが可能です。この仕組みを使って、肥大化した XAML を複数のファイルに分割すれば、保守が楽になります。
例えば次のプロジェクト構成。
このとき、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 をコントロール毎に分けて記述した方がいいですね。