2011-01-10 19 views
5

Tengo una ventana WPF que contiene una imagen elegante con aproximadamente 200 controles (derivados de botones), todos usan una de mis 5 plantillas (rutas, efectos de sombra, etc.) De acuerdo, es una ventana difícil de dibujar. Puedo vivir con ello.Problema de rendimiento WPF al cambiar el tamaño de la ventana con muchos controles

Mi problema proviene del cambio de tamaño de la ventana. Maximizar/restaurar toma aproximadamente 1-2 segundos, pero al arrastrar manualmente la esquina inferior izquierda, el sistema se cuelga durante aproximadamente 5-10 segundos. En ese retraso, la ventana es negra & contiene restos parciales hasta que se muestre el resultado final. Parece amateur y que, no puedo vivir.

Conexión remota: usando una cuenta remota, encontré que el tamaño de la ventana siempre toma 1-2 segundos, pero no dibuja las etapas "intermedias" mientras estoy arrastrando los bordes de la ventana. El resultado es tan rápido como podría esperar.

Mi conclusión es esta: es el redraws durante el cambio de tamaño que son los cuellos de botella.

La pregunta inevitable es esta: ¿cómo puedo evitar volver a dibujar la ventana hasta que el cambio de tamaño haya finalizado?

Gracias de antemano por cualquier idea ...

+0

1 Para una buena pregunta a pesar de tener 200 controles que no es bueno. :) –

+0

Gracias;) Parece un mal diseño, pero en realidad es una interfaz muy compleja. Ciencia de cohetes, por así decirlo. – Seb

+0

"La pregunta inevitable es: ¿cómo puedo evitar volver a dibujar la ventana hasta que termine el cambio de tamaño?" escritorio -remote ;-) – Firoso

Respuesta

4

@Seb: estoy empezando a pensar WPF es no está diseñado para las interfaces que van más allá de 2-3 controles a la vez

Visual Studio 2010 y Expression Blend deberían ser buenos contraejemplos. Aunque Visual Studio a veces se congela, el cuello de botella definitivamente no está en el renderizado de WPF.

@Seb: La pregunta inevitable es: ¿cómo puedo evitar volver a dibujar la ventana hasta que termine el cambio de tamaño?

Basta con establecer la visibilidad del contenido de la ventana para Visibility.Collapsed antes del cambio de tamaño/maximizar y hacerlo visible después. Aunque creo que hiciste una pregunta incorrecta. Aquí está el correcto

¿Cómo hacer que mis controles midan/arreglen extremadamente rápido?

Y para responder, debe echar un vistazo a su código. ¿Tal vez usa intensivamente propiedades de dependencia en el algoritmo de medición/ordenamiento? ¿O tal vez seleccionó paneles incorrectos (por ejemplo, la cuadrícula es más lenta que el lienzo)? O tal vez ... dejo de adivinar aquí :).

Por cierto, siempre es mejor iniciar su aplicación en Profiler y probar el cuello de botella en lugar de asumir el lugar donde podría estar. Compruebe Eqatec Profiler es gratis pero lo suficientemente potente. VS 2010 también ofrece buenas características de creación de perfiles, aunque está lejos de ser gratuito. Y es posible que desee comprobar WPF Performance Suite.

Espero que esto ayude.

+0

De acuerdo. Finalmente logró probar su enfoque. Estamos ocultando algunas capas caras y es de gran ayuda. Creo que estamos empujando WPF a sus límites ... por lo que escucho, dotnet 4 y msdev 2010 y mezclar 4 podría tener optimizaciones que no está recibiendo de dotnet 3,5 y msdev 2008 y mezclar 3. Vamos a llegar allí. Gracias por tus entradas! – Seb

1

Avísame cómo funciona esto ... Supongo que tu elemento visual raíz se extiende horizontal y verticalmente para llenar tu ventana con alto/ancho automático. Deshágase de la altura/ancho automático. Al iniciar la aplicación, establece las dimensiones del elemento raíz. Hay un FrameworkElements tiene un size changed event.Regístrese para esto en su Application.Current.MainWindow (tal vez sea un error tipográfico, que era de memoria). Siempre que se active este evento, inicie un temporizador con un pequeño intervalo. Si obtiene otro cambio de tamaño mientras el temporizador se está ejecutando, ignórelo y reinicie el temporizador. Una vez que se dispara el temporizador, ahora conoce el nuevo tamaño que desea el usuario y que (al menos por un período corto) ha detenido el cambio de tamaño de la ventana.

Espero que ayude!

+0

Niza solución, pero tenemos que mostrar al menos algo durante el cambio de tamaño, de lo contrario el usuario no sabe lo que el resultado final será hasta que se suelta el ratón ... Voy a mantener esto en mente aunque. Podría ser una solución práctica algún día. Muchas gracias. – Seb

0

De Ragepotato's answer y su comentario sobre la necesidad de ver a grandes rasgos lo que la interfaz se vería mientras cambio de tamaño, siempre y cuando usted no tiene sus objetos re-localizar a sí mismos de forma dinámica (como un Wrap Panel) - se puede tomar una captura de pantalla de los contenidos de la ventana y llene su marco con ella.
Establecer que para estirar tanto la altura como la anchura, y se obtendría una idea (un poco borrosa) de lo que sería un tamaño determinado. No sería en vivo mientras cambia el tamaño, pero para esos pocos segundos que probablemente no importaría ..

Cuestiones relacionadas