可能重要的信息:
我使用的是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;状态。