2010-03-08 12 views
46

¿Alguien puede sugerir una guía sobre cuándo usar SnapsToDevicePixels en WPF 4.0?¿Cuándo debería usar SnapsToDevicePixels en WPF 4.0?

¿Debería usarse solo de vez en cuando si hay un problema, a través de una aplicación, solo en ciertos controles o qué?

+3

Me gusta pensar que las líneas limpias y nítidas hacen que su aplicación se sienta profesional y cuidada. Entonces, mi consejo es usarlo donde sea que ayude a ese objetivo. – cplotts

Respuesta

73

Buenas respuestas de Spencer y Martin en cuanto al cuando para alinear sus píxeles.

En cuanto a la forma en : Yo también desean señalar que hay que en WPF 4.0 tratar de usar la propiedad UseLayoutRounding en lugar de SnapsToDevicePixels.

UseLayoutRounding hace lo que está haciendo compatible con Silverlight (SnapsToDevicePixels no está disponible en Silverlight) ... y Microsoft también está alentando el uso de UseLayoutRounding sobre SnapsToDevicePixels en su documentation.

¿Cuál es la diferencia entre los dos? Bueno, una gran diferencia es que UseLayoutRounding ocurre durante la fase de disposición mientras que SnapsToDevicePixels ocurre durante la fase de renderizado. Esto me hace especular que UseLayoutRounding es probablemente una forma más eficiente de avanzar (aunque no lo he confirmado).

Dicho todo esto, todavía habrá motivos para usar SnapsToDevicePixels. De hecho, la documentación de MSDN apunta a uno. Agregaré otro: es solo con SnapsToDevicePixels que puede usar las pautas para un control preciso.

Aquí hay algunos recursos sobre este tema (es decirajuste de píxeles y la claridad con imágenes, texto y gráficos):

Heh. Sé que mi respuesta fue un poco más de lo que estaba pidiendo ... pero este concepto (es decir, la independencia de resolución y los problemas resultantes que trae y cómo superarlos) a menudo puede ser un punto de frustration cuando se trabaja con WPF. Por lo menos, quería señalarle la nueva propiedad de WPF 4.0, UseLayoutRounding.

ACTUALIZACIÓN

Sólo tengo que añadir que no veo a esto una y otra ... a veces funciona cuando SnapsToDevicePixelsUseLayoutRounding no lo hace. Me gustaría poder decir por qué este es el caso, pero definitivamente, primero use UseLayoutRounding y si eso no funciona, no dude en probar SnapsToDevicePixels.

¡Esa línea es tan nítida que puede cortarte!

+0

Más = Mejor en muchos casos, esta es una excelente respuesta a muchas preguntas que he tenido, especialmente porque estoy empezando a tener la sensación de que es mejor que transfiera mi aplicación WPF/Linq a SQL a Silverlight/Linq a EF –

+0

¿Podría SnapsToDevicePixels = true bajar el rendimiento de WPF de alguna manera? –

+1

@Peretz probablemente no de manera notable ... pero encenderlo agrega algo que debe hacerse/calcularse. Tal vez el efecto sea notable si tienes un montón de imágenes. Sin embargo, lo más probable es que el golpe de perforación se pierda en el rendimiento generalmente malo. – cplotts

5

Un caso es si está mostrando una imagen o video. Si no se ajusta a los píxeles del dispositivo (es decir, a los píxeles de la pantalla de video), se usa algún algoritmo (interpolación, suavizado) para ubicar los píxeles de la imagen "entre" los píxeles de la pantalla, y lo que se muestra no se verá tan bueno como lo haría la imagen original. La imagen perdería algo de nitidez.

8

Se debe utilizar en controles o áreas donde la ubicación de los píxeles tiene un significado. Los controles relacionados con el lienzo de una aplicación de dibujo serían un ejemplo. ¿Alguna vez has visto el mapa de una unidad fragmentada? Este podría ser otro ejemplo.

Una excepción que puedo pensar es cuando estás usando líneas divisorias de algún tipo. Si bien la mayoría de las personas espera que las líneas fronterizas sean sólidas si se desactiva esta configuración, pueden verse borrosas y molestas.

Básicamente si los bordes están borrosos = mal, apáguelos.

+6

Probablemente quiera decir * "si los bordes están borrosos, enciéndalo" * (establezca 'SnapsToDevicePixels = true' para eliminar el efecto borroso). – Sinatr

1

Acabo de notar que es muy útil para Borders. Información adicional here.

<Style TargetType="Border" > 
     <Setter Property="SnapsToDevicePixels" Value="True" /> 
</Style> 
Cuestiones relacionadas