2011-05-02 28 views
8

我不希望我的WPF GUI使用Windows字體大小選項(DPI)進行縮放。這不僅僅是在UserControl上指定固定字體大小的問題,因爲縮放會影響UserControl中的圖像和邊框。是否有一個屬性,我可以在UserControl上設置關閉scalling?如果不是,我該怎麼做?如何防止使用Windows字體大小選項來擴展WPF?

+3

分辨率獨立性是WPF的核心理念之一。關閉它並不是一個好主意,特別是如果它只會影響部分用戶界面的話。實際上在各種計算機上使用的DPI範圍只會增加,具有巨大像素密度的顯示器已經在發展中。 – 2011-05-02 12:58:17

+2

一般來說,我同意你的看法。但在這種情況下,我真的需要關閉縮放,因爲此UserControl託管在未實現縮放的現有Windows窗體應用程序中。其結果是,我有應用程序的部分與大字體和部分應用程序與固定的字體。在Windows窗體應用程序的其餘部分中支持Windows字體設置目前不可行。 – Sylvain 2011-05-02 13:41:12

+1

我想這是有道理的,然後+1。 – 2011-05-02 14:05:57

回答

1

在另外的DpiDecorator,你也將需要修復您的項目的字體大小。例如,在Windows XP中,如果您的設置設置爲大字體,菜單項字體大小設置爲14,並且也使用DPI設置放大,所以如果您不修復MenuItem字體大小或任何其他UI項目字體,您將獲得此項目類型的Window默認值。還記得,用戶可以手動更改字體大小/字型其他項目...

8

基於當前的DPI設置你可以縮小你的用戶控件。例如,如果你包裹着以下DpiDecorator你的用戶控件,那麼它應該是相同的,無論DPI設置的:

public class DpiDecorator : Decorator { 

    public DpiDecorator() { 
     this.Loaded += (s, e) => { 
      Matrix m = PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice; 
      ScaleTransform dpiTransform = new ScaleTransform(1/m.M11, 1/m.M22); 
      if (dpiTransform.CanFreeze) 
       dpiTransform.Freeze(); 
      this.LayoutTransform = dpiTransform; 
     }; 
    } 

} 

或者你可以說邏輯移動到您的用戶控件。

的代碼以獲得DPI比例因子來自這個blog post

+0

這個完美的作品! – 2015-04-13 07:14:32

2

Windows包含爲在高DPI設置故障車的應用程序兼容性助手:

一定要離開關(或關閉)「使用Windows XP樣式DPI縮放‘:

enter image description here

,並確保您的應用程序沒有在它集清單一’dpiAware」條目。

Windows會騙你的應用程序,告訴它,它的96DPI,然後顯卡將縮放整個窗口,爲你。

一切都將是一些模糊的,一般不愉快的使用,但它的工作不夠好,直到你可以修復車WinForm控件。

注:dpiAware清單條目讓您的應用程序告訴Windows,它希望到DPI縮放的退出。如果應用程序已經以高分辨率進行測試,應用程序僅添加此項目。