WPF页面如何保存在内存中?

问题描述 投票:2回答:2

因此,例如在我的程序中,我有一个名为MainWindow的窗口。在这个窗口中,我有一个框架,我使用导航菜单上的mousedown事件加载页面。

如果我调用Page1,如果我决定将另一个页面(例如Page2)加载到该框架中会发生什么?旧页面是否被内存保存?还是会被删除?

c# wpf visual-studio
2个回答
1
投票

默认情况下,旧页面保存在内存中。

一个框架有一个日记。

这是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页”并在框中键入。

enter image description here

单击“显示第2页”,然后在框中键入任何内容

enter image description here

注意导航栏在那里。单击返回,您将看到原始页面1.内存中的内容。再次点击转发。在这里,我们又回来了。单击显示页面1.键入enter image description here

然后单击导航按钮返回。

你猜怎么着?

第1页的第一个例子仍在那里。

在记忆中。

活。

尽管我根本没有设置KeepAlive。

这是我的解决方案:Frames Are Evil

如果我将KeepAlive设置为false,那么我输入的数据就会消失。

这意味着内存被释放了吗?

事实证明没有。

不总是。

你仍然会发现内存使用情况。

棘手的东西。

除非你完全理解它们是如何工作的,并且你对它很好,否则最好避免使用框架和页面。

我所使用的所有实质项目都使用了viewmodel第一个模式,使用了从viewmodel模板化的Contentcontrol和UserControls。


3
投票

默认情况下,页面会被删除,但将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"
    >
© www.soinside.com 2019 - 2024. All rights reserved.