使用Xamarin表单获取设备属性?

使用Xamarin表单获取设备属性?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我正在使用xamarin表单设计一个跨平台应用程序。 每个页面/视图/表单都是从代码隐藏设计的。现在我想读取用户使用的设备的高度和宽度。基于这些值,我想放置一些页眉和页脚。在Xamarin Forms Labs中,有一些类和示例可用于获取设备的屏幕信息,如您所需的内容 关于实现此功能和获取所需的设备对象,还有一些进一步的说明 另一方面,如果您只想放置页眉和页脚,那么为什么不使用内置的Xamarin.Forms控件来自动展开控件和布局等,这些控件将根据用户设备的屏幕自动调整 我得到的印象是,您希望

我正在使用xamarin表单设计一个跨平台应用程序。
每个页面/视图/表单都是从代码隐藏设计的。现在我想读取用户使用的设备的高度和宽度。基于这些值,我想放置一些页眉和页脚。

在Xamarin Forms Labs中,有一些类和示例可用于获取设备的屏幕信息,如您所需的内容

关于实现此功能和获取所需的设备对象,还有一些进一步的说明

另一方面,如果您只想放置页眉和页脚,那么为什么不使用内置的Xamarin.Forms控件来自动展开控件和布局等,这些控件将根据用户设备的屏幕自动调整

我得到的印象是,您希望采用一种绝对布局方法,自己指定值?如果是的话,真的没有必要。特别是对于版面的页眉和页脚?

为了获得Xamarin.Forms解决方案中的屏幕宽度(或高度),我通常添加以下几行代码:

  • 在共享代码中定义公共静态属性,最好在
    App.cs
    中:

    静态公共int屏幕宽度;
    
  • AppDelegate.cs
    中的
    FinishedLaunching
    开始时为iOS初始化它:

    App.ScreenWidth=(int)UIScreen.MainScreen.Bounds.Width;
    
  • MainActivity.cs的
    OnCreate
    中为Android初始化它(如上所述)

    App.ScreenWidth=(int)(Resources.DisplayMetrics.WidthPixels/Resources.DisplayMetrics.Density);
    
    (除以密度,这将产生与设备无关的像素。)

  • 我没有使用Windows Phone,但应该有一个等效的命令。当然,获得屏幕高度也同样有效


    现在,您可以在代码中的任何位置访问
    App.ScreenWidth

    我在viewmodel中这样做,效果非常好。您可以在代码隐藏中执行同样的操作

    public SomeViewModel
    {
        private double width;
        private double Width
        {
            get { return width; }
            set
            {
                width = value;
                if (value != 0 && value != -1)
                {
                    // device width found, set other properties
                    SetProperties();
                }
            }
        }
    
        void SetProperties()
        {
            // use value of Width however you need
        }
    
        public SomeViewModel()
        {
             Width = Application.Current.MainPage.Width;
             var fireAndForget = Task.Run(GetWidthAsync);
        }
    
        public async Task GetWidthAsync()
        {
            while (Width == -1 || Width == 0)
            {
                await Task.Delay(TimeSpan.FromMilliseconds(1)).ConfigureAwait(false);
                // MainPage is the page that is using this ViewModel
                Width = Application.Current.MainPage.Width;
            }
        }
    }
    

    如果您想在表单的标签中显示宽度,以便使用绑定进行测试,请不要忘记将属性从private更改为public。

    如果我们处于横向模式,我会添加宽度和高度之间的比较