Xamarin Formsプロジェクトを1つ作成していますが、デバイスごとに現在の画面幅を見つけることができませんでした。
Android and iosでそれを行う方法を知っていますが、ポータブルで幅を見つける方法が必要です。
これを試すことができますApplication.Current.MainPage.Width
私の場合、これは機能し、ポータブルプロジェクト自体でデバイスの幅を見つけることができます。
共通コード(App.xaml.cs内)
public static int ScreenHeight {get; set;}
public static int ScreenWidth {get; set;}
Androidパーツ(MainActivity.cs内、OnCreateメソッド内)
App.ScreenHeight = (int) (Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density);
App.ScreenWidth = (int) (Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density);
iOSパーツ(AppDelegate.cs内、FinishedLaunchingメソッド内)
App.ScreenHeight = (int)UIScreen.MainScreen.Bounds.Height;
App.ScreenWidth = (int)UIScreen.MainScreen.Bounds.Width;
そのため、App.ScreenHeightとApp.ScreenWidthは、アプリの起動時に初期化され、共通コード内のどこででも使用できるようになります。
私はそれが古いスレッドであることを知っていますが、最近 Xamarin.Essentials NuGet pakageがリリースされたことを言及する価値があり、そこにこのタスクを処理する有用なクラスDeviceDisplay
があります。
ドキュメントは here にあります。
使用例:
// Get Metrics
var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
// Orientation (Landscape, Portrait, Square, Unknown)
var orientation = mainDisplayInfo.Orientation;
// Rotation (0, 90, 180, 270)
var rotation = mainDisplayInfo.Rotation;
// Width (in pixels)
var width = mainDisplayInfo.Width;
// Height (in pixels)
var height = mainDisplayInfo.Height;
// Screen density
var density = mainDisplayInfo.Density;
ContentPageにいるときにWidthプロパティを使用できます。例えば、
protected override void OnAppearing()
{
base.OnAppearing();
double w = this.Width;
}
これは、レイアウト段階で設定されることに注意してください。そのため、ページが初期化された後にのみ使用できます。それ以外の場合は-1です。
https://developer.xamarin.com/api/property/Xamarin.Forms.VisualElement.Width/
別のアプローチは、ページに「OnSizeAllocated」オーバーライドを使用し、ユーザーの画面の変更に応じて高さと幅を取得することです。静的クラスを作成して、画面が変更されるたびに画面の高さと幅を設定し、必要に応じてこのクラスからそれらにアクセスできます。
デバイスディメンションを設定およびアクセスする静的クラス:
public static class ScreenDimensions
{
public static double Height { get; set; }
public static double Width { get; set; }
}
画面サイズを取得するためにオーバーライドします。
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
ScreenDimensions.Height = height;
ScreenDimensions.Width = width;
}
共有コードで静的構造体を作成するので、画面の幅/高さの値に簡単にアクセスできます(xAMLでバインドを行うこともできます)
アプリの名前空間内の構造体(App.xaml.csなど):
using System;
using Xamarin.Forms;
namespace YourAppName
{
...
public struct Constant
{
public static double ScreenWidth = Application.Current.MainPage.Width;
public static double ScreenHeight = Application.Current.MainPage.Height;
}
}
c#で画面幅を取得する:
var labelWidth = Constant.ScreenHeight * 0.2;
// then do something with labelWidth
XAMLで画面幅を取得する:
<Label Text="Text with insane font size" FontSize="{Binding Source={x:Static local:Constant.ScreenWidth}}"/>
最良の方法はxamarin.forms.Device情報を使用することだと思います。
Size size = Device.Info.PixelScreenSize;
if (size.Width <= 720 && size.Height <= 1280)
{
stkLayoutTop.Margin = new Thickness(5, 30, 10, 0);
}
else
{
stkLayoutTop.Margin = new Thickness(5, 50, 10, 0);
}