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:
- NuGet'i eklemek ve Android
MainActivity
sınıfını yapılandırmak için başlangıç yönergelerini izleyin. - Sınıf dosyanıza ekleyin
using Xamarin.Forms.DualScreen;
. - 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 PropertyChanged
HingeAngleChanged
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: