2

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

主窗口.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();
                                                                           });
    }

主窗口.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 对象仍然在内存中并且没有被 GC。Window1.xaml但是,如果我从- “Window1 Finalized”字符串中删除画笔绑定,则会出现在输出中。这意味着 Window1 对象被 GCed。

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

编辑 1

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

4

2 回答 2

1

I had a similar problem. Calling the freeze method on the brush after creation resolved it.

于 2013-10-22T08:21:55.423 回答
1

window1 未最终确定,因为在其 BackGround 属性中的 Binding 语法中仍有对其的引用。

尽管 Binding 是 OneWay,但存在与 MainWindow 属性的绑定这一事实意味着 Mainwindow 中存在对 Window1 的引用(因为依赖系统的工作方式) - 因此 Window1 不是垃圾收集的候选对象(并且因此不会最终确定)

于 2010-11-23T15:35:26.380 回答