0

カスタム コントロールでコンバーターを静的リソースとして使用している場合、ウィンドウを閉じてもメモリ リークが発生します。

サンプルが添付されています。以下のスクリーンショットをご覧ください。

これに対する解決策を提案してもらえますか?

注: これは 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

4

0 に答える 0