Я пытаюсь центрировать окно к окну владельца. Мне также нужно, чтобы дочернее окно перемещалось по окну владельца. Перекресток на форуме MSDN WPF можно найти здесь.
Для этого я подписываюсь на события LocationChanged
и SizeChanged
(а также событие StateChanged
) владельца моего дочернего окна. Когда эти события запускаются, я пересчитываю местоположение дочернего окна. Я делаю это в коде для дочернего окна.
Код очень прост:
Top = Owner.Top + ((Owner.ActualHeight - ActualHeight) / 2);
Left = Owner.Left + ((Owner.ActualWidth - ActualWidth) / 2);
Если вы скомпилируете и запустите программу-образец, которую я предоставил, вы увидите, что она работает, когда основное окно является как есть, и перемещается. Так что эта часть работает.
Проблема возникает, когда окно владельца максимизируется. (И после максимизации, вернитесь в нормальное состояние.) Поскольку я подписываюсь на три события, я ввожу функцию переместить три раза. После распечатки данных владельца я получаю разные результаты. Наиболее раздражает Top
и Left
значения окна владельца. Кажется, что он получает правильные значения Top и Left при изменении состояния, но тогда значения ActualWidth
и ActualHeight
ошибочны. Когда SizeChanged
события LocationChanged
или SizeChanged
значения ActualWidth
и ActualHeight
в порядке, но значения Top и Left неверны. Кажется, это предыдущие значения. Как это может быть? Чем это вызвано? И есть ли правильное решение для этого?
Поскольку такой же код работал в.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?