2017-10-18 17 views
2

ウェブでResourceDictionariesのパフォーマンス向上についてthis postが見つかりましたが、問題はかなり古いです(2011年)。私はこのようなものを実装することを考えていましたが、Microsoftが.NET Frameworkの最後のリリースでこれを修正していないのだろうかと思います。私はここで誰かがに答えを与えることを願って、このトピックに関するいくつかの質問、持っている:.NET Frameworkの4.6.1はまだ彼らが割り当てられているすべての時間のためにそれらの複数のインスタンスを作ることでResourceDictionaries、1を管理している同じResourceDictionaryの複数のインスタンス

  1. をコントロールに?
  2. それはアセンブリに"ButtonStyles"と呼ばれる、私は私のResourceDictionaryに例えばスタイル"CustomButtonStyle"を持っていても問題は、それらに割り当てられたCustomButtonStyleと20 Buttonsを持つアプリケーションのApp.xamlで参照され"StylesAssembly"と呼ばれていますか?
  3. 上記のケースでは、"ButtonStyles"ResourceDictionaryのインスタンスが20個存在することを正しく理解していますか?
+0

私はそれがテストするのはとても簡単だと思いますが、正確なシナリオを理解するのに問題があります。リソース辞書を持つ別のアセンブリを意味しますか? – Sinatr

+0

@ mm8私が間違いを指摘してくれたことを分かりやすくするためにポイント1を編集しました –

+0

@Sinatr問題は、 'ResourceDictionary'にコードがないので、私はそれをテストする方法がわかりません。そこにブレークポイントを置く。このシナリオは: 'StyleAssembly'は' ClassLibrary'であり、 'ButtonStyles'と呼ばれる' ResourceDictionary'を持ち、その中に 'CustomButtonStyle'を持っています。私のアプリケーションは 'StyleAssembly'を参照し、それをApp.xamlにマージし、私のMainWindowは' CustomButtonStyle'スタイルを使って20個の 'Buttons'を持っています。私のアプリケーションは 'ButtonStyles'インスタンスを20個作成しますか? –

答えて

-1

回答を投稿していただきありがとうございます。それは100%正しいです、私はちょうど私自身の答えを投稿したい、私は他の誰かのために役立つことができる興味深いものを見つけたので。

答え:ResourceDictionaryインスタンスは、アプリケーションで参照されると(そのスタイルを使用するコントロールが多数であっても)一度だけ作成されますが、使用される別のResourceDictionaryで参照されるたびに再度インスタンス化されますアプリケーションで


それでは、私たちは次のような構造を持っているとしましょうあなたにこの場合の例を与える:

<Style x:Key="DefaultButtonStyle" TargetType="{x:Type Button}"> 
    <!-- Some setters --> 
</Style> 

CustomButtonResourceDictionary:ButtonResourceDictionary.xamlは、次のコードを持っている

- StylesAssembly.dll 
    - ButtonResourceDictionary.xaml 
    - CustomButtonResourceDictionary.xaml 

- Application.exe 
    - App.xaml 
    - MainWindow.xaml 

.xamlには、次のコードがあります。ButtonResourceDictionary.xaml

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="ButtonResourceDictionary.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

<Style x:Key="CustomButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource DefaultButtonStyle}"> 
    <!-- Some setters --> 
</Style> 

Application.exeStylesAssembly.dllへの参照を持っており、App.xamlに次のコードがあります:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/StylesAssembly;component/ButtonResourceDictionary.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/StylesAssembly;component/CustomButtonResourceDictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

今私達のMainWindow.xamlはそれでこのような何かを持っている場合ButtonResourceDictionary.xamlは、1つのインスタンスのみを持つことになります。

私たちの MainWindow.xamlはそれでこのような何かを持っている場合

しかし、CustomButtonResourceDictionary.xaml 1つのインスタンスを持っていますが、ButtonResourceDictionary.xaml2つのインスタンスています:

<StackPanel> 
    <Button Style="{StaticResource DefaultButtonStyle}" /> 
    <Button Style="{StaticResource DefaultButtonStyle}" /> 
    <Button Style="{StaticResource CustomButtonStyle}" /> 
    <Button Style="{StaticResource CustomButtonStyle}" /> 
    <Button Style="{StaticResource CustomButtonStyle}" /> 
</StackPanel> 

それが起こるの最初の2 Buttons使用しているため、スタイルDefaultButtonStyleからButtonResourceDictionary.xamlまでですが、別の3つのButtonsの使用スタイルCustomButtonStyleはから来て、ButtonResourceDictionary.xamlをコードにマージします。

+0

これは予期された動作です。どのようにして統合された双子座は、そのインスタンスを作成せずに解決されるのだろうか? – mm8

+0

そして、私はそれを主張しません。私が今日経験したことから見つけるのは難しいですから、すべてを一つの場所に集めてここに掲示することにしました。多分それは将来誰かを助けるだろう。 –

2

私は、上記の場合には、「ButtonStyles」ResourceDictionaryの20件のインスタンスが存在することを、それを正しく理解していますか?

いいえ、1つだけです。

はCustomButtonStyleと20個のボタンを持っている私は、アプリケーションのApp.xamlで参照される「StylesAssembly」と呼ばれるアセンブリでの私のResourceDictionaryいわゆる「ButtonStyles」、例のスタイル「CustomButtonStyle」のために持っていても問題であり、それらに割り当てられている?

あなたApp.xamlResourceDictionaryをマージして、アプリケーション内のビュー間で20個のButton要素を作成する場合は、まだ作成さResourceDictionaryクラスのインスタンスは1つだけになります。

あなたはResourceDictionaryにコードビハインドクラスを追加することで、この自分自身を確認することができます。

Is it possible to set code behind a resource dictionary in WPF for event handling?

...と、コンストラクタにブレークポイントを置きます。

また、ResourceDictionaryで定義されているStyleのインスタンスが1つだけ作成されます。

+0

ありがとう、私はクラスの背後にあるコードを 'ResourceDictionary'に追加することはできません。私はそれを自分で確認したいと思っています。もしそれがうまくいくなら、私は答えとしてマークします。 –

+0

@ mm8と、「コントロールがResourceDictionaryを参照するたびに、XAMLが[ここ](https://wpftutorial.net/MergedDictionaryPerformance.html)から*の新しいインスタンスを作成します。私はあなたが間違っていると言っているわけではありませんが、あなたがテストしたシナリオとは別のシナリオを使用したと思われます。 – Sinatr

+0

問題はこの投稿は2011年からのものです。それが私がこの質問をした理由です。それはすでに古くなっている可能性があります –

関連する問題