Xamarin.Forms Pomocná třída DualScreenInfo
Třída DualScreenInfo
umožňuje určit, na kterém podokně je vaše zobrazení, jak velké je, v jakém stavu je zařízení, úhel závěsu a další.
Konfigurace DualScreenInfo
Podle těchto pokynů vytvořte v aplikaci rozložení se dvěma obrazovkami:
- Podle pokynů začínáme přidejte NuGet a nakonfigurujte třídu Androidu
MainActivity
. - Přidejte
using Xamarin.Forms.DualScreen;
do souboru předmětu. DualScreenInfo.Current
Použijte třídu v aplikaci.
Vlastnosti
SpanningBounds
vrátí, když je rozložený přes dvě obrazovky, dva obdélníky označující hranice každé viditelné oblasti. Pokud okno není rozložené, vrátí se prázdné pole.HingeBounds
určuje pozici závěsu na obrazovce.IsLandscape
označuje, jestli je zařízení na šířku. To je užitečné, protože nativní rozhraní API pro orientaci neoznamují správně orientaci, když je aplikace rozložená.SpanMode
označuje, jestli je rozložení v režimu vysokého, širokého nebo jednoduchého podokna.
Událost se PropertyChanged
navíc aktivuje, když se změní všechny vlastnosti, a HingeAngleChanged
událost se aktivuje, když se změní úhel závěsu.
Úhel závěsu hlasování na Androidu a UPW
Následující metoda je k dispozici při přístupu k DualScreenInfo
projektům platformy Android a UPW:
GetHingeAngleAsync
načte aktuální úhel závěsu zařízení. Při použití simulátoru PantAngle lze nastavit úpravou senzoru tlaku.
Tuto metodu lze vyvolat z vlastních rendererů v Androidu a UPW. Následující kód ukazuje příklad vlastního rendereru pro Android:
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);
}
}
Přístup k DualScreenInfo v okně aplikace
Následující kód ukazuje, jak získat přístup k DualScreenInfo
oknem aplikace:
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;
Použití DualScreenInfo pro rozložení
Třída DualScreenInfo
má konstruktor, který může mít rozložení a poskytne vám informace o rozložení vzhledem k zařízením dvě obrazovky:
<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();
}
}
Následující snímek obrazovky ukazuje výsledné rozložení: