2014-12-23 11 views
8

WPF şöyle metin oluşturmak için çalışıyorum. Şimdi How to: Create Outlined Text'u takip ederek biraz zor olan bir tek felç yaratabiliyorum. Gösterilmeyen özelliklerin, kontrolün tüm DP'leri olduğunu unutmayın.WPF'de metin üzerinde birden çok vuruş nasıl oluşturulur? sarı metin siyah inme, sonra sarı bir inme, sonra başka (çok ince) siyah inme ile olduğunu</p> <p><img src="https://i.stack.imgur.com/2oRjN.jpg" alt="sample text"></p> <p>Bildirimi:

protected override void OnRender(System.Windows.Media.DrawingContext drawingContext) 
{ 
    // Draw the outline based on the properties that are set. 
    drawingContext.DrawGeometry(Fill, 
           new System.Windows.Media.Pen(Stroke, StrokeThickness), 
           _textGeometry); 
} 

/// <summary> 
/// Create the outline geometry based on the formatted text. 
/// </summary> 
public void CreateText() 
{ 
    System.Windows.FontStyle fontStyle = FontStyles.Normal; 
    FontWeight fontWeight = FontWeights.Medium; 

    if (Bold == true) fontWeight = FontWeights.Bold; 
    if (Italic == true) fontStyle = FontStyles.Italic; 

    // Create the formatted text based on the properties set. 
    FormattedText formattedText = new FormattedText(
     Text, 
     CultureInfo.GetCultureInfo("en-us"), 
     FlowDirection.LeftToRight, 
     new Typeface(
      Font, 
      fontStyle, 
      fontWeight, 
      FontStretches.Normal), 
     FontSize, 
     System.Windows.Media.Brushes.Black 
    ); 

    // Build the geometry object that represents the text. 
    _textGeometry = formattedText.BuildGeometry(new System.Windows.Point(0, 0)); 
} 

Benim soru, bunu nasıl alıp başka (veya birkaç diğer) inme (ler) buna eklerim edilir?

+3

Birbirine birden fazla vuruş eklemeye ne dersiniz? Her seferinde daha küçük kalınlıkta mı? –

+0

@codemonkey Bu işe yarayabilir ... Aynı dolguyla ancak farklı boyutlarda vuruşlarla birden fazla 'DrawGeometry' çağrısı mı öneriyorsunuz? Konturun orijinal metnin dışına çıkmasını tercih ederim, ancak bu etkiyi gerçekleştirmenin basit bir yolu olabilir. – BradleyDotNET

+0

Neden codemonkey'in çözümüyle gitmediğinizi anlamıyorum. "İnme için orijinal metnin dışına çıkmayı tercih ederim" den ne demek istiyorsun? Yarısı içeride yarılmış mı, dışarıda mı? Eğer öyleyse, en dıştaki taslağı elde etmek için yapmanız gereken tek şey, metin geometrisinden en dıştaki çerçevenin dışına olan mesafenin iki katı kadar bir strok genişliği kullanmaktır. Daha sonra diğer tüm vuruşları üretmek için benzer bir matematik kullanırsınız ve son olarak iç kısımda inme olmadan bir dolgu yapın. – adv12

cevap

4

Bir yöntem inme geometrisini başlangıç ​​geometrisi ile birleştirmek, ardından strokunu ikinci vuruş için olacaktır.

Neyse ki, .NET, kontur geometrisini almak için Geometry.GetWidenedPathGeometry kanıtlıyor.

_combinedGeometry = Geometry.Combine(_textGeometry, 
     _textGeometry.GetWidenedPathGeometry(new Pen(Stroke, StrokeThickness * 2)), 
     GeometryCombineMode.Union, null); 

Not StrokeThickness * 2: Daha sonra iki birleştirmek Geometry.Combine kullanabilirsiniz. WPF bir merkez strok çizer ve bu olmadan, ikinci vuruş en azından kısmen (tam olarak değilse) ilkini örtecek. Ardından Dolgu için null ile, daha önce olduğu gibi çizmek:

drawingContext.DrawGeometry(null, 
     new System.Windows.Media.Pen(SecondaryStroke, SecondaryStrokeThickness), 
     _combinedGeometry); 

Ek vuruş için tekrarlayabilirsiniz veya bir döngü ile bir koleksiyon kullanabilirsiniz.

Uyarı: GetWidenedPathGeometry, kullandığınız yazı tipine, yazı tipinin boyutuna ve konturun boyutuna göre her zaman "mükemmel" konturu döndürmeyecektir. Herhangi bir eserin olmaması için onunla biraz oynamanız gerekebilir.

için geçici çözüm: Mümkünse, yazı tipi boyutunu artırın. İnme parçalarının arasındaki mesafeyi arttırır, algoritmanın iki parçayı "birleştirmesi" olasılığını azaltır veya başka eserler yaratır.

İlgili konular