1

約 7 つのユーザー コントロールで構成された WPF アプリケーションがあり、それぞれにさまざまなコントロール (テキスト ボックス、コンボ ボックス、ラジオ ボタンなど) があります。

アプリ全体に、CodePlex の WPF テーマから取得した一連のコントロール スタイルを適用しましたが、これらのスタイルを適用してから、アプリの速度が少し低下していることに気付きました。すべてのスタイルを含む ResourceDictionary のコード サイズは 300 KB 近くあります。

スタイルを複数のリソース ディクショナリに分割し、使用されていない場合でも、すべてのコントロール スタイルではなく、各ユーザー コントロールが必要とするスタイルのみをマージすることで得られるメリットはありますか。

WPF はどのようにスタイルをメモリにロードしますか? 必要な場合、または起動時に ResourceDictionary 全体がメモリに読み込まれますか?

4

1 に答える 1

2

オブジェクトが XAML (または BAML) から作成されるXamlReaderと、XAML のすべてのコンテンツが逆シリアル化されます。検出されたすべての XAML 要素は、オブジェクトのインスタンスを作成します。したがって、Style要素の下の要素は、オブジェクトが逆シリアル化されるときにユーザー コントロールのリソース ディクショナリに追加されるオブジェクトをUserControl.Resources生成します。Style(XAML 逆シリアル化には非同期の部分があるように見えるため、実際にはこれよりも少し複雑ですが、この説明の目的には十分に近いものです。)

Resourcesが静的プロパティではないことを理解することが重要です。ユーザー コントロールのすべてのインスタンスには、独自のリソース ディクショナリがあります。ユーザー コントロールの XAML に 300 個のスタイルを配置し、100 個のユーザー コントロールを作成すると、30,000Style個のオブジェクトが作成されます。これは、マージされた辞書を使用しているかどうかに関係なく当てはまります。

あなたの言うようにリソース ディクショナリが巨大な場合は、アプリケーションのResourcesプロパティに配置するのが最善の方法です。そうすれば、各オブジェクトを 1 回デシリアライズするだけで済みます。

于 2010-09-06T03:58:17.947 に答える