Detecting current device in Windows Universal App

2019-02-22 17:27发布

问题:

I am trying out released VS 2013 Update 2 and building a sample Universal Application.

I have created a user control and on both MainPages added GridViews (on Windows Phone and Windows 8).

I want to change some things via code when app is running on Windows Phone.

Is there a way to do something like:

if(<deviceType> == "WindowsPhone")
{
}
else
{
}

回答1:

Normally when building your app, you can use preprocessor directives. When building app for windows phone, VS as default defines WINDOWS_PHONE_APP (take a look at Project Properties -> Build -> Conditional compilation symbols). Therefore anywhere in your code you can put such a statement:

#if WINDOWS_PHONE_APP
    // do when this is compiled as Windows Phone App
#else
    // not for windows phoen
#endif

More information you can get at MSDN.

I would advise to use this approach, hence in most cases you know exactly when you will use specific code for Phone (ARM) or other platform. Of course if you need you can define more symbols for specific build configurations/platforms.

Remarks: Since W10, where you need to check the platform in Run-Time, then you can use ApiInformation class and check if specific type exists in the api. For example like this:

if (ApiInformation.IsApiContractPresent("Windows.Phone.PhoneContract", 1))
   // do code for mobile
else 
   // do code for other


回答2:

That's what worked for me in Universal Windows (Windows 10) project

public static Platform DetectPlatform()
{
    bool isHardwareButtonsAPIPresent =
        ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons");

    if (isHardwareButtonsAPIPresent)
    {
        return Platform.WindowsPhone;
    }
    else
    {
        return Platform.Windows;
    }
}


回答3:

If you want an in-code method of determining the current device, you could try this:

public Windows.Foundation.Metadata.Platform DetectPlatform()
{
    try
    {
        //Calls an unsupported API.
        Windows.Networking.BackgroundTransfer.BackgroundDownloader.RequestUncontrainedDownloadsAsync(null);
    }
    catch (NotImplementedException)
    {
        //The API isn't supported on Windows Phone. Thus, the current platform is Windows Phone.
        return Windows.Foundation.Metadata.Platform.WindowsPhone;
    }
    catch(Exception)
    {
       //Otherwise, this is Windows (desktop/RT).
       return Windows.Foundation.Metadata.Platform.Windows;
    }
}

Source: https://gist.github.com/Amrykid/2fd65ae1815a928fe753



回答4:

OR you can do this

Add this to

App.Xaml.Cs

public static bool IsMobile
{
    get
    {
        var qualifiers = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().QualifierValues;
        return (qualifiers.ContainsKey("DeviceFamily") && qualifiers["DeviceFamily"] == "Mobile");
    }
}


回答5:

From GitHub

public static class DeviceTypeHelper
{
    public static DeviceFormFactorType GetDeviceFormFactorType()
    {
        switch (AnalyticsInfo.VersionInfo.DeviceFamily)
        {
            case "Windows.Mobile":
                return DeviceFormFactorType.Phone;
            case "Windows.Desktop":
                return UIViewSettings.GetForCurrentView().UserInteractionMode == UserInteractionMode.Mouse
                    ? DeviceFormFactorType.Desktop
                    : DeviceFormFactorType.Tablet;
            case "Windows.Universal":
                return DeviceFormFactorType.IoT;
            case "Windows.Team":
                return DeviceFormFactorType.SurfaceHub;
            default:
                return DeviceFormFactorType.Other;
        }
    }
}

public enum DeviceFormFactorType
{
    Phone,
    Desktop,
    Tablet,
    IoT,
    SurfaceHub,
    Other
}

https://gist.githubusercontent.com/wagonli/40d8a31bd0d6f0dd7a5d/raw/f6175de5fcad40cc257edc3748c0e349495d17f6/DeviceTypeHelper.cs



回答6:

It's a workaround

       //PC customization
                if(ApiInformation.IsTypePresent("Windows.UI.ViewManagement.ApplicationView"))
                {
                }

                //Mobile customization
                if(ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar"))
                {
                }