2010-11-04 4 views
1

Dans Wpf 4.0, vous pouvez désactiver l'anti-crénelage du texte pour un élément Framework et tous ses enfants en mettant ceci par ex. dans la fenêtre principale:Wpf 4.0: Dessin Alias ​​FormattedText/GlyphRun?

TextOptions.SetTextFormattingMode(this, TextFormattingMode.Display); 
TextOptions.SetTextRenderingMode(this, TextRenderingMode.Aliased); 

Cela fonctionne très bien pour TextBlocks etc., mais il ne semble pas avoir d'effet lors de l'utilisation des méthodes de l'DrawingContext DrawText (FormattedText) ou DrawGlyphRun (..).

Y a-t-il une chance de dessiner un texte alias via DrawingContext? (Je connais l'astuce FormattedText.BuildGeometry(), mais cela semble horrible lors de l'utilisation de petites tailles de texte)

Répondre

1

Je n'ai pas WPF4 en ce moment, donc je ne peux pas le tester. Mais une analyse rapide via MSDN montre que vous pouvez utiliser DrawingVisual. Définissez votre RenderingMode ici, puis utilisez RenderOpen pour obtenir DrawingContext.

Question est où et comment vous voulez dessiner ce texte.

+0

Oui, vous pouvez définir TextOptions.SetTextFormattingMode à un DrawingVisual. Lorsque vous utilisez FormattedText, vous pouvez obtenir des résultats très nets! Malheureusement, il semble que de cette façon vous ne pouvez pas obtenir un alias dessiné par GlyphRunDrawing. Je préférerais Glyphrun car il est beaucoup plus rapide que FormattedText et j'ai beaucoup d'éléments pour dessiner une méthode OnRender() surchargée d'un élément Framework. – fritz

1

Comment faire pour supprimer l'effet de flou GlyphRun:

var glyphRun = new GlyphRun(typeface, 0, false, emSize, glyphIndices, p, advanceWidths, null, null, null, null, null, null); 
var rect = glyphRun.ComputeAlignmentBox(); 
Double halfPenWidth = 0.5; 

GuidelineSet guidelines = new GuidelineSet(); 
guidelines.GuidelinesX.Add(rect.Left + halfPenWidth); 
guidelines.GuidelinesX.Add(rect.Right + halfPenWidth); 
guidelines.GuidelinesY.Add(rect.Top + halfPenWidth); 
guidelines.GuidelinesY.Add(rect.Bottom + halfPenWidth); 
drawingContext.PushGuidelineSet(guidelines); 
drawingContext.DrawGlyphRun(brush, glyphRun); 
drawingContext.Pop();