Vấn đề phông chữ mờ WPF- Giải pháp


153

Vấn đề được mô tả và thể hiện trên các liên kết sau:

Giải thích: Văn bản rõ ràng trong WPF . Liên kết này có so sánh phông chữ.

Tôi muốn thu thập tất cả các giải pháp có thể cho vấn đề này. Microsoft Expression Blend sử dụng WPF nhưng phông chữ trông có thể đọc được.

  • Nền tối như trong Microsoft Expression Blend
  • Tăng kích thước phông chữ và thay đổi phông chữ (Calibri ...) [link]
  • Các dạng cửa sổ nhúng [link]
  • Sử dụng lớp GDI + và / hoặc Windows Forms TextRenderer để kết xuất văn bản thành bitmap, sau đó kết xuất bitmap đó dưới dạng điều khiển WPF. [liên kết]

Có giải pháp nào nữa không?

Điều này sẽ được sửa trong phiên bản beta 2 của VS2010 (và WPF4)

NÓ YÊU THÍCH NHƯ NÓ ĐÃ ĐƯỢC GIẢI QUYẾT!

Scott Hanselman's ComputerZen.com: WPF và Text Blurriness, giờ đã hoàn toàn rõ ràng


VS2010RC hoàn toàn không sử dụng được đối với tôi mpdreamz.nl/vs2010RC-blur.png
Martijn Laarman

VS2010RC trên máy của tôi trông đẹp hơn nhiều so với ảnh của bạn, thực sự với nền trắng rất tốt nhưng vẫn hút với nền tối.
Robert Vuković

Bạn có tìm thấy giải pháp nào cho vấn đề này không, thực ra tôi có vấn đề tương tự ở đây trong ứng dụng của mình và tôi đang sử dụng WPF 3.5 với VS2010
SharpUrBrain

3 liên kết cuối cùng đã chết.
SHIN JaeGuk

Câu trả lời:


107

Nền tảng kỹ thuật

Có một bài viết chuyên sâu về kết xuất văn bản WPF từ một trong những Trình quản lý chương trình văn bản WPF trên windowsclient.net: Text Clarity trong WPF .

Vấn đề bắt nguồn từ WPF cần một trình kết xuất phông chữ tỷ lệ tuyến tính để có hình ảnh động mượt mà. Mặt khác, ClearType hoàn toàn tự do với phông chữ để đẩy các thân dọc vào pixel tiếp theo.

Sự khác biệt là rõ ràng nếu người ta so sánh mô hình "thác" cổ điển. WinForms ở phía dưới bên trái, WPF ở phía trên bên phải:

Mặc dù tôi cũng không phải là fan hâm mộ của các biểu tượng hiển thị phông chữ của WPF, tôi có thể tưởng tượng ra tiếng kêu nếu hoạt hình sẽ nhảy như họ làm trong thác Winforms.

Chơi với sổ đăng ký

Đối với tôi đặc biệt quan tâm là liên kết đến bài viết " Cài đặt đăng ký ClearType " của MSDN , giải thích các điều chỉnh có thể có của người dùng trong sổ đăng ký:

  • Mức ClearType: lượng gợi ý pixel phụ
  • Cấp độ gamma
  • Cấu trúc pixel: cách các sọc màu trong pixel hiển thị được sắp xếp
  • Mức độ tương phản văn bản: điều chỉnh độ rộng của thân glyph để làm cho phông chữ nặng hơn

Chơi xung quanh với các cài đặt này không thực sự cải thiện vấn đề tiềm ẩn, nhưng có thể giúp bằng cách giảm hiệu ứng chảy máu màu cho người dùng nhạy cảm.

Cách tiếp cận khác

Lời khuyên tốt nhất mà bài viết Text Clarity đưa ra là tăng kích thước phông chữ và thay đổi phông chữ. Calibri hoạt động với tôi tốt hơn so với Segoe UI tiêu chuẩn. Do sự phổ biến của nó là phông chữ web, tôi cũng đã thử Verdana, nhưng nó có một bước nhảy khó chịu về trọng lượng giữa 14pt và 15pt, rất dễ thấy khi kích hoạt kích thước phông chữ.

