web-dev-qa-db-ja.com

Generic.xamlの何が特別なのですか?

私は、チームの他のメンバーと再利用および共有するためにResourceDictionaryファイルを整理する方法を見つけようとしてきました。

「Generic.xaml」に出くわし続けますが、Generic.xamlのMSDNを見るか、単にGoogle検索を行うと、ブログの投稿とフォーラムの質問だけが出てくるようです。本当に権威のある明確なものにぶつかった。

Generic.xamlとMyRandomlyNamedResourceDictionary.xamlの違いは何ですか?いずれにせよ、ライブラリに保存されているResourceDictionariesをSource属性で参照する必要があるようです。例えば。、:

<Application.Resources>
    <ResourceDictionary
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>

では、Generic.xamlが提供する利点は何ですか?アプリケーションに複数の「外観」を与えようとしていない場合(つまり、テーマが1つしかない場合)、それは目的を持っていますか?

144
devuxer

WPFのすべてのコントロールには、特にコントロールのデフォルトControlTemplateを提供するデフォルトスタイルがあります。 WPFは、コントロールと同じアセンブリ内のテーマフォルダー内の特別なリソースディクショナリでデフォルトスタイルを探します。デフォルトスタイルのキーはControl.DefaultStyleKey依存関係プロパティによって提供され、そのデフォルト値はControlの各サブクラスでオーバーライドされます。

リソースディクショナリの名前は、現在のWindowsテーマによって異なります。 Aeroテーマを使用するVistaでは、辞書はAero.NormalColor.xamlと呼ばれ、XPはデフォルトテーマを使用するとLuna.NormalColor.xamlです。スタイルがテーマ辞書で見つからない場合、Generic.xamlで検索します。つまり、外観がテーマに依存しないコントロールを検索します。

これは、定義したカスタムコントロール、つまりControlから直接または間接的に派生したクラスにのみ適用されます。標準コントロールから派生して静的コンストラクターでDefaultStyleKeyProperty.OverrideMetadataを呼び出すことにより、標準コントロールのデフォルトスタイルを変更できますが、ControlTemplateを含む完全なスタイルを提供する必要があります。

ThemeInfo属性を使用して、デフォルトスタイルの外部アセンブリを検索するようにWPFに指示できることに注意してください。外部アセンブリには、<YourAssembly>.<ThemeName>。dllなどの名前を付ける必要があります。 PresententationFramework.Aero.dll。

143
Phil Devaney

のために generic.xamlファイル(大文字と小文字を区別しない)を特別なものにするには、次の2つの条件を満たす必要があります。

  • プロジェクトのThemesサブルートフォルダにある必要があります
  • アセンブリには、ThemeInfoAttribute(通常はAssemblyInfo.cs

次に、コントロールに適用するデフォルトスタイルのデフォルトの検索場所として機能します。また、スタイルをデフォルトにするには、スタイルを設定するコントロールのタイプとしてTargetTypeとx:Keyの両方を宣言する必要があることに注意してください。

テーマ全体とテーマの切り替えをアプリケーションに追加する場合は、コーディングを使用して行いますが、この手法はデフォルトのリソースディクショナリを定義するだけです。

98
Kenan E. K.