WPF Bulanık yazı tipleri sorunu - Çözümler


153

Sorun aşağıdaki bağlantılarda tanımlanmış ve gösterilmiştir:

Açıklama: WPF'de Metin Netliği . Bu bağlantının yazı tipi karşılaştırması var.

Bu sorun için olası tüm çözümleri toplamak istiyorum. Microsoft Expression Blend, WPF kullanıyor ancak yazı tipleri okunabilir görünüyor.

  • Microsoft Expression Blend'deki gibi koyu arka plan
  • Yazı tipi boyutunu büyütme ve yazı tipini değiştirme (Kalibri ...) [bağlantı]
  • Windows formlarını gömme [bağlantı]
  • Bir bitmap'e metin oluşturmak için GDI + ve / veya Windows Forms TextRenderer sınıfını kullanın ve ardından bu bitmap'i WPF denetimi olarak oluşturun. [link]

Başka çözüm var mı?

Bu VS2010 (ve WPF4) beta 2'de düzeltilecek

SONRA ÇÖZÜLDÜĞÜ GİBİ GÖRÜNÜYOR!

Scott Hanselman'ın ComputerZen.com: WPF ve Metin Bulanıklığı, şimdi tam bir Netlik ile


VS2010RC benim için tamamen kullanılamıyor mpdreamz.nl/vs2010RC-blur.png
Martijn Laarman 24:10

Makinemdeki VS2010RC resminize göre çok daha iyi görünüyor, aslında beyaz arka planla çok iyi ama hala koyu arka planla berbat.
Robert Vuković

Bu sorun için herhangi bir çözüm buldunuz mu, Aslında burada benim uygulamada aynı sorunu var ve VS2010 ile WPF 3.5 kullanıyorum
SharpUrBrain

Son 3 bağlantı öldü.
SHIN JaeGuk

Yanıtlar:


107

Teknik arka plan

Windowsclient.net: WPF'de Metin Netliği üzerindeki WPF Metin Programı Yöneticilerinden birinden WPF Metin oluşturma hakkında derinlemesine bir makale bulunmaktadır .

Sorun, düzgün animasyonlar için doğrusal olarak ölçeklenen bir yazı tipi oluşturucuya ihtiyaç duyan WPF'ye kadar uzanır. Pure ClearType ise, dikey sapları bir sonraki piksele itmek için yazı tipi ile biraz özgürlük alır.

Klasik "çağlayan" kalıbını karşılaştırırsanız, bu fark açıktır. Sol alt tarafta WinForms, sağ üst tarafta WPF:

WPF'nin font oluşturma idiosyncrasies hayranı olmasam da, animasyonlar Winforms kaskatında olduğu gibi atlarsa clamor'u hayal edebiliyorum.

Kayıt defteri ile oynama

Beni özellikle ilgilendiren , kayıt defterinde olası kullanıcı tarafı düzenlemelerini açıklayan MSDN makalesi " ClearType Kayıt Defteri Ayarları " nın bağlantısıydı :

  • ClearType seviyesi: alt piksel ipucu miktarı
  • Gama seviyesi
  • Piksel yapısı: ekran pikselindeki renk şeritlerinin düzenlenmesi
  • Metin kontrast seviyesi: yazı tipini ağırlaştırmak için glif gövdelerinin genişliğini ayarlar

Bu ayarlarla oynamak, altta yatan sorunu gerçekten iyileştirmedi, ancak hassas kullanıcılar için renk kanama efektini azaltarak yardımcı olabilir.

Başka bir yaklaşım

Text Clarity makalesinin verdiği en iyi tavsiye, yazı tipi boyutunu artırmak ve yazı tipini değiştirmekti. Calibri benim için standart Segoe UI'den daha iyi çalışıyor. Web yazı tipi olarak popülaritesi nedeniyle, Verdana'yı da denedim, ancak yazı tipi boyutunu canlandırırken çok görünür olan 14pt ile 15pt arasında ağır bir sıçrama var.

WPF 4.0

WPF 4, yazı tiplerinin oluşturulmasını etkilemek için geliştirilmiş desteğe sahip olacaktır. WPF Metin Blogu'nda değişiklikleri açıklayan bir makale vardır . En belirgin şekilde, şimdi (en azından) üç farklı tür metin oluşturma vardır:

metin oluşturma karşılaştırması

<grumble> Bu her tasarımcı için yeterli ip olmalı. </grumble>


11
mükemmel bir açıklama, +1. Muhtemelen Flash'ın neden bu kadar korkunç yazı tipi oluşturma özelliğine sahip olduğunu açıklar.
Jeff Atwood

1
Evet. Bu iyi bir açıklama, ama yine de animasyon yapmayacağınızı bildiğinizde güzel bir görünüm için yazı tipi ipucunu açmanın bir yolu olsaydı. Bunun ipucunu optimize ettiğiniz belirli bir ölçeği ima edeceğini düşünüyorum. Bu tür şeyler WPF'nin hala beta sürümünde olmasını sağlıyor.
PeterAllenWebb