WPF 4.0

WPF 4 sẽ được cải thiện hỗ trợ cho việc ảnh hưởng đến kết xuất phông chữ. Có một bài viết trên Blog Văn bản WPF giải thích về những thay đổi. Nổi bật nhất, hiện có (ít nhất) ba loại kết xuất văn bản khác nhau:

so sánh kết xuất văn bản

<grumble> Đó phải là sợi dây đủ cho mọi nhà thiết kế. </ grumble>


11
giải thích tuyệt vời, +1. Có lẽ giải thích tại sao Flash cũng có kết xuất phông chữ khủng khiếp như vậy.
Jeff Atwood

1
Đúng. Đó là một lời giải thích tốt, nhưng tôi vẫn ước có một cách để bật gợi ý phông chữ cho một cái nhìn đẹp khi bạn biết rằng bạn sẽ không làm động. Tôi cho rằng điều này sẽ ngụ ý một thang đo nhất định mà bạn đang tối ưu hóa gợi ý. Loại công cụ này làm cho WPF dường như vẫn là phiên bản beta đối với tôi.
Peter ALLenWebb

Nó không giống như biến thể "có thể mở rộng" không sử dụng gợi ý phông chữ, chỉ là WPF không tối ưu hóa để nhấn vào lưới pixel, giống như ClearType. Có thể cho rằng SnapToDevicePixels hoạt động cho văn bản, nhưng điều này sẽ luôn phải được kế thừa vì một điều khiển không thể biết liệu nó có thể chụp hay không.
David Schmitt

