Aracılığıyla paylaş


Xamarin.Forms DualScreenInfo yardımcı sınıfı

DualScreenInfo sınıfı, görünümünüzün hangi bölmede olduğunu, ne kadar büyük olduğunu, cihazın hangi duruşta olduğunu, menteşenin açısını ve daha fazlasını belirlemenizi sağlar.

DualScreenInfo'yi yapılandırma

Uygulamanızda çift ekranlı düzen oluşturmak için şu yönergeleri izleyin:

  1. NuGet'i eklemek ve Android MainActivity sınıfını yapılandırmak için başlangıç yönergelerini izleyin.
  2. Sınıf dosyanıza ekleyin using Xamarin.Forms.DualScreen; .
  3. Uygulamanızda sınıfını DualScreenInfo.Current kullanın.

Properties

  • SpanningBounds , iki ekrana yayıldığında, her görünür alanın sınırlarını gösteren iki dikdörtgen döndürür. Pencere yayılmazsa, bu boş bir dizi döndürür.
  • HingeBounds menteşenin ekrandaki konumunu gösterir.
  • IsLandscape cihazın yatay olup olmadığını gösterir. Yerel yönlendirme API'leri bir uygulama yayıldığında yönlendirmeyi doğru raporlamadığından bu kullanışlıdır.
  • SpanMode düzenin uzun, geniş veya tek bölme modunda olup olmadığını gösterir.

Buna ek olarak, herhangi bir özellik değiştiğinde PropertyChangedHingeAngleChanged olay tetikler ve menteşe açısı değiştiğinde olay tetikler.

Android ve UWP'de yoklama menteşesi açısı

Android ve UWP platform projelerinden erişirken DualScreenInfo aşağıdaki yöntem kullanılabilir:

  • GetHingeAngleAsync cihaz menteşesinin geçerli açısını alır. Simülatörü kullanırken, HingeAngle Basınç sensörü değiştirilerek ayarlanabilir.

Bu yöntem, Android ve UWP'de özel işleyicilerden çağrılabilir. Aşağıdaki kodda bir Android özel işleyici örneği gösterilmektedir:

public class HingeAngleLabelRenderer : Xamarin.Forms.Platform.Android.FastRenderers.LabelRenderer
{
    System.Timers.Timer _hingeTimer;
    public HingeAngleLabelRenderer(Context context) : base(context)
    {
    }

    async void OnTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        if (_hingeTimer == null)
            return;

        _hingeTimer.Stop();
        var hingeAngle = await DualScreenInfo.Current.GetHingeAngleAsync();

        Device.BeginInvokeOnMainThread(() =>
        {
            if (_hingeTimer != null)
                Element.Text = hingeAngle.ToString();
        });

        if (_hingeTimer != null)
            _hingeTimer.Start();
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);

        if (_hingeTimer == null)
        {
            _hingeTimer = new System.Timers.Timer(100);
            _hingeTimer.Elapsed += OnTimerElapsed;
            _hingeTimer.Start();
        }
    }

    protected override void Dispose(bool disposing)
    {
        if (_hingeTimer != null)
        {
            _hingeTimer.Elapsed -= OnTimerElapsed;
            _hingeTimer.Stop();
            _hingeTimer = null;
        }

        base.Dispose(disposing);
    }
}

Uygulama pencerenizde DualScreenInfo'ya erişme

Aşağıdaki kod, uygulama pencereniz için nasıl erişim yapılacağını DualScreenInfo gösterir:

DualScreenInfo currentWindow = DualScreenInfo.Current;

// Retrieve absolute position of the hinge on the screen
var hingeBounds = currentWindow.HingeBounds;

// check if app window is spanned across two screens
if(currentWindow.SpanMode == TwoPaneViewMode.SinglePane)
{
    // window is only on one screen
}
else if(currentWindow.SpanMode == TwoPaneViewMode.Tall)
{
    // window is spanned across two screens and oriented top-bottom
}
else if(currentWindow.SpanMode == TwoPaneViewMode.Wide)
{
    // window is spanned across two screens and oriented side-by-side
}

// Detect if any of the properties on DualScreenInfo change.
// This is useful to detect if the app window gets spanned
// across two screens or put on only one  
currentWindow.PropertyChanged += OnDualScreenInfoChanged;

Düzenlere DualScreenInfo uygulama

sınıfı, DualScreenInfo düzen alabilen bir oluşturucuya sahiptir ve cihazlara göre düzen hakkında size iki ekran bilgi verir:

<Grid x:Name="grid" ColumnSpacing="0">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding Column1Width}" />
        <ColumnDefinition Width="{Binding Column2Width}" />
        <ColumnDefinition Width="{Binding Column3Width}" />
    </Grid.ColumnDefinitions>
    <Label FontSize="Large"
           VerticalOptions="Center"
           HorizontalOptions="End"
           Text="I should be on the left side of the hinge" />
    <Label FontSize="Large"
           VerticalOptions="Center"
           HorizontalOptions="Start"
           Grid.Column="2"
           Text="I should be on the right side of the hinge" />
</Grid>
public partial class GridUsingDualScreenInfo : ContentPage
{
    public DualScreenInfo DualScreenInfo { get; }
    public double Column1Width { get; set; }
    public double Column2Width { get; set; }
    public double Column3Width { get; set; }

    public GridUsingDualScreenInfo()
    {
        InitializeComponent();
        DualScreenInfo = new DualScreenInfo(grid);
        BindingContext = this;
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        DualScreenInfo.PropertyChanged += OnInfoPropertyChanged;
        UpdateColumns();
    }

    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        DualScreenInfo.PropertyChanged -= OnInfoPropertyChanged;
    }

    void UpdateColumns()
    {
        // Check if grid is on two screens
        if (DualScreenInfo.SpanningBounds.Length > 0)
        {
            // set the width of the first column to the width of the layout
            // that's on the left screen
            Column1Width = DualScreenInfo.SpanningBounds[0].Width;

            // set the middle column to the width of the hinge
            Column2Width = DualScreenInfo.HingeBounds.Width;

            // set the width of the third column to the width of the layout
            // that's on the right screen
            Column3Width = DualScreenInfo.SpanningBounds[1].Width;
        }
        else
        {
            Column1Width = 100;
            Column2Width = 0;
            Column3Width = 100;
        }

        OnPropertyChanged(nameof(Column1Width));
        OnPropertyChanged(nameof(Column2Width));
        OnPropertyChanged(nameof(Column3Width));

    }

    void OnInfoPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        UpdateColumns();
    }
}

Aşağıdaki ekran görüntüsünde ortaya çıkan düzen gösterilmektedir:

İki Ekranda Kılavuz Konumlandırma