"Ölçeklenebilir" varyant font ipucu kullanmıyor gibi, sadece WPF ClearType'ın yaptığı gibi piksel ızgarasına vurmak için optimize etmiyor. Tartışmalı olarak SnapToDevicePixels metin için çalışmalıdır, ancak bu her zaman miras alınmalıdır, çünkü bir kontrol yapışıp yapışmayacağını bilemez.
David Schmitt

2
TextOptions.TextFormattingMode ekli özelliği ( msdn.microsoft.com/en-us/library/ee169597.aspx ) özellikle ilgilidir. WPF4 ve Silverlight ayrıca UseLayoutRounding ( msdn.microsoft.com/en-us/library/dd783605.aspx ) ve SnapsToDevicePixels ( msdn.microsoft.com/en-us/library/… ) özelliklerine sahiptir.
Pat

@Tüm: WPF3.5'te metnin kenar yumuşatmasını devre dışı bırakmanın bir yolunu bulamıyorum ve sonuç olarak etiket veya düğme metni gerçekten kötü görünüyor. İdeal olarak, fontlar için global olarak kenar yumuşatmayı devre dışı bırakmak istiyorum. Bunu nasıl başarabilirim?
SharpUrBrain

128

.NET 4 sonunda WPF'nin zayıf metin oluşturma kalitesine bir çözüm sunuyor, ancak iyi gizlenmiş. Her pencere için aşağıdakileri ayarlayın:

TextOptions.TextFormattingMode="Display"

Varsayılan değer, adın ima ettiği gibi olmayan "İdeal" dir.

TextOptions'ta TextHintingMode ve TextRenderingMode olmak üzere iki seçenek daha vardır, ancak her ikisinin de varsayılan varsayılanları vardır.


Herşey. Teşekkürler. Bu, sorunu çözmeme yardımcı oluyor, ancak kapta bir kez <grid>
Peter Du

Evet ve bir pencereye ayarlarsanız, bu pencerede bulunan her şey için geçerlidir.
Helge Klein

Metin biçimlendirmenin VS2010 RTM / .Net 4'te ne kadar iyi olduğu konusunda devam eden tonlarca site ve blogda bunu aramak için çok zaman harcadım (Kabul ediyorum, öyle!). Ama hiçbiri onunla inşa ettiğiniz WPF uygulamalarını nasıl yapabileceğinizden bahsetmiyordu, o kadar iyi görünüyor. Bu mülk neden bu kadar gizli? Çok teşekkür ederim.
M-Peror

5
Tek istediğim bu! WPF oluşturmanın ne kadar sofistike olduğu umurumda değil, yazı tipleri herkes için kabul edilemez.
Jerry Liang

1
"İdeal" benim için "Görüntü" yerine çalışıyor. Proje .NET 4.6.2 üzerinde. Belki şaşkın ismi düzelttiler.
joe

40

Geçen gün DropShadowEffect uygulanmış bir kenarlık kullandığımda bir sorunla karşılaştım . Sonuç olarak, bu kenarlığın içindeki tüm metinler son derece bulanıktı. Metnin diğer panellerin içinde mi yoksa doğrudan kenarlığın altında mı olduğu önemli değildir - Efekt uygulanan ebeveynin alt öğesi olan herhangi bir metin bloğu etkilenmiş gibi görünüyor.

Bu özel durumun çözümü, kenarlığa efektleri olan şeyler koymak değil, bunun yerine bir ızgara (veya içeriği üst üste koymayı destekleyen başka bir şey) kullanmak ve metinle aynı hücreye bir dikdörtgen yerleştirmekti (ör. görsel ağaçta bir kardeş olarak) ve bunun üzerindeki etkileri koydu.

Şöyle ki:

<!-- don't do this --->
<Border>
     <Border.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Border.Effect>
     <TextBlock Text="This Text Will Be Blurry" />
</Border>

<!-- Do this instead -->
<Grid>
  <Rectangle>
     <Rectangle.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Rectangle.Effect>
  </Rectangle>
  <TextBlock Text="This Text Will Be Crisp and Clear" />
</Grid>

Bu hile güzel yaptı. Bir kesmek biraz, ama ayarları vb ile uğraşmak daha iyi. Güzel bir. Teşekkürler. Ancak yapmak zorunda olduğum bir şey, dikdörtgenin dolgusunu bir şeye ayarlamaktı. Belki de bu sadece benim kurulumumdu.
Hades

Evet haklısın .. Dikdörtgen varsayılan olarak saydamdır, bu da alt gölgenin garip görünmesini sağlar.
Isak Savo

Bu benim örnek uygulama gerçekleşmiyor, ben WPF 3.5 kullanıyorum
SharpUrBrain

@SharpUrBrain: ne olmuyor? İkinci örneğimi kullandıktan sonra bile hala bulanık mı?
Isak Savo

Evet, ikinci örneğinizi kullandıktan sonra hala bulanık
SharpUrBrain


6

SnapToDevicePixels, metin oluşturucu için değil, yalnızca WPF şekilleri (çizgiler vb.) İçin geçerlidir.

Bu sorunun bilinen bir çözümü yoktur. Microsoft'a göre, davranış "tasarım gereğidir".

