1

Header と呼ばれる 1 つの DependencyProperty を含むカスタム UserControl (MyView) があります。この UserControl は、他のいくつかの UserControls (ビュー) の一部です。DataTemplate によって解決されます

<!-- SomeView's resources -->
<DataTemplate DataType="{x:Type vm:MyViewModel">
  <vw:MyView Header="{StaticResource myViewHeader}" />
</DataTemplate>

MyView を含むビューの一部は、MyView のヘッダーに同じリソースを渡しています。このため、グローバルに利用可能なリソース (アプリケーション リソース) に myvIewHeader を配置しました。

リソースをグローバルに利用できるようにすると、MyView がガベージ コレクションを取得しないため、メモリ リークが発生します。

ただし、ヘッダー リソースをコンテナー (例: SomeView) のリソース内に配置すると、すべてが適切にクリーンアップされます。

ヘッダーにグローバルに利用可能なリソースを使用するときに MyView でメモリ リークが発生しないようにするには、MyView の Unloaded イベントで Header を null に設定する必要があります。

this.Unloaded += (s, e) =>
  {
    this.SetValue(HeaderProperty, null);
  };

私の質問はこれです:なぜこれが起こっているですか?

4

0 に答える 0