4

このページから、私は読んだ:

アプリケーションがカスタムコントロールを使用し、ResourceDictionary(またはXAMLリソースノード)でリソースを定義する場合は、アプリケーションまたはウィンドウオブジェクトレベルでリソースを定義するか、カスタムコントロールの既定のテーマでリソースを定義することをお勧めします。カスタムコントロールのResourceDictionaryでリソースを定義すると、そのコントロールのすべてのインスタンスにパフォーマンスへの影響があります。

OK ...これで、次のリソースを定義するUserControlができました。

<UserControl ...>
    <UserControl.Resources>
        <Namespace:ImagesConverter x:Key="ImagesConverter" ...
        <Storyboard x:Key="AnimationHide" ...
    </UserControl.Resources>

したがって、MSDNチュートリアルにあるように、実行時に100以上のインスタンスを作成しているため、これらのリソースをMainWindowまたはAppレベルに移動することをお勧めします。それらを移動するのに最適な場所はどこですか?MainWindowレベル、アプリレベル、またはリソースファイル?なぜ?

そして...どうすれば新しい場所からそれらを使用できますか?UserControl内に次のコードがあるとしましょう。

m_AnimationHide = (Storyboard)Resources["AnimationHide"];

それらの変更を反映するためにどのように変更する必要がありますか?代わりに、次のUserControl XAMLスニペットをどのように変更する必要がありますか?

Source="{Binding Source={x:Static Properties:Resources.MyImage}, Converter={StaticResource ImagesConverter}}"
4

2 に答える 2

4

個人的には、それらをすべてに追加するよりも使用App.xamlまたは分離することを好みます。これにより、xamlの乱雑さが解消されます。ResourceDictionaryWindow.ResourcesWindow

Themesこれにより、アプリケーションをすべて1か所にまとめて簡単に作成できるため、既存のResourceDictionary変更ブラシの色などをコピーしたり、ロードするものを選択したりResourceDictionary、アプリケーションの外観全体を簡単に変更したりできます。

にアクセスすることResoucesに関してUsercontrolは、xaml側に違いはありませんが、{StaticResource resourceKey}呼び出すときに階層を検索しStaticResourceてを検索するのと同じように使用し続けます。ResourceResource

したがって、リソースをからUserControl.Resourcesに移動した場合、Window.ResourcesまたはApplication.Resourcesアクセスしているxamlコード内の何も変更する必要がない場合{StaticResource resourceKey}

コードビハインドでのアクセスについては、xamlで行うように、階層を検索するFindResource("resourceKey")代わりに使用Resources["resourceKey"] します。FindResourceResourceStaticResource

例:

m_AnimationHide = (Storyboard)FindResource("AnimationHide");

特定のコントロールでこれらのリソースのいずれかを変更する必要があり、それらがフリーズしている場合は、そのインスタンスのコピーを作成するだけです。

var animation = FindResource("AnimationHide") as Storyboard;

m_AnimationHide = animation.Clone();
m_AnimationHide.Completed += m_AnimationHide_Completed;

これを設定x:Shared="false"すると、リソースから毎回アニメーションの新しいインスタンスが返されます。これにより、値を変更する必要がある複雑なリソースがある場合に、アプリケーション全体で同じアニメーションのコピー/貼り付けを節約できます。

<Storyboard x:Key="AnimationHide" x:Shared="false" />

その後、リソースをローカルで変更できるようになります。

于 2013-03-23T01:30:51.777 に答える
1

リソースをコントロールxamlから移動する理由について少し詳しく説明したいと思います。

MSDNライブラリで読んだように、何かをより高いレベルに移動する背後にある唯一の技術的な理由は、リソース(つまりメモリ)を節約することです。ResourceDictionaryの各エントリは、実行時にオブジェクト(= instance!)として作成され、メモリを消費し、初期化には数CPUサイクルかかります。

ここで、StoryBoardのようなものでキャッチします。実行中のアニメーションのインスタンスなど、コントロールの特定のインスタンスに関連する、または接続されているデータを格納するオブジェクトを、ドライブするコントロールのインスタンスごとに作成する必要があります。 。すべてのコントロールを同じように並行してアニメーション化する場合を除きます。

Cloneそもそもそのことをxamlに入れるのとは対照的に、私にとってはコードで使用することはあまり意味がありません。xamlアプローチは少しコピー/貼り付けが必要であるため、アニメーションを複数の場所で変更することを意味します(コントロール間でそのようなものを再利用できるStoryboard場合でも)が、コード要件を削除し、同じことを行います。コントロールのインスタンスごとにのインスタンスを作成します。

于 2013-03-23T03:10:29.527 に答える