2017-09-28 176 views
0

我有一個直徑爲3英寸的圓形物理對象。我的應用程序將此圓形轉換到屏幕上,以便用戶可以從圓對象中直觀地查看它們在應用程序中看到的內容。我遇到的問題是,我需要圓形物體的直徑爲3英寸,並且在所有顯示器類型和所有分辨率上顯示相同的大小。所有分辨率的圓相同直徑WPF(分辨率獨立)

這可能嗎?我使用WPF和有這樣的事情已經:

<Window.Resources> 
    <behaviors:InchesToIndependentUnitsConverter x:Key="InchesToDeviceIndependentUnits" /> 
</Window.Resources> 
... 
<Ellipse x:Name="MyCircle" Height="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth}" Width="{Binding CircleDiameter, Converter={StaticResource InchesToDeviceIndependentUnits}}" Margin="0,0,0,20" Fill="White" BorderBrush="Black" BorderThickness="1" VerticalAlignment="Top" HorizontalAlignment="Center"></Ellipse> 
... 

我對DIU轉換英寸看起來是這樣的:

public class InchesToIndependentUnitsConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo cultureInfo) 
    { 
     int diameterDIU = 0; 
     if ((double)value > 0) 
     { 
      using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) 
      { 
       diameterDIU = (int)((g.DpiX/96) * value); 
      } 
     } 
     return diameterDIU; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo cultureInfo) 
    { 
     throw new NotImplementedException(); 
    } 

正如預期的那樣,這個作品非常好上說,1920×1200個解析度顯示器,但是當我開始變得更低時,自然一切看起來更大。無論人的顯示器的分辨率如何,我都需要我的<Ellipse>標籤的直徑始終爲3英寸。

謝謝!

+0

我沒有使用年齡的功能,但我確實相信WPF本身支持英寸作爲大小單位。如果您只是將寬度和高度設置爲「3in」,會發生什麼情況?請注意,由於Windows DPI設置很少反映顯示器的_actual_ resolution_,所以很少(如果有的話)尺寸完美無缺。 –

+0

當我閱讀你的評論時,我很興奮,因爲我不知道WPF有這樣的物理UOM。我試了一下,它在我的1920x1200 res顯示器上效果很好,但不幸的是它不等於3英寸,分辨率較低 –

+0

就像我說過的,如果有的話,你很少會得到完全匹配,因爲顯示器早已報告了96dpi即使真實音調經常接近120dpi也是如此。不幸的是,沒有辦法知道_actual_物理像素的大小。你可以接近,但你不會確切。令人難過的事情是,Windows報告的DPI價值往往不像現實。 –

回答

1

我對你有好消息和壞消息。

好消息是,WPF本身就支持英寸作爲尺寸單位。您可以簡單地將您的EllipseWidthHeight設置爲3in,您將得到WPF的最佳近似值。

壞消息是,WPF根據Windows報告的DPI設置將英寸轉換爲物理像素,而這些設置通常與實際情況相似。例如,Windows早就認爲我舊ThinkPad的顯示屏有96dpi的間距,但實際上它接近120dpi。移動屏幕特別傾向於報告其像素密度過高或過低。

有一個few unmanaged APIs可用的主旨返回顯示器的物理尺寸,雖然這些可能更加可靠,我懷疑結果將仍然被擊中或錯過。最有前途的似乎是使用SetupAPI在註冊表中查找顯示器的EDID塊。可能值得一試。如果它足夠可靠,您可以通過將水平和垂直像素數除以報告的物理尺寸,執行任何必要的公制到英制轉換(1 in = 2.54 cm)來手動計算有效DPI。