打开新的wpf窗口的正确方法

时间:2017-10-29 22:49:21

标签: c# wpf garbage-collection

我想知道在WPF中打开一个新窗口是否比在下面的代码中显示的更有效:

WindowConfigureDatabase windowConfigureDatabse;    

private void ButtonConfigureDatabase_Click(object sender, RibbonControlEventArgs e)
    {
        if (windowConfigureDatabase == null)
        {
            windowConfigureDatabase = new WindowConfigureDatabase();
        }

        windowConfigureDatabase.Clear();
        windowConfigureDatabase.Show();
        windowConfigureDatabase.WindowState = WindowState.Normal;
    }

其中windowConfigureDatabase是我要打开的新窗口。 windowConfigureDatabase.Clear();只需将所有值重置为默认值 - 其中很多值都无法重置。我想知道这是否是在wpf中打开新窗口的正确方法。我想到的另一条路径只是在每次点击按钮时创建一个新窗口(这样我每次都不必清除值......)但我害怕分配太多内存,如果用户打开窗口并关闭它很多次,因为我不太确定垃圾收集器是否在OnClose事件上选择了窗口。

所以基本上我的问题是 - 在关闭/关闭事件期间关闭它们之后,垃圾收集器是否选择了我的窗口?如果没有,那么手动管理窗口内存的正确方法是什么?会添加一个

  

windowConfigureDatabase = null

on Closed / OnClosing事件做得好吗?

1 个答案:

答案 0 :(得分:0)

  

我关闭后,垃圾收集器会把我的窗户取出来   在闭幕/闭幕活动期间?

是的,如果无法访问。阅读this以获得更好的主意。

  

会添加

     
    

windowConfigureDatabase = null

  
     

on Closed / OnClosing事件做得好吗?

是。如果不这样做,将阻止窗口被垃圾收集,直到覆盖windowConfigureDatabase或收集包含它的对象。

窗口使用的内存取决于它的大小以及它分配多少内存以执行它需要做的事情。除非您创建大量的窗口(~30 +)和/或大量数据,否则通常无需担心这一点。

分配的最快方法是预先分配(理想情况下在启动时)并尽可能重用。幸运的是,这对于Windows来说相对容易。这个想法是隐藏而不是关闭,只有在真正不再需要时关闭。

像这样:

// In each window class or as a base class:
private bool isClosable = false;

protected override void OnClosing(CancelEventArgs args)
{
    // Prevent closing until allowed.
    if (!isClosable) {
        args.Cancel = true;
        Hide();
    }
    base.OnClosing(args);
}

// Call this when you want to destroy the window like normal.
public void ForceClose()
{
    isClosable = true;
    Close();
}