假设我的应用程序中有以下类。
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();
});
}
<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>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
~Window1()
{
Debug.WriteLine("Window1 Finalized");
}
}
<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。
绑定如何将对象保留在内存中?它是错误还是实现绑定的方式?
如果我绑定Foreground属性而不是Background属性,则完成Window1。所以它似乎不是依赖系统效应,而是背景属性实现的效果。
答案 0 :(得分:1)
window1尚未最终确定,因为它的BackGround属性中仍然存在对Binding语法的引用。
虽然绑定是OneWay,但是存在绑定到MainWindow属性的事实,意味着从Mainwindow引用了Window1(因为依赖系统的工作方式) - 因此Window1不是Garbage的候选者收集(因此不会最终确定)
答案 1 :(得分:0)
我有类似的问题。创建后在画笔上调用freeze方法解决了它。