Próbuję wyśrodkować okno do okna właściciela. Potrzebuję również okna podrzędnego, aby poruszać się wzdłuż okna właściciela. Cross-post na forum MSDN WPF można znaleźć here.Górne i lewe wartości okna nie są poprawnie aktualizowane podczas maksymalizowania okna w .NET 4
Aby to osiągnąć, subskrybuję zdarzenia LocationChanged
i SizeChanged
(a także zdarzenie StateChanged
) właściciela mojego okna podrzędnego. Po uruchomieniu tych zdarzeń ponownie obliczam położenie okna potomnego. Robię to w kodzie z tyłu okna podrzędnego.
Kod jest bardzo prosta:
Top = Owner.Top + ((Owner.ActualHeight - ActualHeight)/2);
Left = Owner.Left + ((Owner.ActualWidth - ActualWidth)/2);
Jeśli skompilować i uruchomić program próbki I pod warunkiem widać, że to działa, gdy główne okno jest jak jest i przemieszczać. Ta część działa.
Problem pojawia się, gdy okno właściciela jest zmaksymalizowane. (Po zmaksymalizowaniu, przywróć normalne.) Ponieważ subskrybuję trzy zdarzenia, trzy razy wchodzę w funkcję przenoszenia. Po wydrukowaniu danych właściciela otrzymuję inne wyniki. Najbardziej irytujące wartości Top
i Left
okna właściciela są wyłączone. Wydaje się, że otrzymuje poprawne wartości górny i lewy, gdy stan się zmienia, ale wartości ActualWidth
i ActualHeight
są nieprawidłowe. Po wywołaniu zdarzeń LocationChanged
lub wartości są w porządku, ale wartości Góra i Lewica są niepoprawne. Wygląda na to, że są to poprzednie wartości. Jak to może być? Co to powoduje? I czy jest na to poprawna poprawka?
Ponieważ ten sam kod wydawał się działać w .net 3.5. Mam wrażenie, że coś zmieniło się w .net 4. (Albo miałem dziwny problem z timingiem, który spowodował, że problem się nie pojawił.) Ale nie mogę znaleźć żadnego udokumentowana zmiana w tej części.
.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
Tak więc głównym pozostaje pytanie: dlaczego to szczyt i wartości lewej właściciela błędna?
znalazłem wątku na SO, który wspomina, jak złapać maximiaze/przywracaj zdarzenia przez przesłonięcie WndProc: http://stackoverflow.com/questions/1295999/event-when-a-window-gets-maximized-un-maximized Wypróbuj kod w odpowiedzi http://stackoverflow.com/a/3382336/137972 – Christoffer
Od czasu T i L od zdarzenia LocationChanged jest poprawny Mogę je przechowywać w pamięci podręcznej i używać W i H z zdarzenia SizeChanged, ponieważ zdarzenie to przychodzi nawet POZ LocationChanged, ale tak jak twoja sugestia, jest to obejście tego problemu. Wolałbym teraz, dlaczego to zachowanie jest inne. – Jensen
Wykonuję te obliczenia w dwóch oknach, na dyspozytorach różnic i jestem bardzo wdzięczny, że natknąłem się na ten post! W końcu użyłem również metody buforowania. – RichardOD