2011-01-10 12 views
5

Ho una finestra WPF che contiene un'immagine di fantasia con circa 200 controlli (derivati ​​dai pulsanti), ognuno dei quali utilizza uno dei miei 5 modelli (percorsi, effetti ombra, ecc.). D'accordo, è una finestra pesante da disegnare. Posso vivere con quello.Problema di prestazioni WPF durante il ridimensionamento della finestra con molti controlli

Il mio problema deriva dal ridimensionamento della finestra. Ingrandisci/Ripristina impiega circa 1-2 secondi, ma trascinando manualmente l'angolo in basso a sinistra il sistema si blocca per circa 5-10 secondi. In questo ritardo, la finestra è nera. & contiene gli avanzi parziali finché non viene mostrato il risultato finale. Sembra dilettantesco e che, non posso vivere con.

Connessione remota: utilizzando un account remoto, ho scoperto che il ridimensionamento della finestra richiede sempre 1-2 secondi, ma non disegna le fasi "intermedie" mentre sto trascinando i bordi della finestra. Il risultato è rapido come mi aspetterei.

La mia conclusione è questa: è il ridisegna durante il il ridimensionamento che sono colli di bottiglia.

La domanda inevitabile è questa: come posso evitare di ridisegnare la finestra fino al termine del ridimensionamento?

Grazie in anticipo per tutte le idee ...

+0

+1 Per una buona domanda anche se hai 200 controlli che non è buono. :) –

+0

Grazie;) Sembra un cattivo design, ma è davvero un'interfaccia molto complessa. Scienza missilistica, per così dire. – Seb

+0

"La domanda inevitabile è questa: come posso evitare di ridisegnare la finestra fino al termine del ridimensionamento?" -Remote desktop ;-) – Firoso

risposta

4

@Seb: sto cominciando a pensare WPF è non progettati per le interfacce che vanno al di là 2-3 controlli alla volta

Visual Studio 2010 e Expression Blend dovrebbero essere buoni controesempi. Sebbene Visual Studio a volte blocchi il collo di bottiglia non è sicuramente nel rendering di WPF.

@Seb: La domanda inevitabile è: come posso impedire ridisegnare la finestra fino a quando il ridimensionamento è finito?

Impostare semplicemente la visibilità del contenuto della finestra su Visibility.Collapsed prima di ridimensionare/ingrandire e renderlo visibile in seguito. Anche se penso che tu abbia fatto la domanda sbagliata. Qui è quella giusta

Come rendere i miei controlli di misura/organizzare estremamente veloce?

E per rispondere dovresti dare un'occhiata al tuo codice. Forse usi intensamente le proprietà di dipendenza nell'algoritmo di misurazione/disposizione? O forse hai selezionato pannelli errati (ad esempio Grid è più lento di Canvas)? O forse ... smetto di indovinare qui :).

A proposito, è sempre meglio lanciare la tua app sotto profiler e dimostrare il collo di bottiglia piuttosto che assumere il posto dove potrebbe essere. Controlla Eqatec Profiler è gratis ma abbastanza potente. VS 2010 offre anche funzioni di profilazione, anche se è lontano dall'essere libero. E potresti voler controllare WPF Performance Suite.

Spero che questo aiuti.

+0

Va bene. Finalmente riuscito a provare il tuo approccio. Stiamo nascondendo alcuni strati costosi e questo è di grande aiuto. Penso che stiamo spingendo WPF ai suoi limiti ... da quanto ho sentito, dotnet 4 e msdev 2010 e blend 4 potrebbero avere ottimizzazioni che non stiamo ottenendo da dotnet 3.5 e msdev 2008 e blend 3. Ci arriveremo. Grazie per i tuoi input! – Seb

1

Fammi sapere come funziona ... Suppongo che il tuo oggetto visivo radice si estenda in orizzontale e in verticale per riempire la tua finestra con altezza/larghezza automatica. Sbarazzarsi dell'altezza/larghezza automatica. All'avvio dell'app impostare le dimensioni dell'elemento radice. C'è un FrameworkElements ha un size changed event.Registrati per questo sul tuo Application.Current.MainWindow (potrebbe essere un errore di battitura, che proveniva dalla memoria). Ogni volta che questo evento si attiva, avvia un timer con un intervallo ridotto. Se si ottiene un altro ridimensionamento mentre il timer è in esecuzione, ignorarlo e reimpostare il timer. Quando il timer scatta, ora conosci la nuova dimensione che l'utente desidera e che (almeno per un breve periodo) ha smesso di ridimensionare la finestra.

Spero che questo aiuti!

+0

Bel trucco, ma abbiamo bisogno di mostrare almeno qualcosa durante il ridimensionamento, altrimenti l'utente non sa quale sarà il risultato finale fino a quando non rilascerà il mouse ... Lo terrò a mente. Potrebbe rivelarsi un trucco pratico un giorno. Grazie molto. – Seb

0

Da Ragepotato's answer e i suoi commenti su bisogno di vedere più o meno ciò che l'interfaccia sarà simile mentre ridimensionamento, fino a quando non si dispone di oggetti ri-localizzare se stessi in modo dinamico (come un Wrap Panel) - si potrebbe prendere un screenshot del contenuto della finestra e riempire la cornice con esso.
Impostalo per allungare sia l'altezza che la larghezza e otterrai un'idea (leggermente sfocata) di quale sarebbe una dimensione particolare. Non sarebbe in diretta durante il ridimensionamento, ma per quei pochi secondi che probabilmente non avrebbero importanza ..

Problemi correlati