如何在Xamarin中将DPI设备获取到PCL。形式?

时间:2018-11-16 09:33:59

标签: xamarin xamarin.forms

我需要在Xamarin类PCL中获得DPI设备。我不想使用Xamarin.Essentials。如果可以的话,我可以使用本机接口执行此操作吗?

2 个答案:

答案 0 :(得分:5)

在您的pcl中创建一个名为IDisplayInfo的新接口:

public interface IDisplayInfo
{
    int GetDisplayWidth();
    int GetDisplayHeight();
    int GetDisplayDpi();
}

在您的android实现中,添加一个新类:

[assembly: Dependency(typeof(DisplayInfo))]
namespace YourAppNamespace.Droid
{
    public class DisplayInfo : IDisplayInfo
    {
        public int GetDisplayWidth()
        {
            return (int)Android.App.Application.Context.Resources.DisplayMetrics.WidthPixels;
        }

        public int GetDisplayHeight()
        {
            return (int)Android.App.Application.Context.Resources.DisplayMetrics.HeightPixels;
        }

        public int GetDisplayDpi()
        {
            return (int)Android.App.Application.Context.Resources.DisplayMetrics.DensityDpi;
        }
    }
}

,然后在iOS实现中添加相同的类:

[assembly: Dependency(typeof(DisplayInfo))] 
namespace YourNamespace.iOS
{
    public class DisplayInfo : IDisplayInfo
    {
        public int GetDisplayWidth()
        {
            return (int)UIScreen.MainScreen.Bounds.Width;
        }

        public int GetDisplayHeight()
        {
            return (int)UIScreen.MainScreen.Bounds.Height;
        }

        public int GetDisplayDpi()
        {
            return (int)(int)UIScreen.MainScreen.Scale;
        }
    }
}

现在在您的共享代码中,您可以调用

int dpi = DependencyService.Get<IDisplayInfo>().GetDisplayDpi();

,应该很好。请注意,我还添加了获取屏幕宽度和高度的方法,基本上是因为我已经在代码中包含了它们,并且无论如何您迟早都需要它们。

答案 1 :(得分:1)

我有一个static class Core来存储一些定义共享代码的共享内容。 在应用启动时,它将接收值供以后在任何地方使用:

Android MainActivity OnCreate:

    Core.IsAndroid = true;
    Core.DisplayDensity = Resources.DisplayMetrics.Density;

iOS AppDelegate FinishedLaunching:

        Core.IsIOS = true;
        Core.DisplayDensity = (float)(UIScreen.MainScreen.NativeBounds.Width / UIScreen.MainScreen.Bounds.Width);