10

現在、アプリケーションに動的に適用できるスタイルとテンプレートの辞書の作成に取り組んでいます。この「新しく必要な」動的動作の前に、App.xamlにマージした、スタイル付きコントロールごとに1つずつ、いくつかのリソースディクショナリがありました。

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ColorsDictionary.xaml"/>
            <ResourceDictionary Source="ControlsTemplatesDictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

ここで、アプリケーションのスタイルを設定したいので、以前のすべてのリソースを「MyFirstTemplates」という新しいリソースにマージし、この辞書のみをApp.xamlに追加することにしました。

新しい辞書「MyFirstTemplates.xaml」:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">"
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="ColorsDictionary.xaml"/>
        <ResourceDictionary Source="ControlsTemplatesDictionary.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

新しいApp.xaml:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MyFirstTemplates.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <Style TargetType="{x:Type Window}"/>
    </ResourceDictionary>
</Application.Resources>

注:ウィンドウの既定のスタイルは、WPF 4のバグを修正することです。「マージされたディクショナリを、マージされたディクショナリに追加する」を参照してください。

この変更を行ったため、「ColorsDictionary.xaml」のカラーリソースを「ControlsTemplateDictionary.xaml」のStaticResourceとして使用できなくなりました。これらのファイルをapp.xamlにマージするように戻すと、すべてが機能します。それを機能させるには、 DynamicResourceのこれらのStaticResourceを変更する必要があります。なぜこれが機能しなくなったのか分かりますか?

ありがとうございました :-)

4

2 に答える 2

10

辞書をApp.xamlから移動することにより、MyFirstTemplates.xamlの読み込み中に、各辞書のリソースが他の辞書のリソースツリーに含まれなくなります。元のセットアップは最初にColorsDictionaryをロードし、ロード中にアプリリソースからControlsTemplatesDictionaryに利用できるようになりました。新しいセットアップでは、カラーリソースをアプリリソースで使用できるようにするには、MyFirstTemplatesを介してロードする必要があります。これには、両方の辞書のロードが必要であり、カラーリソースへのアクセスが必要です。静的に解決できない参照の無限ループ。DynamicResourceは、すべてがロードされるまで待機してから、問題なく色にアクセスできます。

修正するには、Dynamicを使用するか、ColorsDictionaryをControlsTemplatesDictionaryに直接マージします。

于 2010-12-01T16:48:02.337 に答える
2

なぜこれが起こっているのかを説明するジョンによる素晴らしい答え。したがって、問題は、マージされたディクショナリ内でマージされたディクショナリを使用する場合、内部ディクショナリが互いにStaticResourceとして「使用」できないことです。

基本的な解決策:

  • DynamicResourceを使用する
  • StaticResourceを使用する場合は、App.xamlの単一レベルの階層のみを使用してください

これらのソリューションには両方とも問題があります。DynamicResourceにはパフォーマンスの問題があります。2番目のソリューションは、XAMLリソースの編成方法を制限します。

代替ソリューション:

ビルド前のイベントとして実行され、フォルダーから1つの長い.XAMLファイルにXAMLファイルをマージする、小さな単純なプログラム(GitHubで以下に提供)を作成しました。ええと、それらは異なる拡張子(.txaml)である必要があります、さもなければそれらはコンパイルされます。

これにより、WPFの制限なしに、リソースフォルダーとファイルを任意に構造化できます。StaticResourceとデザイナーは常に機能します。

GitHubのコードには、マージプログラムを含む単純なソリューションが含まれています。2つのフォルダを2つのファイルにマージします。1つはApp.xamlリソース用で、もう1つはGeneric.xamlリソース用です。「Controls」プロジェクトの.xamlファイル(「Main」プロジェクトもあります)。

これを説明するブログ投稿

于 2017-01-22T13:16:21.780 に答える