カスタム コントロールでコンバーターを静的リソースとして使用している場合、ウィンドウを閉じてもメモリ リークが発生します。
サンプルが添付されています。以下のスクリーンショットをご覧ください。
これに対する解決策を提案してもらえますか?
注: これは ANTS プロファイルで確認しました。
カスタム コントロールを作成するサンプル コード。このコントロールは単純なサンプルで使用されます。
メモリ リークのレプリケーション手順とサンプルの説明:
作成したカスタム コントロールを簡単なサンプルで使用します。
ウィンドウを閉じる前と閉じた後 (カスタム コントロールが作成されたウィンドウ)、ANTS プロファイルでメモリ リークを確認します。
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:customcontrol">
<local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter"/>
<Style TargetType="{x:Type local:CustomControl1}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<StackPanel Orientation="Horizontal">
<TextBox Name="txtValue" Height="50" Width="100" />
<CheckBox IsChecked="{Binding ElementName=txtValue,
Path=Text,
Converter={StaticResource YesNoToBooleanConverter}}" />
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
public class CustomControl1 : Control
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
}
public class YesNoToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
switch (value.ToString().ToLower())
{
case "yes":
return true;
case "no":
return false;
default:
return Binding.DoNothing;
}
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if (value is bool)
{
if ((bool)value == true)
return "yes";
else
return "no";
}
return "no";
}
}
よろしく、プリヤンガB