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