2017-09-28 5 views
0

直径3インチの円の形をした物理的なオブジェクトがあります。私のアプリケーションはこの円の形をスクリーンに移し、ユーザはサークルオブジェクトからアプリケーションに見えるものを視覚的にチェックすることができます。私が持っている問題は、直径が3インチで、すべてのモニタータイプとすべての解像度で同じサイズのサークルオブジェクトが必要なことです。すべての解像度で円の同径WPF(解像度の独立性)

これは可能ですか?私は、WPFを使用していますが、すでにこのような何かしている:期待、これは1920×1200解像度の言うことには非常にうまく機能したよう

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(); 
    } 

:DIUコンバータへ

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

マイインチは次のようになりますモニターが、私が低くなるにつれて、自然にすべてが大きく見えます。私の<Ellipse>タグの直径は、人のモニターがどんな解像度であっても常に3インチにする必要があります。

ありがとうございます!

+0

私は長年の機能を使用していませんが、WPFはサイズ単位としてインチをネイティブにサポートしていると思います。幅と高さを '3in'に設定するだけでどうなりますか? Windows DPIの設定では、モニタの実際の解像度が反映されることはほとんどないため、サイズを完全に取得することはめったにありません。 –

+0

あなたのコメントを読むと、WPFに物理的なUOMがあるとは思えないので、私は興奮しました。私はそれを試して、それは私の1920x1200解像度のモニターで素晴らしい仕事をしましたが、残念ながら、より小さい解像度で1インチに3インチに等しくなかった –

+0

私は言ったように、モニターが長い間96dpi真のピッチが120dpiに近いことが多い場合でも残念ながら、実際のピクセルサイズが何であるかを知る方法はありません。あなたは近づくことができますが、正確になることはありません。悲しいことに、DPIのWindowsのレポートは、現実にはあまり似ていない傾向があります。 –

答えて

1

私には良いニュースと悪いニュースがあります。

良いニュースは、WPFがサイズ単位としてインチをネイティブにサポートしていることです。 EllipseWidthHeight3inに設定するだけで、WPFの最適な近似値が得られます。

悪い知らせは、Windowsで報告されているDPIの設定に応じてWPFが物理ピクセルに変換されることです。これは現実にはほとんど似ていません。たとえば、Windowsでは、古いThinkPadのディスプレイの表示が96dpiであると長い間信じていましたが、実際には120dpiに近いものです。特に、モバイル画面は、そのピクセル密度を過大または過少に報告する傾向があります。

は、ディスプレイの物理的な寸法を返すためにfew unmanaged APIs利用できる旨があり、これらのより信頼性が高いかもしれないが、私は結果がまだヒットまたはミスされます疑い。最も有望なのは、SetupAPIを使用してディスプレイのEDIDブロックをレジストリに配置するようです。ショットに値するかもしれません。十分な信頼性があると思われる場合は、水平および垂直ピクセル数を報告された物理的なサイズで除算し、必要なメトリックから慣習への変換(1 in = 2.54 cm)を実行して、効果的なDPIを手動で計算できます。

関連する問題