web-dev-qa-db-ja.com

Xamarin.Formsで画面サイズを取得/検出するにはどうすればよいですか?

IOS用に記述したアプリを書き直そうとしています。 Android=バージョンを書くつもりでしたが、これをXamarin.Formsを使用する機会にした方が良いと思いました。一度に1ページずつ行うと、画面の幅と高さを取得する必要があるページです。Xamarin.FormsのiOSのView.Frame.Widthに相当するものを誰かが知っていますか?

18
dmc

現在、Xamarin.Forms自体からの方法はありませんが、Xamarin.Forms.LabsのPCL互換インターフェイスとして実装されています。これは、NuGetまたはGitHubのソースコードから取得できます。

https://github.com/XForms/Xamarin-Forms-Labs

IDeviceには、情報を含むIDisplayプロパティがあります。 X、Yの高さ、幅、ピクセル密度、およびサイズをインチで計算するための2つの拡張メソッド。

デバイスから情報を取得するためのサンプルページ:

https://github.com/XForms/Xamarin-Forms-Labs/blob/master/samples/Xamarin.Forms.Labs.Sample/Pages/Services/ExtendedDeviceInfoPage.cs

        #region Display information
        var display = device.Display;
        var displayFrame = new Frame();
        if (display != null)
        {
            displayFrame.Content = new StackLayout()
            {
                Children =
                {
                    new Label() { Text = display.ToString() },
                    new Label() { Text = string.Format("Screen width is\t {0:0.0} inches.", display.ScreenWidthInches()) },
                    new Label() { Text = string.Format("Screen height is\t {0:0.0} inches.", display.ScreenHeightInches()) },
                    new Label() { Text = string.Format("Screen diagonal size is\t {0:0.0} inches.", display.ScreenSizeInches()) }
                            }
                        };
        }
        else
        {
            displayFrame.Content = new Label() { TextColor = Color.Red, Text = "Device does not contain display information." };
        }

        stack.Children.Add(displayFrame); 
        #endregion

表示プロパティに関係なく、すべてのプラットフォームで正確なインチごとのフレームを作成します。

https://github.com/XForms/Xamarin-Forms-Labs/blob/master/samples/Xamarin.Forms.Labs.Sample/Pages/Services/AbsoluteLayoutWithDisplayInfoPage.cs

public class AbsoluteLayoutWithDisplayInfoPage : ContentPage
{
    public AbsoluteLayoutWithDisplayInfoPage(IDisplay display)
    {
        this.Title = "Absolute Layout With Display Info";
        var abs = new AbsoluteLayout();
        var inchX = display.WidthRequestInInches(1);
        var inchY = display.HeightRequestInInches(1);
        var originX = display.WidthRequestInInches(display.ScreenWidthInches() / 2);
        var originY = display.HeightRequestInInches(display.ScreenHeightInches() / 2);

        abs.Children.Add(new Label() { Text = "1\"x\"1\" blue frame" });

        abs.Children.Add(new Frame()
            {
                BackgroundColor = Color.Navy,
            },
            new Rectangle(originX - inchX/2, originY - inchY/2, inchX, inchY));

        abs.Children.Add(new Frame()
            {
                BackgroundColor = Color.White
            },
            new Rectangle(originX - inchX/16, originY - inchY/16, inchX/8, inchY/8));

        this.Content = abs;
    }
}

デバイス情報を取得するには、DIリゾルバーを設定するか、静的コンテナーを使用します。 3つのプラットフォームすべてに、静的なCurrentDeviceプロパティを持つシングルトンデバイスコールがあります。

resolverContainer.Register<IDevice>(t => WindowsPhoneDevice.CurrentDevice)
resolverContainer.Register<IDevice>(t => AppleDevice.CurrentDevice)
resolverContainer.Register<IDevice>(t => AndroidDevice.CurrentDevice)
4
SKall

更新:Xamarin.Essentials nugetパッケージをこの目的および他の多くの目的に使用できます。

