首页 > 解决方案 > 如何从 .xaml 文件中的 Xamarin 表单获取跨平台应用程序中的可用屏幕大小值?

问题描述

在我正在开发的应用程序中,我希望有一个相对的 TranslationY 值,以便在我的应用程序上拥有一个不会覆盖整个屏幕并且可以在输入时使用的响应式控制中心。所以我写了下面的代码,但是 TranslationY 值不是相对的,并且在键入键盘时会覆盖控制中心。有没有办法获取屏幕可用高度的数量并给 TranslationY 一个比率。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:map="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps"
             xmlns:pan ="http://xamarin.com/schemas/2014/forms"  
             xmlns:yummy="clr-namespace:Xamarin.Forms.PancakeView;assembly=Xamarin.Forms.PancakeView"
             mc:Ignorable="d"
             x:Class="GreenPath.MainPage">

    <Grid>
        <StackLayout VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
            <map:Map MapType="Street" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"/>
        </StackLayout>
        <yummy:PancakeView CornerRadius="25,25,0,0" Opacity="0.8" HorizontalOptions="FillAndExpand" BackgroundColor="White" TranslationY="550">
            <StackLayout VerticalOptions="FillAndExpand" Orientation="Vertical" Margin="5">
                <Image Source="down.png" VerticalOptions="Center" HorizontalOptions="Center" Scale="1"/>
                <Label  Text="X" TextColor="#3E454F" FontSize="40" FontFamily="segoeui.ttf" Margin="10,0"/>
                <SearchBar FontFamily="segoeui.ttf" Text="X" VerticalTextAlignment="Center" VerticalOptions="Fill" HorizontalTextAlignment="Start" IsReadOnly="True" HorizontalOptions="Fill" SearchButtonPressed="SearchBar_SearchButtonPressed" PlaceholderColor="#3E454F" TextColor="#3E454F" CancelButtonColor="#3E454F" Visual="Material" Keyboard="Default" Placeholder="Search a location" IsEnabled="True"/>
                <Label Text="X" FontFamily="segoeui.ttf" FontSize="25" VerticalOptions="Center" TextColor="#3E454F" Margin="10,0"/>
                <Grid Grid.Row="1" ColumnSpacing="0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Image Source="add.png" VerticalOptions="Center" HorizontalOptions="Center" Scale="1" Grid.Column="0" />
                    <Image Source="add.png" VerticalOptions="Center" HorizontalOptions="Center" Scale="1" Grid.Column="1" />
                    <Image Source="add.png" VerticalOptions="Center" HorizontalOptions="Center" Scale="1" Grid.Column="2" />
                    <Image Source="add.png" VerticalOptions="Center" HorizontalOptions="Center" Scale="1" Grid.Column="3" />
                    <Image Source="add.png" VerticalOptions="Center" HorizontalOptions="Center" Scale="1" Grid.Column="4" />
                </Grid>
            </StackLayout>
        </yummy:PancakeView>

    </Grid>

</ContentPage>

标签: c#xamlxamarinmobilexamarin.forms

解决方案


在 app.xaml.cs

放:

public static double DeviceWidth, DeviceHeight;

对于安卓:

 #region For screen Height & Width  
 var pixels = Resources.DisplayMetrics.WidthPixels;
 var scale = Resources.DisplayMetrics.Density;
 var dps = (double)((pixels - 0.5f) / scale);
 var ScreenWidth = (int)dps;
 App.DeviceWidth = ScreenWidth;
 pixels = Resources.DisplayMetrics.HeightPixels;
 dps = (double)((pixels - 0.5f) / scale);
 var ScreenHeight = (int)dps;
 App.DeviceHeight = ScreenHeight;
 #endregion

对于 iOS:

 #region For Screen Height & Width
  App.DeviceWidth = (int)UIScreen.MainScreen.Bounds.Width;
  App.DeviceHeight = (int)UIScreen.MainScreen.Bounds.Height;
  #endregion

所以你可以像这样在你的 xaml 中使用:

double _deviceWidth = App.DeviceWidth;

推荐阅读