我创建了一个使用AvalonDock框架的应用程序.关键部分是使用AvalonDock.DocumentContent派生编辑器编辑域模型实体的能力.我遇到了一个问题,发现我的编辑在关闭并从DockingManager.Documents集合中删除后没有被垃圾收集.
经过一些徒劳无功的搜索后,我创建了一个小型测试应用程序,可以通过以下方式重新创建:
AvalonDockLeak;Document;将Document.xmal更改为:
<ad:DocumentContent x:Class="AvalonDockLeak.Document"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ad="clr-namespace:AvalonDock;assembly=AvalonDock">
<Grid>
<TextBox />
</Grid>
</ad:DocumentContent>
Run Code Online (Sandbox Code Playgroud)将Document.xmal.cs更改为:
namespace AvalonDockLeak
{
using AvalonDock;
public partial class Document : DocumentContent
{
public Document()
{
InitializeComponent();
}
~Document()
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
我添加的析构函数能够诊断问题,在方法打开时添加一个断点{,并查看它是否被击中.它总是关闭测试应用程序,但不是更早.
现在将Window1.xaml更改为:
<Window x:Class="AvalonDockLeak.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ad="clr-namespace:AvalonDock;assembly=AvalonDock"
Title="Memory Leak Test" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Button Name="NewButton" Click="NewButton_Click" Content="New" Height="26" Width="72" />
<ad:DockingManager x:Name="DockManager" Grid.Row="1">
<ad:DocumentPane /> …Run Code Online (Sandbox Code Playgroud)