我正在尝试将窗口居中于其所有者窗口。我还需要子窗口随其所有者窗口一起移动。可以在MSDN WPF论坛上找到交叉帖here。
为了实现这一点,我订阅了子窗口所有者的
这段代码非常简单:
如果您编译和运行我提供的示例程序,您会发现当主窗口保持原样或移动时它可以工作。所以那部分是有效的。
问题出现在所有者窗口被最大化后(并且恢复正常后)。因为我订阅了三个事件,我进入重新定位函数三次。在打印所有者数据后,我得到不同的结果。最令人烦恼的是所有者窗口的顶部和左侧值是错误的。似乎当状态改变时它获得了正确的顶部和左侧值,但是实际宽度和高度值是错误的。当触发LocationChanged或SizeChanged事件时,ActualWidth和ActualHeight值是正确的,但是顶部和左侧值是不正确的。似乎这些是以前的值。这是怎么回事?是什么导致了这个问题?是否有适当的解决方法?
由于相同的代码似乎在.net 3.5中起作用,我认为在.net 4中发生了一些变化。(或者我有一个奇怪的定时问题导致问题没有出现。)但是我找不到任何关于这部分的文档更改。
所以主要问题仍然是:为什么所有者的Top和Left值是不正确的?
为了实现这一点,我订阅了子窗口所有者的
LocationChanged
和SizeChanged
事件(以及StateChanged
事件)。当这些事件被触发时,我重新计算子窗口的位置。我在子窗口的代码后台完成此操作。这段代码非常简单:
Top = Owner.Top + ((Owner.ActualHeight - ActualHeight) / 2);
Left = Owner.Left + ((Owner.ActualWidth - ActualWidth) / 2);
如果您编译和运行我提供的示例程序,您会发现当主窗口保持原样或移动时它可以工作。所以那部分是有效的。
问题出现在所有者窗口被最大化后(并且恢复正常后)。因为我订阅了三个事件,我进入重新定位函数三次。在打印所有者数据后,我得到不同的结果。最令人烦恼的是所有者窗口的顶部和左侧值是错误的。似乎当状态改变时它获得了正确的顶部和左侧值,但是实际宽度和高度值是错误的。当触发LocationChanged或SizeChanged事件时,ActualWidth和ActualHeight值是正确的,但是顶部和左侧值是不正确的。似乎这些是以前的值。这是怎么回事?是什么导致了这个问题?是否有适当的解决方法?
由于相同的代码似乎在.net 3.5中起作用,我认为在.net 4中发生了一些变化。(或者我有一个奇怪的定时问题导致问题没有出现。)但是我找不到任何关于这部分的文档更改。
.NET 3.5:
OnOwnerLocationChanged
T: -8; L: -8; W: 640; H: 480
OnOwnerStateChanged
T: -8; L: -8; W: 640; H: 480
OnOwnerSizeChanged
T: -8; L: -8; W: 1936; H: 1066
.NET 4.0:
OnOwnerLocationChanged
T: -8; L: -8; W: 640; H: 480
OnOwnerStateChanged
T: 494; L: 33; W: 640; H: 480
OnOwnerSizeChanged
T: 494; L: 33; W: 1936; H: 1066
所以主要问题仍然是:为什么所有者的Top和Left值是不正确的?