Get Screen Resolution in Win10 UWP App

2019-01-07 10:57发布

问题:

As an UWP App runs in window mode on common desktop systems the "old" way of getting the screen resolution won't work anymore.

Old Resolution with Window.Current.Bounds was like shown in.

Is there another way to get the resolution of the (primary) display?

回答1:

To improve the other answers even a bit more, the following code also takes care of scaling factors, e.g. for my 200% for my Windows display (correctly returns 3200x1800) and 300% of the Lumia 930 (1920x1080).

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

As stated in the other answers, this only returns the correct size on Desktop before the size of root frame is changed.



回答2:

Call this method anywhere, anytime (tested in mobile/desktop App):

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


回答3:

Okay so the Answer from Juan Pablo Garcia Coello lead me to the Solution - Thanks for that!

You can use

var bounds = ApplicationView.GetForCurrentView().VisibleBounds;

but you must call it before the windows is displayed in my case right after

Window.Current.Activate();

is a good place. At this time you will get the bounds of the window on which your app will appear.

Thanks a lot for help me solving it :)

Regards Alex



回答4:

The more simple way:

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

This does not depends on current view size. At any time it returns real screen resolution.



回答5:

The only way I found is inside the constructor of a Page:

 public MainPage()
    {
        this.InitializeComponent();

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

I have not tested in Windows 10 Mobile, when the new release appears I will test that.



回答6:

Use this method to get the screen size:

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

You should call this method from App.xaml.cs, after Window.Current.Activate(); in OnLaunched method.

Here's the sample code and you can download the full project.



回答7:

Just set a name for main Grid or Page and call its width or height for an element you want:

Element.Height = PagePane.Height;
Element.width = PagePane.Width;

it's the easiest way you can use!