506

WPF でブラシ、テンプレート、スタイルなどのリソースを使用する場合、それらは StaticResources として指定できます。

<Rectangle Fill="{StaticResource MyBrush}" />

または DynamicResource として

<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}"  />

ほとんどの場合 (常に?)、1 つだけが機能し、もう 1 つは実行時に例外をスローします。しかし、私はその理由を知りたい:

  • 主な違いは何ですか。メモリやパフォーマンスへの影響など
  • 「ブラシは常に静的」、「テンプレートは常に動的」などのルールは WPF にありますか?

静的と動的のどちらを選択するかは、見た目ほど恣意的ではないと思いますが、パターンがわかりませ

4

8 に答える 8

499

StaticResourceは、アプリケーションが実際に実行される前に発生する XAML の読み込み中に解決され、プロパティに割り当てられます。一度だけ割り当てられ、リソース ディクショナリへの変更は無視されます。

DynamicResourceは、読み込み中に Expression オブジェクトをプロパティに割り当てますが、実行時に Expression オブジェクトが値を求められるまで、実際にはリソースを検索しません。これにより、実行時に必要になるまでリソースの検索が延期されます。良い例は、後で XAML で定義されたリソースへの前方参照です。もう 1 つの例は、実行時まで存在すらしないリソースです。ソース リソース ディクショナリが変更されると、ターゲットが更新されます。

于 2008-10-14T12:04:29.097 に答える
129

私もそれらについて混乱しました。以下のこの例を参照してください。

<Window x:Class="WpfApplicationWPF.CommandsWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="CommandsWindow" Height="300" Width="300">

    <StackPanel>
        <Button Name="ButtonNew" 
                Click="ButtonNew_Click" 
                Background="{DynamicResource PinkBrush}">NEW</Button>
        <Image Name="ImageNew" 
               Source="pack://application:,,,/images/winter.jpg"></Image>
    </StackPanel>


    <Window.Background>
        <DynamicResource ResourceKey="PinkBrush"></DynamicResource>
    </Window.Background>

</Window>

ここでは、ボタンとウィンドウに動的リソースを使用しており、どこにも宣言していません。実行時に、階層のResourceDictionaryがチェックされます。定義していないため、デフォルトが使用されると思います。

Buttonのクリックイベントに以下のコードを追加すると、DynamicResourceを使用しているため、それに応じて背景が更新されます。

private void ButtonNew_Click(object sender, RoutedEventArgs e)
{
    this.Resources.Add(  "PinkBrush"
                         ,new SolidColorBrush(SystemColors.DesktopColor)
                       );
}

StaticResourceを使用した場合:

  • リソースはXAMLで宣言する必要があります
  • そして、それも「前に」それらが使用されます。

混乱を解消したいと思います。

于 2010-12-30T03:26:34.867 に答える
36

StaticResource は、オブジェクトの構築時に解決されます。
DynamicResource は、コントロールがリソースを必要とするたびに評価され、解決されます。

于 2010-12-26T02:23:33.240 に答える
18

主な違いは何ですか。メモリやパフォーマンスへの影響など

静的リソースと動的リソースの違いは、基になるオブジェクトが変更されたときに発生します。Resources コレクションで定義された Brush がコードでアクセスされ、別のオブジェクト インスタンスに設定された場合、Rectangle はこの変更を検出しません。

要素を参照することによって一度取得され、リソースの存続期間中に使用される静的リソース。一方、DynamicResources は使用されるたびに取得します。

動的リソースの欠点は、アプリケーションのパフォーマンスが低下する傾向があることです。

「ブラシは常に静的」、「テンプレートは常に動的」などのルールは WPF にありますか?

コード ビハインドのリソースを動的に変更するなどの特定の理由がない限り、静的リソースを使用することをお勧めします。動的リソースを使用する別の例としては、SystemBrushes、SystenFonts、およびシステム パラメータを使用する場合が挙げられます。

于 2013-03-30T01:58:28.770 に答える
10

すべての回答が有用であることがわかりました。ユースケースをもう 1 つ追加したかっただけです。

複合 WPF シナリオでは、ユーザー コントロールは、そのリソースを DynamicResource として参照することにより、他の親ウィンドウ/コントロール (このユーザー コントロールをホストする予定) で定義されたリソースを利用できます。

他の人が述べたように、 Staticresource はコンパイル時に検索されます。ユーザー コントロールは、ホスティング/親コントロールで定義されているリソースを参照できません。ただし、この場合は DynamicResource を使用できます。

于 2014-01-24T10:01:15.453 に答える
4

動的リソースは、設定されているプロパティが依存オブジェクトから派生したオブジェクトまたはフリーズ可能である場合にのみ使用できますが、静的リソースはどこでも使用できます。静的リソースを使用して、コントロール全体を抽象化できます。

静的リソースは、次の状況で使用されます。

  1. 実行時にリアクション リソースを変更する必要がない場合。
  2. 多くのリソースで優れたパフォーマンスが必要な場合。
  3. 同じ辞書内のリソースを参照している間。

動的リソース:

  1. プロパティまたはスタイル セッター テーマの値は実行時まで不明
    • これには、システム、アプリケーション、テーマベースの設定が含まれます
    • これには前方参照も含まれます。
  2. ページ、ウィンドウ、ユーザー コントロールの読み込み時に読み込まれない可能性がある大きなリソースの参照。
  3. カスタム コントロールでのテーマ スタイルの参照。
于 2016-09-01T04:46:52.823 に答える