Generic.xamlの何がそれほど特別なのですか?


153

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

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

Generic.xamlとMyRandomlyNamedResourceDictionary.xamlの違いは何ですか?どちらにしても、ライブラリに格納されているResourceDictionariesをSource属性で参照する必要があるようです。例えば、:

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

では、Generic.xamlが正確に提供する利点は何でしょうか。アプリケーションに複数の "外観"を与えようとしない場合(つまり、テーマが1つしかない場合)は、目的はありますか?


6
(ユーザーコントロールではなく)カスタムコントロールを使用している場合は、generic.xaml辞書をコードにマージする必要はありません。
Eternal21

回答:


152

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

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

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

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


ありがとう、フィル。つまり、通常のButtonコントロールに新しいControlTemplateを提供したいだけ(つまり、Buttonから派生する独自の特別なクラスを作成しない)なら、これは「テーマ」の一部とは見なされないということですか。
devuxer 2009

はい。標準のコントロールを再テンプレート化またはスタイル変更する場合は、UserControl / Window / Application / Whateverレベルで通常のResources要素を使用します。暗黙のキーを持つスタイル(msdn.microsoft.com/en-us/library/…)を使用して、特定のタイプのすべてのコントロールを変更できます。
Phil Devaney、

@Zaheylu動作しています(MSがドキュメントを更新していたと思います)
Alan McBee-MSFT

104

以下のためgeneric.xamlのファイル(ケース小文字を区別しない)何か特別なものにする、2つの条件が満たされる必要があります。

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

次に、コントロールに適用するデフォルトスタイルのデフォルトルックアップ場所として機能します。また、スタイルをデフォルトにするには、スタイルを設定するコントロールのタイプとして、TargetTypeとx:Keyの両方を宣言する必要があります。

テーマ全体とテーマの切り替えをアプリケーションに追加する場合、これはなんらかのコーディングによって実現されますが、この手法はデフォルトのリソースディクショナリを定義するだけです。


3
「デフォルトのスタイル」の意味を明確にできますか?これは、すべてのボタンが、TargetTypeが "Button"であるスタイルを自動的に取得することを意味しますか?それとも私はx:Key書くことによってまだ参照する必要があり<Button Style="{StaticResource MyButtonStyle}" />ますか?ResourceDictionaryに、TargetTypeが「Button」であるスタイルが複数含まれている場合はどうなりますか?ありがとう。
devuxer 2009

3
これを理解するのに役立つもう1つの質問:Generic.xamlは、さまざまな要素のデフォルトの外観を定義したCSSファイルに相当するWPF h1 {color:#00ff00}です。
devuxer 2009

3
はい、デフォルトのスタイルはキーを明示的に参照せずに適用され、2つの同じスタイルは辞書に2つの同じキーがあるというエラーを与えます。そして、はい、あなたはそれをデフォルトの行動に関してそのように考えることができます。
ケナンEK

3
それを追加したいだけですが、generic.xamlファイル自体に特別な制限があることは事実ですが、generic.xaml内のディクショナリエントリは、エントリが何でも参照できるマージされたディクショナリにすることができます。
Tormod、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.