2
Đặc biệt có liên quan là thuộc tính được đính kèm TextOptions.TextFormattedMode ( msdn.microsoft.com/en-us/l Library / ee169597.aspx ). WPF4 và Silverlight cũng có các thuộc tính UseLayoutRounding ( msdn.microsoft.com/en-us/l Library / dd783605.aspx) và SnapsToDevicePixels ( msdn.microsoft.com/en-us/l Library / ' ).
Pat

@ Tất cả: Tôi không thể tìm cách vô hiệu hóa khử răng cưa của văn bản trong WPF3.5 và kết quả là nhãn văn bản hoặc nút văn bản trông rất tệ. Lý tưởng nhất là tôi muốn vô hiệu hóa khử răng cưa trên toàn cầu cho các phông chữ. Làm thế nào tôi có thể thực hiện điều này?
SharpUrBrain

128

.NET 4 cuối cùng cũng có giải pháp cho chất lượng hiển thị văn bản kém của WPF, nhưng nó được giấu kín. Đặt các mục sau cho mọi cửa sổ:

TextOptions.TextFormattingMode="Display"

Giá trị mặc định là "Lý tưởng" hoàn toàn không phải là tên của nó.

Có hai tùy chọn khác trong TextOptions, đó là TextHintingMode và TextRenderingMode, nhưng cả hai đều có mặc định hợp lý.


Tất cả. Cảm ơn. Điều đó giúp tôi giải quyết vấn đề, nhưng bạn chỉ cần xác định điều đó một lần trong vùng chứa như <lưới>
Peter Du

Có, và nếu bạn đặt nó trên một cửa sổ, nó có giá trị cho mọi thứ có trong cửa sổ đó.
Helge Klein

Đã dành rất nhiều thời gian để tìm kiếm điều này, tại hàng tấn trang web và blog, tiếp tục và về việc định dạng văn bản tốt hơn trong VS2010 RTM / .Net 4 (Tôi đồng ý, đó là!). Nhưng không ai trong số họ quan tâm đề cập đến cách bạn có thể tạo các ứng dụng WPF mà bạn xây dựng bằng nó, trông cũng tốt. Tại sao tài sản đó được giấu rất kỹ? Cảm ơn rât nhiều.
M-Peror

5
Tất cả những gì tôi muốn là cái này! Tôi thực sự không quan tâm đến việc kết xuất WPF tinh vi đến mức nào, các phông chữ không thể chấp nhận được với bất kỳ ai.
Jerry Liang

1
"Lý tưởng" hoạt động với tôi, thay vì "Hiển thị". Dự án là trên .NET 4.6.2. Có lẽ họ đã sửa tên nhầm lẫn.
joe

40

Tôi đã gặp một vấn đề vào một ngày khác khi tôi sử dụng một đường viền có áp dụng DropShadowEffect . Kết quả là tất cả văn bản bên trong đường viền đó cực kỳ mờ. Sẽ không có vấn đề gì nếu văn bản nằm trong các bảng khác hoặc ngay dưới đường viền - bất kỳ khối văn bản nào là con của cha mẹ có Hiệu ứng được áp dụng dường như bị ảnh hưởng.

Giải pháp cho trường hợp cụ thể này là không đặt các thứ bên trong đường viền có hiệu ứng, mà thay vào đó sử dụng lưới (hoặc bất cứ thứ gì khác hỗ trợ đặt nội dung lên nhau) và đặt một hình chữ nhật trong cùng một ô với văn bản (nghĩa là như một người anh em trong cây thị giác) và đặt các hiệu ứng lên đó.

Thích như vậy:

<!-- 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>

Điều này thực hiện các thủ thuật độc đáo. Một chút hack, nhưng tốt hơn là loay hoay với các thiết lập, v.v. cảm ơn. Tuy nhiên, một điều tôi phải làm là đặt phần đầy của hình chữ nhật vào một cái gì đó. Có lẽ đây chỉ là thiết lập của tôi.
HAdes

Vâng bạn đúng .. hình chữ nhật theo mặc định trong suốt làm cho bóng đổ trông lạ.
Isak Savo

điều này không xảy ra trong ứng dụng mẫu của tôi, tôi đang sử dụng WPF 3.5
SharpUrBrain

@SharpUrBrain: chuyện gì không xảy ra? Nó vẫn còn mờ ngay cả sau khi sử dụng ví dụ thứ hai của tôi?
Isak Savo

Có, nó vẫn còn mờ sau khi sử dụng ví dụ thứ hai của bạn
SharpUrBrain

10

Điều này sẽ được sửa trong phiên bản beta 2 của VS2010 (và WPF4):


1
+1 để thử nghiệm. Thật thú vị để xem văn bản này rộng hơn bao nhiêu.
David Schmitt

6

SnapToDevicePixels chỉ áp dụng cho các hình dạng WPF (dòng vv), không áp dụng cho trình kết xuất văn bản.

Không có cách giải quyết được biết đến vấn đề này. Theo Microsoft, hành vi này là "theo thiết kế".

Cũng xem chủ đề này trên các diễn đàn của Microsoft thảo luận về các vấn đề - nó đã nhận được một vài câu trả lời từ những người MS làm rõ vị trí của họ về vấn đề này.


Đã sửa lỗi trong WPF 4 bằng cách sử dụng thuộc tính TextOptions.TextFormattedMode ( msdn.microsoft.com/en-us/l Library / ee169597.aspx ).
Pat

1
Tên thuộc tính là "SnapsToDevicePixels" chứ không phải "SnapToDevicePixels" như được viết.
Nir Kornfeld

6

Từ quan điểm của nhà phát triển, "cách giải quyết" duy nhất được biết đến cho đến nay là sử dụng lớp GDI + và / hoặc Windows Forms TextRenderer để hiển thị văn bản thành bitmap, sau đó hiển thị bitmap đó dưới dạng điều khiển WPF. Ngoài ý nghĩa hiệu năng rõ ràng, điều này không làm giảm bớt vấn đề cho các ứng dụng hiện có.

Bây giờ tôi đã tạo một vé Microsoft Connect cho vấn đề này (thật ngạc nhiên, mặc dù tất cả các tiêu cực, không có báo cáo lỗi thực tế trong trình theo dõi được chỉ định).

Vì đó là một trong những kênh chính thức để truyền đạt các yêu cầu và câu hỏi tới Microsoft, tôi cũng khuyên bạn nên thông qua nó để có câu trả lời nhanh hơn. Ít nhất, nếu bạn muốn vấn đề được giải quyết bằng cách này hay cách khác, việc bỏ phiếu cho vé đó ở đó và / hoặc xác nhận vấn đề sẽ giúp thu hút sự chú ý của các Thủ tướng và kỹ sư của Microsoft đối với vấn đề này và có thể nâng cao mức độ ưu tiên.


6

Tôi không thấy đó là một lỗi, nhưng cấu hình mặc định thực sự rất khó chịu. Đây là so sánh của tất cả các kết hợp

TextOptions.TextRenderingMode
TextOptions.TextFormattingMode
RenderOptions.ClearTypeHint

SnapToDevicePixels không làm cho bất kỳ sự khác biệt trong kết xuất văn bản.

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

Tôi thích:

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

nơi các đường thẳng đứng không bao giờ bị mờ.

Phông chữ được sử dụng là Open Sans Light, có thể rất đẹp nếu được sử dụng tốt, như trong TeamViewer mới nhất.

Đối với những người sử dụng Mahapps.Metro, vấn đề là TransitioningContentControl https://github.com/MahApps/MahApps.Metro/issues/889


4

Chỉ cần dùng thử VS2010 beta, tất cả đều được thực hiện trong WPF và nó bị BADLY do vấn đề phông chữ mờ. Riêng về chú giải công cụ.

Điều đó dường như đưa ra một số bằng chứng cho thấy WPF4 trên thực tế sẽ không giải quyết được vấn đề (nếu bất cứ điều gì có vẻ tồi tệ hơn)


3
Tôi đang gửi các lỗi đối với VS2010B1 cho mỗi vị trí trong giao diện người dùng, văn bản bị mờ. Các chú giải công cụ gần như là xấu về mặt hài hước, tôi đồng ý. Cho biết rõ ràng điều này đã được sửa trong WPF4 như thế nào, tôi chỉ có thể hy vọng rằng nó đã không thực hiện việc cắt giảm cho phiên bản beta này.
Will Dean

4

Ồ, tôi không thể tin rằng cuối cùng tôi đã có phông chữ WPF có thể đọc được. Và tôi cũng không thể tin rằng không có hộp thoại tùy chọn để thực hiện những thay đổi này dễ dàng trong khi các giá trị mặc định là khủng khiếp trên màn hình của tôi.

Các cài đặt đăng ký này (ở dạng thập phân) hoạt động với tôi và gần nhất với phông chữ xóa thông thường của tôi:

  • ClearTypeLevel: 10 (chủ yếu là răng cưa thang độ xám)
  • GammaLevel: 1300 (gamma cao hơn làm cho phông chữ quá mỏng và tôi đã nhìn thấy màu sắc trong răng cưa)

3

Họ nói "SnapToDevicePixels = true" hoạt động, nhưng tôi chưa bao giờ thấy bất kỳ kết quả tốt nào.

Tôi chống lại văn bản mờ bằng cách chuyển sang một phông chữ khác.

Rõ ràng đây không phải là một giải pháp cho vấn đề, tuy nhiên đây là cách tôi đã làm việc xung quanh nó.


Tôi vừa so sánh TextBlock với SnapToDevicePixels = "true" với một cái không có và không có sự khác biệt với Phông chữ UI Segoe ở mức 12duis. Tôi có thể hỏi những phông chữ bạn sử dụng?
David Schmitt

Chúng tôi cũng làm cho tình hình tốt hơn bằng cách chuyển đổi phông chữ của chúng tôi. Phông chữ chúng tôi chọn là Avenir (Tôi không nghĩ rằng nó được cài đặt theo mặc định, ít nhất là không phải trên Windows XP).
cplotts

0

Nếu bạn thích sử dụng lớp cơ sở C # để tùy chỉnh các cửa sổ cho ứng dụng của mình (hoặc bây giờ có lý do), đây là cách bạn đặt có thể đặt định dạng văn bản để sử dụng chế độ Hiển thị hấp dẫn:

public class SnappyWindow : Window
{
    public SnappyWindow()
    {
        SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.