2012-01-16 7 views
10

mam ten kod:
Window w = // something
w.Loaded += // some code to take a screenshot of the window
w.Show();Window.loaded pożary zanim okno jest w pełni załadowany

załadowanego Zdarzenie przed okno jest w pełni załadowany i otrzymuję ten obraz: Window screenshot

Mogę dodać Thread.Sleep lub coś podobnego po w.Show() i przed zrzutem ekranu, ale muszę uruchomić ten fragment kodu dla setek okien.
Moje pytanie brzmi: czy jest inne zdarzenie uruchamiane po pełnym załadowaniu okna? lub w jakiś sposób osiągnąć to bez uśpienia nici.

Dzięki

+0

@ H.B. Potrzebuję zrzut ekranu każdego okna w moim projekcie –

+8

@ H.B. to naprawdę nie jest kwestia jego pytania, a pytanie ma sens nawet dla 2 okien. Nie chciałbym czekać 4 sekund na 2 zrzuty ekranu i na pewno nie chciałbym być niepewny, jeśli dostanę wtedy, gdy używam zbyt niskiego czasu oczekiwania. Czasami możesz potrzebować (nie daj Boże) 200 zrzutów ekranu z tego samego okna z różnymi danymi. Rozumiem, że nie należy ignorować problemów architektonicznych, ale takie problemy nie są rzadkością i ludzie nie mogą ich naprawić, przeprojektowując i przepisując duże bazy kodu. Moim zdaniem pytanie jest bardzo rozsądne. –

+0

@Nikola: Nigdy nie powiedziałem nic na temat tego pytania ... –

Odpowiedz

22

Patrząc Object Lifetime Events artykule w MSDN można znaleźć:

załadowanego zdarzenie jest wywoływane przed ostatecznym renderingu, ale po systemie układu obliczył wszystkie niezbędne wartości dla renderowania. Załadowany oznacza, że ​​drzewo logiczne, które zawiera element, to w środku i jest połączone ze źródłem prezentacji, które zapewnia HWND i powierzchnię renderowania.

Powinieneś spróbować alternatywnych wydarzeń, które nie są idealnie dopasowane do twoich potrzeb. Należy starać się w następującej kolejności:

zwrócić uwagę, że te zdarzenia mogą wystrzelić kilka razy w czasie trwania okna, więc napisać aplikację z tym w umysł.

WPF jest architekturą interfejsu użytkownika opartą na danych i praca z nią nie jest zbyt przyjemna w sposób, do jakiego jesteśmy przyzwyczajeni w WinForm. Jak ktoś mądrzejszy ode mnie powiedział kiedyś, WPF sprawia, że ​​trudne rzeczy są trudne i trywialne.

+3

+1 dla Window.ContentRendered –

+0

ten sam wynik z pierwszym i trzecim, drugi rzuca wyjątek –

+0

Jak masz na myśli, że zgłasza wyjątek? Czy wyjątek ma miejsce w programie obsługi lub w środowisku .NET? Czy wynik pozostałych dwóch wygląda dokładnie tak samo, czy jest poprawnie załadowany do okna? Wypróbuj także [RenderTargetBitmap.Render] (http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.rendertargetbitmap.render.aspx), aby uczynić twoje okno bitmapą. Utwórz instancję klasy RTB, utwórz instancję swojego okna, nie trzeba jej pokazywać i przekazuj okno do metody renderowania. –

Powiązane problemy