28

良い一日!

私はしばらくの間WPFアプリに取り組んできました(学習体験として、そしてそれは学習体験でした)そしてそれはついにリリースの準備ができています。リリースとは、映画コレクションの閲覧に使用されるHTPCにインストールすることを意味します。

1920 * 1080を実行するPCで設計しましたが、通常のDPI設定で、HTPC / TVは同じ解像度で実行されていますが、明らかな理由でDPI設定が高くなっています。

問題は、私のアプリがHTPCで大騒ぎになり、ビジュアルに関する限りほとんどすべてを台無しにしてしまうことです。これは悪いデザイン(mea culpa)が原因であることはわかっていますが、これは私だけが使用するアプリケーションなので、完全な再デザインではなく、迅速な修正を探しています。AssemblyInfo.csに以下を追加することで、アプリがDPI対応になるのを防ぐことができると読みました。

[assembly: System.Windows.Media.DisableDpiAwareness]

ただし、効果はないようで、アプリの動作は変わりません。

誰かが私を正しい方向に向けることができますか?

ありがとう、ヨハン

4

9 に答える 9

37

DPIA認識

いくつかのアイデア(試していません):

XPで実行していますか?そのオプションは、そのプラットフォームでは機能しない可能性があります。

以下は、おそらく同じ DpiAwareness オプションを設定する別の方法です。

  • EXEの「互換モード」設定を見てください...そのプロパティを右クリックして...「ディスプレイスケーリングを無効にする」をオンにします

  • マニフェストを作成し、知らないと言います

    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
     ...
      <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
          <dpiAware>false</dpiAware>
        </asmv3:windowsSettings>
      </asmv3:application>
     ...
    </assembly>
    
  • 呼び出しますSetProcessDPIAware(ウィンドウが作成される前に、これを早期に呼び出す必要があると考えてください)

    http://msdn.microsoft.com/en-gb/library/windows/desktop/ms633543(v=vs.85).aspx

IsProcessDPIAwareアプリ プロセスに設定が適用されているかどうかを確認するために呼び出すことができます。

DPI を調べる

現在使用している DPI を確認する方法は次のとおりです。

CompositionTargetを介してアクセスして、使用している DPI スケーリングを確認しPresentationSourceますWindow.....その後、値を使用してスケーリング調整を行うことができます。つまり、「もの」を縮小します (サイズ/長さなどはデバイスに依存しない単位で指定されます) 、より高い DPI が有効になっているために拡大されたときに、物理的なピクセルの使用量が爆発しないようにします (...これはViewBox、要素の幅などの計算など、さまざまな方法で行うことができます)。

double dpiX, double dpiY;
PresentationSource presentationsource = PresentationSource.FromVisual(mywindow);

if (presentationsource != null) // make sure it's connected
{
    dpiX = 96.0 * presentationsource.CompositionTarget.TransformToDevice.M11;
    dpiY = 96.0 * presentationsource.CompositionTarget.TransformToDevice.M22;
}

スケーリング調整を行う

  • ViewBoxトリックを使用する

    前に作成したこの回答を参照してください。これによりCanvas、DPIスケーリングに関係なく、「ネイティブ」ピクセルとして解釈された位置を使用できました。

    液晶画面フルHD用WPF

  • TransFormToDeviceのスケーリング行列にアクセスし、CompositionTargetそこからそのスケーリングを元に戻すだけの新しい行列を計算し、それをLayoutTransformまたはで使用しRenderTransformます。

  • DIP (Device Independent Position) の位置/長さを明示的に変更するメソッドを使用します (おそらくコンバーターに入れることもできます)。ウィンドウ サイズを特定のピクセル サイズに一致させたい場合は、これを行うことができます。

于 2012-12-13T11:36:41.460 に答える
3

簡単な修正は、 Window のコンテンツをViewboxでラップすることです。Viewbox の直接の子が明示的な幅と高さを持っていて、両方のマシンで縦横比が同じである場合、これによりすぐに起動して実行できるようになります。

于 2012-12-13T13:16:53.400 に答える
2

DpiAwarenessDPI 仮想化のみに影響します。Windows では、Windows 7 および 8 のカスタム解像度ボックスに「Windows XP スタイルのスケーリングを使用する」と表示されます。チェックされている場合は無効であり、チェックされていない場合は有効です。(変更する場合は、メインのフォント サイズ画面で適用することを忘れないでください。ボックスを OK するだけでは十分ではありません。)

DPI 仮想化がオフになっている場合、アプリがサポートする OS に伝える内容に違いはなく、常に標準スケーリングが使用されます。オンの場合、真のスケーリング (認識) と、アプリ全体でバイリニア サイズ変更を平手打ちする (認識しない) の違いが生じます。

もう 1 つの注意点を思い出しました。DPI virt は、Aero Glass が機能しないとまったく機能しません。

于 2013-02-28T02:52:47.593 に答える