Ayrıca Microsoft forumlarda sorunları tartışan bu konuya bakın - bu konudaki pozisyonlarını netleştiren MS adamlarından birkaç cevap aldı.


WPF 4'te TextOptions.TextFormattingMode attached özelliği ( msdn.microsoft.com/en-us/library/ee169597.aspx ) kullanılarak düzeltildi .
Pat

1
Özellik adı, "SnapToDevicePixels" değil, "SnapsToDevicePixels" dir.
Nir Kornfeld

6

Bir geliştirici açısından bugüne kadar bilinen tek "geçici çözüm", bir bitmap'e metin oluşturmak için GDI + ve / veya Windows Forms TextRenderer sınıfını kullanmak ve daha sonra bu bitmap'i WPF denetimi olarak kullanmaktır. Bariz performans sonuçları dışında, bu durum mevcut uygulamalar için sorunu azaltmaz.

Şimdi bu sorun için bir Microsoft Connect bileti oluşturdum (tüm olumsuzluklara rağmen, belirlenen izleyicide gerçek bir hata raporu yoktu).

Bu, Microsoft'a istekleri ve soruları iletmenin resmi kanallarından biri olduğu için, daha hızlı bir cevap için de bu konuyu gözden geçirmenizi tavsiye ederim. En azından, sorunun şu ya da bu şekilde ele alınmasını istiyorsanız, o bilete oy vermek ve / veya sorunu doğrulamak, Microsoft PM'lerinin ve mühendislerinin dikkatini bu soruna çekmeye ve muhtemelen algılanan önceliğini artırmaya yardımcı olacaktır.


6

Ben bir hata olarak görmüyorum, ama varsayılan yapılandırma gerçekten çok can sıkıcı. İşte tüm kombinasyonlarının bir karşılaştırması

TextOptions.TextRenderingMode
TextOptions.TextFormattingMode
RenderOptions.ClearTypeHint

SnapToDevicePixels metin görüntülemede fark yaratmaz.

http://i.stack.imgur.com/cS3S2.png

Tercih ederim:

TextOptions.TextRenderingMode="Auto"
TextOptions.TextFormattingMode="Ideal"
RenderOptions.ClearTypeHint="Auto"

dikey çizgiler asla bulanık olmaz.

Kullanılan yazı tipi, en son TeamViewer'da olduğu gibi iyi kullanılırsa gerçekten güzel olabilen Open Sans Light'dır.

Mahapps.Metro kullananlar için sorun TransitioningContentControl https://github.com/MahApps/MahApps.Metro/issues/889


4

Sadece WPF'de yapılan VS2010 beta'yı denedim ve bulanık yazı tipi sorunundan KÖTÜ muzdarip. Özellikle araç ipuçlarında.

Bu, WPF4'ün aslında sorunu çözmeyeceğine dair bazı kanıtlar veriyor gibi görünüyor (eğer daha kötü görünüyorsa)


3
UI her metin için VS2010B1 karşı hata dosyalama metin bulanık. Araç ipuçları neredeyse komiktir, katılıyorum. Bunun WPF4'te düzeltilmesi ne kadar açıkça söylendiğine bakıldığında, sadece bu beta için kesinti yapmadığını umuyorum.
Dean Dean

4

Vay be, sonunda WPF yazı tiplerimi okunabilir hale getirdiğime inanamıyorum. Ayrıca, varsayılan değerler ekranımda korkunçken bu değişiklikleri kolaylaştıracak bir seçenek iletişim kutusu olmadığına da inanamıyorum.

Bu kayıt defteri ayarları (ondalık olarak) benim için çalıştı ve normal cleartype yazı tipime en yakın geldi:

  • ClearTypeLevel: 10 (çoğunlukla gri tonlu diğer adlandırma)
  • GammaLevel: 1300 (daha yüksek gama, yazı tipini çok ince yaptı ve diğer adlandırmadaki renkleri görüyordum)

3

"SnapToDevicePixels = true" işe yarıyor diyorlar, ama hiç iyi bir sonuç görmedim.

Farklı bir yazı tipine geçerek bulanık metinle mücadele ediyorum.

Açıkçası bu soruna bir çözüm değil, ancak bu şekilde çalıştım.


Sadece bir TextBlock ile SnapToDevicePixels = "true" ile bir tane olmadan karşılaştırdım ve 12 duis Segoe UI yazı tipi ile hiçbir fark yoktu. Hangi yazı tiplerini kullandığınızı sorabilir miyim?
David Schmitt

Ayrıca yazı tipimizi değiştirerek durumu daha iyi hale getirdik. Seçtiğimiz yazı tipi Avenir (varsayılan olarak yüklü olduğunu düşünmüyorum, en azından Windows XP'de değil).
cplotts

0

Uygulamanız için pencereleri özelleştirmek için bir C # temel sınıfı kullanmayı tercih ediyorsanız (veya şimdi bir nedeniniz varsa), metin biçimlendirmesini çekici Görüntüleme modunu kullanacak şekilde ayarlayabilirsiniz:

public class SnappyWindow : Window
{
    public SnappyWindow()
    {
        SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.