带转换器的MemoryLeak

时间:2018-07-17 06:47:21

标签: wpf memory-leaks custom-controls staticresource ants

在自定义控件中将转换器用作静态资源时,即使关闭窗口,也会发生内存泄漏。

随附示例,请在下面找到屏幕截图。

请问您对此有何建议?

注意:我已经在ANTS个人资料中进行了检查。

enter image description here

Sample link

创建自定义控件的示例代码。此控件用于简单示例。

带有示例说明的内存泄漏复制步骤:

在简单的示例中使用创建的自定义控件。

在关闭窗口之前和之后,(哪个窗口具有创建的自定义控件)检查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";
    }
}

关于, Priyanga B

0 个答案:

没有答案