2009-04-30 10 views

Répondre

17

La raison en est le système anti-aliasing qui étend la ligne sur plusieurs pixels si elle ne s'aligne pas avec les pixels du périphérique physique.

WPF est indépendant de la résolution. Cela signifie que vous spécifiez la taille d'un élément d'interface utilisateur en pouces, pas en pixels. Une unité logique dans WPF est 1/96 de pouce. Cette échelle est choisie, car la plupart des écrans ont une résolution de 96 dpi. Donc, dans la plupart des cas, 1 unité logique correspond à 1 pixel physique. Mais si la résolution de l'écran change, cette règle n'est plus valide.

Tous les contrôles WPF fournissent une propriété SnapsToDevicePixels. Si la valeur est true, le contrôle s'assure que toutes les arêtes sont dessinées de manière précise sur les pixels de l'unité physique. Mais malheureusement, cette fonctionnalité est uniquement disponible au niveau du contrôle.

Source: Draw lines excactly on physical device pixels

+0

Notez que la propriété SnapToDevicePixels n'a aucun effet sur les glyphes de texte. Essayez ceci sur TextBlock pour voir ce que je veux dire. Malheureusement, nous sommes coincés avec un texte flou pour le moment. –

+1

Il ya plus sur les polices floues ici: http://stackoverflow.com/questions/190344/wpf-blurry-fonts-problem-solutions – Spoike

2

Quick Fix:

Utilisez ces options chaque conteneur de la racine à votre contrôle floue

 UseLayoutRounding="True" 
     RenderOptions.BitmapScalingMode="NearestNeighbor" 
     SnapsToDevicePixels="True" 
     RenderOptions.ClearTypeHint="Enabled" 

Explication:

UseLayoutRounding = true corrige des problèmes de mise en page sous-pixel . Ils se produisent souvent parce que, par exemple, Les effets redimensionnent les contrôles pour être quelque chose entre les pixels.

RenderOptions.BitmapScalingMode = NearestNeighbor corrige un échantillonnage flou des bitmaps. Les bitmaps sont utilisés lorsque des effets ou d'autres techniques sont utilisés. Lorsqu'ils sont réappliqués au conteneur ou au contrôle, ils peuvent se retrouver entre les pixels et donc interpoler les pixels du bitmap.

SnapsToDevicePixels = "true" fixe des polygones verticaux et horizontaux, des lignes et des rectangles étant rendus inbetween pixels

RenderOptions.ClearTypeHint = "activé" Réactive cleartype le texte. Il est désactivé très facilement par les effets ou chaque fois que le moteur de rendu ne connaît pas l'arrière-plan exact d'un texte.

Vous devez l'utiliser sur tous les conteneurs car parfois, par ex. par les modèles de données, ces options sont à nouveau définies par défaut pour les sous-contrôles.

+1

Ajout: Vous pourriez rencontrer des problèmes visuels sur les écrans 4K ou dans d'autres occasions. Par exemple, le texte peut être déchiré au milieu ou certains pixels manquent complètement, même des lignes entières de 1pixel peuvent devenir invisibles. Vous avez besoin de techniques supplémentaires pour résoudre ces problèmes. – ecreif

Questions connexes