窗口控件不会在实例化之间留下内存

时间:2017-07-24 14:12:15

标签: c# wpf

可能重要的信息:

我使用的是WPF,而不是winforms。

PrintPanelViewbox的WPF结构是

viewbox <panel < "Panel1" = <image/> "Panel2" = <image/> "Panel3" = <image/> /> />

.Net Framework 4.5.2,Visual Studio 2017,Windows 7和10(测试两者)

我有一小段代码,它以对话框的形式向用户显示预览窗口。该部分的工作原理如下。

        if (/*there is something to preview*/)
        {
            Window window = new Window
            {
                Width = 300,
                Height = 600,
                MinWidth = 300,
                MinHeight = 600,
                MaxWidth = 300,
                MaxHeight = 600,
                Title = "Current Preview",
                Content = this.PrintPanelViewbox,
            };

            window.ShowDialog();
        }
        else
        {
            MessageBox.Show("There is nothing to preview.");
        }

TL; DR /底部有问题。

这是调用拉出预览窗口的整个方法。我希望在离开if()true {block}时,临时变量窗口将超出范围并被清除。但是这种行为不正确。

如果我在任何给定的配置中使用我的PrintPanelViewbox打开预览,它通常可以正常工作。但是,一旦打开一次,如果我更改PrintPanelViewbox的子配置(这是一个面板,我将它包装在一个视图框中以便更好地缩放)并运行此方法再次打开预览窗口,预览窗口会不要更新它的布局。

好的我想,所以我尝试以下所有方法强制孩子们进行递归更新:

window.InvalidateArrange();
window.UpdateLayout();

window.Content = null; //after running successfully

window.InvalidateVisual();

在我能想到的每个配置中,在预览窗口和PrintPanelViewbox上都有类似的调用。我甚至在每次调用时都使用线程锁定UI线程,只是为了查看它是否是一个比预览窗口显示时间更长的异步更新。

无论我做什么,预览窗口似乎总能记住上拉时最后显示的状态。

现在真的很奇怪。

如果我在无法一次显示PrintPanelViewbox的内容后再次显示该方法以显示预览窗口,则会正确显示该方法。我没有改变任何东西,我只是简单地运行了2次。第一个总是错的,第二个是正确的。

这告诉我,尽管控制范围超出范围并且它的孩子被改变,但不知何时渲染没有被更新。所以我决定以我能想到的唯一方式强制重新渲染。

我添加了一个变量,每次显示预览窗口时,该变量在1和0之间切换,然后将其添加到窗口的宽度和高度设置中。这意味着每次向用户显示窗口时,它具有1个像素大小的差异,迫使重新呈现其内容。这种方法有效,每次第一次正确显示窗口。

基本上我已经确认超出范围的窗口变量仍然位于操作系统的视觉"retained mode"中,并且当我更换孩子时没有调用重新渲染事件,因为孩子仍然是&#34;相同&#34;每次窗口实际显示给用户时都会生成孩子..

TL; DR

我的最后一个问题是,如何强制此窗口实际重新渲染?它没有dispose方法,并且由于子变量是相同的(尽管它的子项发生了变化),因为它是一个视图框,我确实想要固定的300 x 600窗口大小,我无法让它更新或离开&#34;保留&#34;状态。

0 个答案:

没有答案