WPF DataGrid 无法被释放?

晚安苏州 2018-07-02 11:24:13
遇到奇怪的现象,只要在界面里加入DataGrid控件,界面内存实例就无法释放,举个例子:

在界面 MainWindow 里弹出一个新窗体 Window1:

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" >
<Grid>
<Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="215,137,0,0" Click="button_Click"
VerticalAlignment="Top" Width="75"/>
</Grid>
</Window>




private void button_Click(object sender, RoutedEventArgs e)
{
Window1 w1 = new Window1();
w1.ShowDialog();
}


1.首先,新窗体Window1里啥控件都不放,默认的如下:

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="Window1" Height="300" Width="300">
<Grid>

</Grid>
</Window>


弹出界面并关闭,操作数次之后,内存里是没有Window1这个实例的:


2.其次,我在Window1里加一个默认的DataGrid:

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="Window1" Height="300" Width="300">
<Grid>
<DataGrid Width="200" Height="200" Background="Brown">

</DataGrid>
</Grid>
</Window>


弹出Window1界面并关闭,操作数次,最终关闭Window1界面,内存里始终是有Window1这个实例的:


真的是服了,总是遇到这些奇葩情况,为什么呢?是不是这种弹出窗体做法不对?我手动释放 ,调用GC回收也不行:

private void button_Click(object sender, RoutedEventArgs e)
{
Window1 w1 = new Window1();
w1.ShowDialog();

w1 = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}


请高人指点

...全文
652 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
晚安苏州 2018-07-02
  • 打赏
  • 举报
回复
引用 1 楼 qq14923349 的回复:
gc不会马上生效的~~


问题是为什么不加DataGrid , 也不去手动调用GC回收,就没有上面的问题呢?感觉问题就出在加入了这个 DataGrid 控件
qq14923349 2018-07-02
  • 打赏
  • 举报
回复
Window1 w1 = new Window1();
w1.ShowDialog();

w1 = null;
完全没问题
qq14923349 2018-07-02
  • 打赏
  • 举报
回复
gc不会马上生效的~~
在Windows系统中,notepad.exe(记事本)是一个“经典的”、“简洁的”文本编辑器。这个软件,没有华丽的外观,也没有繁杂的功能,仅仅是一个文本编辑小软件。虽然经过Windows系统数十年的变换,但它却保持着永恒姿态,数十年来几乎不曾改变过。曾经,VS中的经典DEMO中,就有它的身影,一个新建的项目,就藏有一个新建的“记事本”。然而,在WPF的项目中,“记事本”却消失的无影无踪,也许是很容易实现,也许是为了革新,而不愿再传承“经典”。确实,使用WPF技术再次让“记事本”复活,确实也是一件非常容易的事情。但是,如果,使用WPF技术,再搭配当下非常流行的MVVM模式呢?复活“记事本”的难度却陡然上升至很多WPF程序员为之默默叹气。而,MVVM模式是掌握WPF的最顶级技术,MVVM模式拥有的无尽的优势,让WPF相对于过往的编程模式来说,是一种革命性的创新,从而也成为大中型WPF项目中必须的模式。但,学习难度。。。。。。在这个《WPF记事本开发详解》的课程中,赵老师带领你在WPF中,从零开始一步步构建MVVM模式,直到让你亲自以WPF+MVVM的方式,让这个经典的“记事本”软件从你的手中“复活”。在课程中,赵老师会详细讲解WPF和MVVM中的各种技巧,让你从此爱上WPF+MVVM编程。

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