web-dev-qa-db-ja.com

Win10 UWPアプリで画面解像度を取得する

UWPアプリは一般的なデスクトップシステムでウィンドウモードで実行されるため、画面解像度を取得する「古い」方法は機能しなくなります。

Window.Current.Boundsを使用した古い解像度は、 のように表示されました。

(プライマリ)ディスプレイの解像度を取得する別の方法はありますか?

26
Alex Witkowski

他の回答をさらに改善するために、次のコードもスケーリング係数を処理します。 Windowsディスプレイの200%(3200x1800を正しく返す)とLumia 930(1920x1080)の300%に対応しています。

var bounds = ApplicationView.GetForCurrentView().VisibleBounds;
var scaleFactor = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;
var size = new Size(bounds.Width*scaleFactor, bounds.Height*scaleFactor);

他の回答で述べたように、これはルートフレームのサイズが変更される前にデスクトップ上で正しいサイズを返すだけです。

51
sibbl

いつでもどこでもこのメソッドを呼び出します(モバイル/デスクトップアプリでテスト済み):

public static Size GetCurrentDisplaySize() {
    var displayInformation = DisplayInformation.GetForCurrentView();
    TypeInfo t = typeof(DisplayInformation).GetTypeInfo();
    var props = t.DeclaredProperties.Where(x => x.Name.StartsWith("Screen") && x.Name.EndsWith("InRawPixels")).ToArray();
    var w = props.Where(x => x.Name.Contains("Width")).First().GetValue(displayInformation);
    var h = props.Where(x => x.Name.Contains("Height")).First().GetValue(displayInformation);
    var size = new Size(System.Convert.ToDouble(w), System.Convert.ToDouble(h));
    switch (displayInformation.CurrentOrientation) {
    case DisplayOrientations.Landscape:
    case DisplayOrientations.LandscapeFlipped:
        size = new Size(Math.Max(size.Width, size.Height), Math.Min(size.Width, size.Height));
        break;
    case DisplayOrientations.Portrait:
    case DisplayOrientations.PortraitFlipped:
        size = new Size(Math.Min(size.Width, size.Height), Math.Max(size.Width, size.Height));
        break;
    }
    return size;
}
10
SeregaLBN

より簡単な方法:

var displayInformation = DisplayInformation.GetForCurrentView();
var screenSize = new Size(displayInformation.ScreenWidthInRawPixels, 
                          displayInformation.ScreenHeightInRawPixels);

これは、現在のビューサイズに依存しません。いつでも実際の画面解像度を返します。

4
Vyacheslav

わかりましたので Juan Pablo Garcia Coello からの答えは私をソリューションに導きます-ありがとう!

使用できます

var bounds = ApplicationView.GetForCurrentView().VisibleBounds;

しかし、私のケースではウィンドウが表示される前にすぐに呼び出す必要があります

Window.Current.Activate();

良い場所です。この時点で、アプリが表示されるウィンドウの境界を取得します。

それを解決するのを助けてくれてありがとう:)

よろしくアレックス

3
Alex Witkowski

私が見つけた唯一の方法は、ページのコンストラクタ内です:

 public MainPage()
    {
        this.InitializeComponent();

        var test = ApplicationView.GetForCurrentView().VisibleBounds;
    }

Windows 10 Mobileではテストしていませんが、新しいリリースが表示されたらテストします。

このメソッドを使用して、画面サイズを取得します。

public static Size GetScreenResolutionInfo() 
{ 
    var applicationView = ApplicationView.GetForCurrentView(); 
    var displayInformation = DisplayInformation.GetForCurrentView(); 
    var bounds = applicationView.VisibleBounds; 
    var scale = displayInformation.RawPixelsPerViewPixel; 
    var size = new Size(bounds.Width * scale, bounds.Height * scale); 
    return size; 
} 

Window.Current.Activate();の後、App.xaml.csからこのメソッドを呼び出す必要があります。 OnLaunchedメソッド。

サンプルコードを以下に示します。 ダウンロード プロジェクト全体。

0
Ann Yu