绑定到刷子导致内存泄漏?

时间:2010-11-23 14:54:07

标签: wpf binding brush

假设我的应用程序中有以下类。

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public SolidColorBrush Brush { get; set; } 

    public MainWindow()
    {
        InitializeComponent();
        Brush = new SolidColorBrush(Colors.AliceBlue);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Window1 window = new Window1();
        window.DataContext = this;
        window.ShowDialog();
        Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, (Action)delegate
                                                                           {
                                                                               GC.Collect();
                                                                               GC.WaitForPendingFinalizers();
                                                                               GC.Collect();
                                                                           });
    }

MainWindow.xaml

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" >
    <Button Click="Button_Click">Do It</Button>
</Window>

Window1.xaml.cs

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    ~Window1()
    {
        Debug.WriteLine("Window1 Finalized");
    }
}

Window1.xaml

<Window x:Class="WpfApplication8.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"
        Background="{Binding Brush}">
    <Grid>

    </Grid>
</Window>

当我启动应用时,点击Do It按钮并关闭已打开的窗口 - Debug.WriteLine("Window1 Finalized");未执行。这意味着Window1对象仍然在内存中而不是GCed。但是如果我从Window1.xaml删除画笔绑定 - “Window1 Finalized”字符串会出现在输出中。这意味着Window1对象是GCed。

绑定如何将对象保留在内存中?它是错误还是实现绑定的方式?

编辑1

如果我绑定Foreground属性而不是Background属性,则完成Window1。所以它似乎不是依赖系统效应,而是背景属性实现的效果。

2 个答案:

答案 0 :(得分:1)

window1尚未最终确定,因为它的BackGround属性中仍然存在对Binding语法的引用。

虽然绑定是OneWay,但是存在绑定到MainWindow属性的事实,意味着从Mainwindow引用了Window1(因为依赖系统的工作方式) - 因此Window1不是Garbage的候选者收集(因此不会最终确定)

答案 1 :(得分:0)

我有类似的问题。创建后在画笔上调用freeze方法解决了它。