oxyplot 圖表控制元件功能強大,使用很廣泛。最近考慮到效能使用OxyPlot.SkiaSharp替代OxyPlot.WPF,曲線圖表初步測試,效能提升近10倍左右。基於SkiaSharp圖形引擎的一些控制元件常遇見中文亂碼的問題,所以改用OxyPlot.SkiaSharp時也有心裡準備。預設情況下中文顯示真成了亂碼。如下圖所示。
![顯示亂碼](https://i.iter01.com/images/e37f9efce6b32ad72141446eee7224ada649439a7ae74277f9f7c43b1a27f5e8.png)
於是翻了遍OxyPlot.SkiaSharp原始碼,看到PlotModel中的DefaultFont屬性預設值是“Segoe UI”,西文無襯線體。試著改為“微軟雅黑”,中文顯示正常了。如下圖所示。
![顯示正常](https://i.iter01.com/images/f21a808bf4646eb97484f8af2e1145c279f4c5bcdd658c795f9a18fa274d403d.png)
OxyPlot.WPF中為什麼顯示沒問題,將WPF中TextBlock字型改為ALGERIAN後,只有英文應用了該字型,而中文則是以另外一種字型顯示的。如下圖所示。
![中英文分別對映](https://i.iter01.com/images/79f0ff113ce5a4be3a12d9f90176c587a2e856f2ac6b2334c8b01b11b40fd68d.png)
我們知道WPF的預設字型也是“Segoe UI”,為什麼顯示不會有問題呢,這就要提到WPF應用字型的機制了。
WPF應用程式使用屬性FontFamily、FontStyle、FontWeight、FontStretch和FontSize來指定它想要的字型。 在執行時,WPF會決定在應用程式執行的目標系統上使用準確的字型。這個決定是基於將前四個屬性(暫時忽略FontSize)與該系統上安裝的物理字型檔案進行匹配。
WPF首先將提供的FontFamily與系統中找到的字型名稱進行匹配。 然後,它試圖找到一個與所請求的FontStretch、FontStyle和FontWeight屬性值最接近的字型。 匹配FontStretch是最高優先順序,其次是FontStyle,然後是FontWeight。
如果WPF找不到匹配的字型,它就會“退回”到與WPF一起安裝的預設字型,即
C:\Windows\Fonts\GlobalUserInterface.CompositeFont
這是一種複合字型,它試圖將單個字元對映到系統上可能存在的字型。也就是說中文和英文是分開對映到不同的字型上。