因此,例如在我的程序中,我有一个名为MainWindow的窗口。在这个窗口中,我有一个框架,我使用导航菜单上的mousedown事件加载页面。
如果我调用Page1,如果我决定将另一个页面(例如Page2)加载到该框架中会发生什么?旧页面是否被内存保存?还是会被删除?
默认情况下,旧页面保存在内存中。
一个框架有一个日记。
这是Frames非常棘手的一个方面,因为它会保留对页面的引用。
只要日志挂起,您添加到框架的任何页面都将保持活动状态。
从文档中,KeepAlive中有一个相当奇怪的位:
“如果Page实例保留在导航历史记录中,则为true;否则为false。默认值为false。”这实际上意味着默认是真的。事实证明,非违约是真实的。
如果这是你想要的那么好。
如果这不是您想要的,那么您可能会有内存耗尽。
代码证明了这一点:
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel>
<Button Name="ShowPage1"
Content="Show Page One"
Tag="{x:Type local:Page1}"
Click="ShowPage_Click"
/>
<Button Name="ShowPage2"
Tag="{x:Type local:Page2}"
Click="ShowPage_Click"
Content="Show Page Two"/>
</StackPanel>
<Frame Grid.Column="1"
Name="TheFrame"
/>
</Grid>
代码背后
public MainWindow()
{
InitializeComponent();
}
private void ShowPage_Click(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
Type pageType = btn.Tag as Type;
var pg = Activator.CreateInstance( pageType);
TheFrame.Content = pg;
}
第1页
Title="Page1"
Background="Yellow"
>
<StackPanel>
<TextBlock Text="This is Page 1"/>
<TextBox />
</StackPanel>
第2页
Background="Pink"
>
<StackPanel>
<TextBlock Text="This is Page 2"/>
<TextBox />
</StackPanel>
脚步。单击“显示第1页”并在框中键入。
单击“显示第2页”,然后在框中键入任何内容
注意导航栏在那里。单击返回,您将看到原始页面1.内存中的内容。再次点击转发。在这里,我们又回来了。单击显示页面1.键入
然后单击导航按钮返回。
你猜怎么着?
第1页的第一个例子仍在那里。
在记忆中。
活。
尽管我根本没有设置KeepAlive。
这是我的解决方案:Frames Are Evil
如果我将KeepAlive设置为false,那么我输入的数据就会消失。
这意味着内存被释放了吗?
事实证明没有。
不总是。
你仍然会发现内存使用情况。
棘手的东西。
除非你完全理解它们是如何工作的,并且你对它很好,否则最好避免使用框架和页面。
我所使用的所有实质项目都使用了viewmodel第一个模式,使用了从viewmodel模板化的Contentcontrol和UserControls。
默认情况下,页面会被删除,但将KeepAlive
属性设置为true
会将其保留在内存中。
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="WillBeKeptInMemory"
KeepAlive="True"
>