var width = DeviceDisplay.MainDisplayInfo.Width;
var height = DeviceDisplay.MainDisplayInfo.Height;

古い答え:

Xamarin.Formsで画面の幅と高さを取得し、アプリ内のどこからでもグローバルにアクセスする簡単な方法があります。私はこのようなことをします:

1。 App.csに2つのパブリックメンバーを作成します。

public static class App
{
    public static int ScreenWidth;
    public static int ScreenHeight;
    ...
}

2。 yourMainActivity.cs(Android)またはyourAppDelegate.cs(iOS):

アンドロイド:

protected override void OnCreate(Bundle bundle)
{
    ...

    App.ScreenWidth = (int)Resources.DisplayMetrics.WidthPixels; // real pixels
    App.ScreenHeight = (int)Resources.DisplayMetrics.HeightPixels; // real pixels

    // App.ScreenWidth = (int)(Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density); // device independent pixels
    // App.ScreenHeight = (int)(Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density); // device independent pixels

    ...
}

iOS:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    ...

    App.ScreenWidth = (int)UIScreen.MainScreen.Bounds.Width;
    App.ScreenHeight = (int)UIScreen.MainScreen.Bounds.Height;

    ...
}
31
kaolick

Xamarinフォームを使用している場合は、次のようなポータブルクラスライブラリ(pcl)で現在の画面の幅と高さを確認できます。

幅については、これをpclで使用します。

Application.Current.MainPage.Width

高さについては、pclでこれを行うことができます。

Application.Current.MainPage.Height
6
Tushar patel

レシピ

ScreenSizeという名前の新しいXamarin.Androidアプリケーションを作成します。 Main.axmlを編集して、2つのTextViewが含まれるようにします。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">
    <TextView
        Android:text="Screen Width:"
        Android:textAppearance="?android:attr/textAppearanceLarge"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/screenWidthDp" />
    <TextView
        Android:text="Screen Height:"
        Android:textAppearance="?android:attr/textAppearanceLarge"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/screenHeightDp" />
</LinearLayout>
  1. Activity1.csを編集し、OnCreateのコードを次のように変更します。

    ![ここに画像の説明を入力] [1] private int ConvertPixelsToDp(float pixelValue){var dp =(int)((pixelValue)/Resources.DisplayMetrics.Density); dpを返す; }

  2. アプリケーションを実行します。デバイスによっては、画面の高さと幅が表示されます。次のスクリーンショットは、Galaxy Nexusのものです。

[画像リンク] http://i.stack.imgur.com/TQhba.png

1

アプリファイルでパブリック静的変数を定義します

public static Size ScreenSize;

IOSおよびAndroid=の両方で、Appコンストラクターを呼び出す前に変数を初期化する必要があります。IOSの場合、FinishedLaunchingメソッド

App.ScreenSize = new Size(UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height);

androidの場合、OnCreate関数

            App.ScreenSize = new Xamarin.Forms.Size((int)(Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density), (int)(Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density));
1
sof98789

これを実行しようとしている将来の開発者のために、見ていなかったか見逃していないかを更新するPageクラスはVisualElementを継承します。VisualElementには2つのプロパティがあります(XAMLで使用するためにバインド可能です)。

幅-この要素の現在のレンダリングされた幅を取得します。これは読み取り専用のバインド可能なプロパティです。 Height-この要素の現在のレンダリングされた高さを取得します。これは読み取り専用のバインド可能なプロパティです。

ページのコードビハインドでは、次のようなことをします:

var myWidth = this.Width;
var myHeight = this.Height;

変更されているかどうかを知る必要がある場合は、SizeChangedイベントを使用します。

public MyPage()
{
    SizeChanged += OnSizeChanged;
}

private void OnSizeChanged(object sender, EventArgs e)
{
    var myWidth = this.Width;
    var myHeight = this.Height;
}

ref:Microsoft Docs

0
Duane