Xamarin.Forms Cihaz sınıfı

Örnek indir Örneği indirin

DeviceSınıfı, geliştiricilerin her platform temelinde düzen ve işlevselliği özelleştirmesine yardımcı olacak bir dizi özellik ve yöntem içerir.

Belirli donanım türlerinde ve boyutlarda kodu hedeflemek için yöntemlere ve özelliklere ek olarak, Device sınıfı arka plan iş parçacıklarında UI denetimleriyle etkileşim kurmak için kullanılabilecek yöntemleri içerir. Daha fazla bilgi için bkz. arka plan iş parçacıklarında Kullanıcı arabirimiyle etkileşim kurma.

Platforma özgü değerler sağlama

Xamarin.Forms2.3.4 ' den önce, uygulamanın üzerinde çalıştığı platform, Xamarin.Forms "Data-LinkType =" Absolute-path ">özelliğini _Device_OS Xamarin_Forms inceleyerek Device.OS ve Xamarin_Forms _TargetPlatform_iOS" Data-linktype = "absolute-path" >, Xamarin_Forms _TargetPlatform_Android "Data-LinkType =" mutlak yol ">TargetPlatform.iOSDevice.OSTargetPlatform.Android , Xamarin_Forms _TargetPlatform_WinPhone" Data-LinkType = "Absolute-path" >tarafından elde edilebilir. TargetPlatform.WinPhone ve _TargetPlatform_Windows "Data-LinkType =" absolute-path ">TargetPlatform.Windows numaralandırma değerlerini Xamarin_Forms. Benzer şekilde, Device.OnPlatform bir denetime platforma özgü değerler sağlamak için Xamarin_Forms _Device_OnPlatform_System_Action_System_Action_System_Action_System_Action_ "Data-LinkType =" absolute-path ">aşırı yüklemeleri kullanılabilir.

Ancak, Xamarin.Forms 2.3.4 Bu API 'lerin kullanım dışı bırakılmış ve değiştirilmiş olduğundan. DeviceSınıfı artık platformları tanımlayan genel dize sabitleri içerir – Device.iOS , Device.Android , Device.WinPhone (kullanım dışı), Device.WinRT (kullanım dışı), Device.UWP ve Device.macOS . Benzer şekilde, Xamarin_Forms _Device_OnPlatform_System_Action_System_Action_System_Action_System_Action_ "Data-LinkType =" mutlak yol ">Device.OnPlatform aşırı yüklemeleri OnPlatform ve On API 'leriyle değiştirilmiştir.

C# ' de, platforma özgü değerler, switch Xamarin_Forms switch _Device_RuntimePlatform "Data-LinkType =" Absolute-path ">Device.RuntimePlatform özelliği ve sonra case gerekli platformlar için deyimler sağlanması yoluyla sağlanabilir.

double top;
switch (Device.RuntimePlatform)
{
  case Device.iOS:
    top = 20;
    break;
  case Device.Android:
  case Device.UWP:
  default:
    top = 0;
    break;
}
layout.Margin = new Thickness(5, top, 5, 0);

OnPlatformVe On sınıfları xaml 'de aynı işlevselliği sağlar:

<StackLayout>
  <StackLayout.Margin>
    <OnPlatform x:TypeArguments="Thickness">
      <On Platform="iOS" Value="0,20,0,0" />
      <On Platform="Android, UWP" Value="0,0,0,0" />
    </OnPlatform>
  </StackLayout.Margin>
  ...
</StackLayout>

OnPlatformSınıfı, x:TypeArguments hedef türle eşleşen bir öznitelik ile örneğinin oluşturulması gereken bir genel sınıftır. OnSınıfında, Xamarin_Forms On _On_Platform "Data-LinkType =" Absolute-path ">Platform özniteliği tek bir string değer veya virgülle ayrılmış birden çok değer kabul edebilir string .

Önemli

Sınıfta yanlış bir Platform öznitelik değeri sağlanması On hataya neden olmaz. Bunun yerine, kod uygulanan platforma özgü değer olmadan yürütülür.

Alternatif olarak, OnPlatform biçimlendirme UZANTıSı xaml 'de, UI görünümünü platform başına temelinde özelleştirmek için kullanılabilir. Daha fazla bilgi için bkz. Onplatform Işaretleme uzantısı.

Cihaz. Idom

Device.IdiomÖzelliği, uygulamanın üzerinde çalıştığı cihaza bağlı olarak düzenleri veya işlevleri değiştirmek için kullanılabilir. TargetIdiomSabit listesi aşağıdaki değerleri içerir:

  • Telefon : iPhone, iPod touch ve Android cihazlar 600 dıps ^ değerinden daha dar
  • Tablet – iPad, Windows cihazları ve Android cihazları 600 dıps 'den daha geniş
  • masaüstü – yalnızca Windows 10 masaüstü bilgisayarlarda UWP uygulamalarında döndürüldü ( Continuum senaryolarında da dahil olmak üzere mobil Windows cihazlarda döner)
  • TV – Tizen TV cihazları
  • Watch : Tizen Watch cihazları
  • Desteklenmeyen – kullanılmıyor

^ DIP fiziksel piksel sayısı olmak üzere değil

Özelliği, aşağıdaki Idiom gibi daha büyük ekranlardan faydalanan düzenler oluşturmak için özellikle yararlıdır:

if (Device.Idiom == TargetIdiom.Phone) {
    // layout views vertically
} else {
    // layout views horizontally for a larger display (tablet or desktop)
}

OnIdiomSınıfı, XAML 'de aynı işlevselliği sağlar:

<StackLayout>
    <StackLayout.Margin>
        <OnIdiom x:TypeArguments="Thickness">
            <OnIdiom.Phone>0,20,0,0</OnIdiom.Phone>
            <OnIdiom.Tablet>0,40,0,0</OnIdiom.Tablet>
            <OnIdiom.Desktop>0,60,0,0</OnIdiom.Desktop>
        </OnIdiom>
    </StackLayout.Margin>
    ...
</StackLayout>

OnIdiomSınıfı, x:TypeArguments hedef türle eşleşen bir öznitelik ile örneğinin oluşturulması gereken bir genel sınıftır.

Alternatif olarak, OnIdiom biçimlendirme uzantısı, uygulamanın üzerinde çalıştığı cihazın idvünün temel alınarak Kullanıcı arabirimi görünümünü özelleştirmek IÇIN xaml 'de kullanılabilir. Daha fazla bilgi için bkz. Onidom Işaretleme uzantısı.

Device. FlowDirection

Xamarin_Forms _VisualElement_FlowDirection "Data-LinkType =" Absolute-path ">Device.FlowDirection değeri, FlowDirection cihaz tarafından kullanılan geçerli akış yönünü temsil eden bir sabit listesi değeri alır. Flow yönü, sayfadaki kullanıcı arabirimi öğelerinin gözle tarandığı yönlerdir. Numaralandırma değerleri şunlardır:

XAML 'de, Xamarin_Forms _VisualElement_FlowDirection "Data-LinkType =" Absolute-path ">Device.FlowDirection değeri, x:Static biçimlendirme uzantısı kullanılarak alınabilir:

<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />

C# ' deki denk kod şu şekilde olur:

this.FlowDirection = Device.FlowDirection;

Akış yönü hakkında daha fazla bilgi için bkz. sağdan sola yerelleştirme.

Device. Styles

Özelliği , bazı denetimlerin (örn Label .) özelliğine uygulanabilen yerleşik stil tanımları içerir Style . Kullanılabilir stiller şunlardır:

  • BodyStyle
  • CaptionStyle
  • ListItemDetailTextStyle
  • ListItemTextStyle
  • Alt başlık stili
  • Başlık stili

Device. GetNamedSize

GetNamedSize , C# kodunda ayarlandığında kullanılabilir FontSize :

myLabel.FontSize = Device.GetNamedSize (NamedSize.Small, myLabel);
someLabel.FontSize = Device.OnPlatform (
      24,         // hardcoded size
      Device.GetNamedSize (NamedSize.Medium, someLabel),
      Device.GetNamedSize (NamedSize.Large, someLabel)
);

Device. GetNamedColor

Xamarin.Forms 4,6, adlandırılmış renkler için destek sunar. Adlandırılmış renk, cihazda hangi sistem modunun (örneğin, hafif veya koyu) etkin olduğuna bağlı olarak farklı bir değere sahip bir renktir. Android 'de, adlandırılmış renklere R. Color sınıfı aracılığıyla erişilir. İOS 'ta, adlandırılmış renkler sistem renkleriolarak adlandırılır. Evrensel Windows Platformu, adlandırılmış renklere XAML teması kaynaklarıdenir.

GetNamedColorYöntemi, Android, iOS ve UWP 'de adlandırılmış renkleri almak için kullanılabilir. Yöntemi bir string bağımsız değişken alır ve şunu döndürür Color :

// Retrieve an Android named color
Color color = Device.GetNamedColor(NamedPlatformColor.HoloBlueBright);

Color.Default , bir renk adı bulunamadığında veya GetNamedColor Desteklenmeyen bir platformda çağrıldığında döndürülür.

Not

GetNamedColorYöntemi Color bir platforma özgü bir değer döndürdüğünden, genellikle Xamarin_Forms GetNamedColor _Device_RuntimePlatform "Data-LinkType =" absolute-path ">özelliği ile birlikte kullanılmalıdır Device.RuntimePlatform .

NamedPlatformColorSınıfı, Android, iOS ve UWP için adlandırılmış renkleri tanımlayan sabitleri içerir:

Android iOS Mac OS UWP
BackgroundDark Label AlternateSelectedControlTextColor SystemAltHighColor
BackgroundLight Link ControlAccent SystemAltLowColor
Black OpaqueSeparator ControlBackgroundColor SystemAltMediumColor
DarkerGray PlaceholderText ControlColor SystemAltMediumHighColor
HoloBlueBright QuaternaryLabel DisabledControlTextColor SystemAltMediumLowColor
HoloBlueDark SecondaryLabel FindHighlightColor SystemBaseHighColor
HoloBlueLight Separator GridColor SystemBaseLowColor
HoloGreenDark SystemBlue HeaderTextColor SystemBaseMediumColor
HoloGreenLight SystemGray HighlightColor SystemBaseMediumHighColor
HoloOrangeDark SystemGray2 KeyboardFocusIndicatorColor SystemBaseMediumLowColor
HoloOrangeLight SystemGray3 Label SystemChromeAltLowColor
HoloPurple SystemGray4 LabelColor SystemChromeBlackHighColor
HoloRedDark SystemGray5 Link SystemChromeBlackLowColor
HoloRedLight SystemGray6 LinkColor SystemChromeBlackMediumColor
TabIndicatorText SystemGreen PlaceholderText SystemChromeBlackMediumLowColor
Transparent SystemIndigo PlaceholderTextColor SystemChromeDisabledHighColor
White SystemOrange QuaternaryLabel SystemChromeDisabledLowColor
WidgetEditTextDark SystemPink QuaternaryLabelColor SystemChromeHighColor
SystemPurple SecondaryLabel SystemChromeLowColor
SystemRed SecondaryLabelColor SystemChromeMediumColor
SystemTeal SelectedContentBackgroundColor SystemChromeMediumLowColor
SystemYellow SelectedControlColor SystemChromeWhiteColor
TertiaryLabel SelectedControlTextColor SystemListLowColor
SelectedMenuItemTextColor SystemListMediumColor
SelectedTextBackgroundColor
SelectedTextColor
Separator
SeparatorColor
ShadowColor
SystemBlue
SystemGray
SystemGreen
SystemIndigo
SystemOrange
SystemPink
SystemPurple
SystemRed
SystemTeal
SystemYellow
TertiaryLabel
TertiaryLabelColor
TextBackgroundColor
TextColor
UnderPageBackgroundColor
UnemphasizedSelectedContentBackgroundColor
UnemphasizedSelectedTextBackgroundColor
UnemphasizedSelectedTextColor
WindowBackgroundColor
WindowFrameTextColor

Cihaz. StartTimer

DeviceSınıfı ayrıca StartTimerXamarin.Forms , bir .NET Standard kitaplığı dahil olmak üzere ortak kodda çalıştırılan zamana bağlı görevleri tetiklemenin basit bir yolunu sağlayan bir yöntemi de vardır. TimeSpanAralığı ayarlamak için geçirin ve true geçerli çağrıdan sonra süreölçeri çalıştırmak veya durdurmak için geri döndürün false .

Device.StartTimer (new TimeSpan (0, 0, 60), () =>
{
    // do something every 60 seconds
    return true; // runs again, or false to stop
});

Zamanlayıcının içindeki kod Kullanıcı arabirimiyle etkileşime geçtiğinde (örn. metin Label veya bir uyarı görüntüleme gibi) bir ifadenin içinde yapılmalıdır BeginInvokeOnMainThread (aşağıya bakın).

Not

System.Timers.TimerVe System.Threading.Timer sınıfları yöntemini kullanmanın alternatifleri .NET Standard Device.StartTimer .

Arka plan iş parçacıklarında Kullanıcı arabirimiyle etkileşim kurma

iOS, Android ve Evrensel Windows Platformu dahil çoğu işletim sistemi, kullanıcı arabirimiyle ilgili kod için tek iş parçacığı modeli kullanır. Bu iş parçacığı genellikle ana iş parçacığı veya Kullanıcı arabirimi iş parçacığıolarak adlandırılır. Bu modelin bir sonucu, Kullanıcı Arabirimi öğelerine erişen tüm kodların uygulamanın ana iş parçacığında çalıştırılması gerekir.

Uygulamalar bazen bir Web hizmetinden veri alma gibi uzun süre çalışan işlemler gerçekleştirmek için arka plan iş parçacıklarını kullanır. Arka plan iş parçacığında çalışan kodun kullanıcı arabirimi öğelerine erişmesi gerekiyorsa, bu kodu ana iş parçacığında çalıştırması gerekir.

DeviceSınıfı, static arka plan iş parçacıklarında Kullanıcı arabirimi öğeleriyle etkileşim kurmak için kullanılabilecek aşağıdaki yöntemleri içerir:

Yöntem Bağımsız değişkenler Döndürülenler Amaç
BeginInvokeOnMainThread Action void ActionAna iş parçacığında bir çağırır ve tamamlanmasını beklemez.
InvokeOnMainThreadAsync<T> Func<T> Task<T> Func<T>Ana iş parçacığında bir çağırır ve tamamlanmasını bekler.
InvokeOnMainThreadAsync Action Task ActionAna iş parçacığında bir çağırır ve tamamlanmasını bekler.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Func<Task<T>>Ana iş parçacığında bir çağırır ve tamamlanmasını bekler.
InvokeOnMainThreadAsync Func<Task> Task Func<Task>Ana iş parçacığında bir çağırır ve tamamlanmasını bekler.
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> SynchronizationContextAna iş parçacığı için öğesini döndürür.

Aşağıdaki kod, yönteminin kullanımına ilişkin bir örnek gösterir BeginInvokeOnMainThread :

Device.BeginInvokeOnMainThread (() =>
{
    // interact with UI elements
});