Chování
Chování .NET Multi-platform App UI (.NET MAUI) umožňují přidat k ovládacím prvkům uživatelského rozhraní další funkce, jako jsou Button nebo Entry, aniž byste museli vytvářet podtřídy ovládacích prvků. Místo toho je dodatečná funkce implementována ve třídě Behavior a připojena k ovládacímu prvku.
Chování se dá použít k přidání různých funkcí do ovládacích prvků uživatelského rozhraní, například:
- Ověření vstupu. Chování je možné použít se vstupními ovládacími prvky k zajištění platnosti dat. Můžete například napsat chování pro Entry, aby bylo zajištěno, že telefonní číslo nebo e-mailová adresa je ve správném formátu.
- Vylepšení uživatelského rozhraní Chování se dá použít k vylepšení ovládacích prvků uživatelského rozhraní ve vaší aplikaci. Můžete například napsat chování pro Button, aby se po kliknutí zatřesila nebo změnila barvu.
- Odezvy za běhu Chování se dá použít k tomu, aby ovládací prvky reagovaly na různé situace. Vstup uživatele můžete například automaticky uložit do Entry, když uživatel dokončí psaní.
.NET MAUI podporuje tři různé typy chování:
- Připojené chování jsou třídy typu
static
s jednou nebo více připojenými vlastnostmi. Další informace o připojených chováních naleznete v tématu Připojené chování. - Třídy chování rozhraní .NET MAUI jsou odvozené z tříd Behavior nebo Behavior<T>, kde typ ovládacího prvku je
T
, na které má toto chování platit. Další informace najdete v tématu chování rozhraní .NET MAUI. - Chování platformy je třída odvozená od třídy PlatformBehavior<TView> nebo PlatformBehavior<TView,TPlatformView>. Toto chování může reagovat na libovolné podmínky a události nativního ovládacího prvku. Další informace naleznete v tématu Chování platformy.
Připojené chování
Připojená chování jsou statické třídy, které mají jednu nebo více připojených vlastností. Připojená vlastnost je speciální typ bindable vlastnosti. Jsou definovány v jedné třídě, ale připojeny k jiným objektům, a jsou rozpoznatelné v XAML jako atributy, které obsahují třídu a název vlastnosti oddělené tečkou. Další informace o připojených vlastnostech naleznete v tématu Připojené vlastnosti.
Připojená vlastnost může definovat propertyChanged
delegáta, který se spustí při změně hodnoty vlastnosti, například když je vlastnost nastavena na ovládacím prvku. Když se propertyChanged
delegát spustí, je předán odkaz na ovládací prvek, k němu připojený, a parametry obsahující staré a nové hodnoty vlastnosti. Tento delegát se dá použít k přidání nových funkcí do ovládacího prvku, ke kterému je vlastnost připojena, pomocí manipulace s odkazem, který je předán, následujícím způsobem:
-
propertyChanged
delegát převádí odkaz na ovládací prvek, který je přijat jako BindableObject, na typ ovládacího prvku, který je navržen pro vylepšení. -
propertyChanged
delegát upravuje vlastnosti ovládacího prvku, volá metody ovládacího prvku nebo registruje obslužné rutiny událostí pro události vystavené ovládacím prvku, aby implementovaly základní funkce chování.
Varování
Připojená chování jsou definována ve třídě static
s vlastnostmi a metodami definovanými pomocí static
. To znesnadňuje vytváření připojených chování, která mají stav.
Vytvořte připojené chování
Připojené chování lze implementovat vytvořením statické třídy, která obsahuje připojenou vlastnost, která určuje propertyChanged
delegáta.
Následující příklad ukazuje třídu AttachedNumericValidationBehavior
, která zvýrazní hodnotu zadaná uživatelem do ovládacího prvku Entry červeně, pokud se nejedná o double
:
public static class AttachedNumericValidationBehavior
{
public static readonly BindableProperty AttachBehaviorProperty =
BindableProperty.CreateAttached("AttachBehavior", typeof(bool), typeof(AttachedNumericValidationBehavior), false, propertyChanged: OnAttachBehaviorChanged);
public static bool GetAttachBehavior(BindableObject view)
{
return (bool)view.GetValue(AttachBehaviorProperty);
}
public static void SetAttachBehavior(BindableObject view, bool value)
{
view.SetValue(AttachBehaviorProperty, value);
}
static void OnAttachBehaviorChanged(BindableObject view, object oldValue, object newValue)
{
Entry entry = view as Entry;
if (entry == null)
{
return;
}
bool attachBehavior = (bool)newValue;
if (attachBehavior)
{
entry.TextChanged += OnEntryTextChanged;
}
else
{
entry.TextChanged -= OnEntryTextChanged;
}
}
static void OnEntryTextChanged(object sender, TextChangedEventArgs args)
{
double result;
bool isValid = double.TryParse(args.NewTextValue, out result);
((Entry)sender).TextColor = isValid ? Colors.Black : Colors.Red;
}
}
V tomto příkladu třída AttachedNumericValidationBehavior
obsahuje připojenou vlastnost s názvem AttachBehavior
a má static
getter a setter, které řídí přidání nebo odebrání chování u ovládacího prvku, ke kterému bude připojena. Tato připojená vlastnost zaregistruje OnAttachBehaviorChanged
metodu, která se spustí při změně hodnoty vlastnosti. Tato metoda zaregistruje nebo zruší registraci obslužné rutiny události pro událost TextChanged
na základě hodnoty připojené vlastnosti AttachBehavior
. Základní funkce chování poskytuje metoda OnEntryTextChanged
, která parsuje hodnotu zadanou v Entry a nastaví TextColor
vlastnost na červenou, pokud hodnota není double
.
Využití připojeného chování
Připojené chování lze využít nastavením jeho připojené vlastnosti na cílovém ovládacím prvku.
Následující příklad ukazuje použití třídy AttachedNumericValidationBehavior
na Entry přidáním připojené vlastnosti AttachBehavior
k Entry.
<ContentPage ...
xmlns:local="clr-namespace:BehaviorsDemos">
<Entry Placeholder="Enter a System.Double" local:AttachedNumericValidationBehavior.AttachBehavior="true" />
</ContentPage>
Ekvivalentní Entry v jazyce C# je znázorněno v následujícím příkladu kódu:
Entry entry = new Entry { Placeholder = "Enter a System.Double" };
AttachedNumericValidationBehavior.SetAttachBehavior(entry, true);
Následující snímek obrazovky ukazuje připojené chování reagující na neplatný vstup:
Poznámka
Připojená chování se zapisují pro určitý typ ovládacího prvku (nebo pro nadtřídu, která se může použít u mnoha ovládacích prvků) a měly by být přidány pouze do kompatibilního ovládacího prvku.
Odstraňte připojené chování
Třídu AttachedNumericValidationBehavior
lze z ovládacího elementu odebrat nastavením připojené vlastnosti AttachBehavior
na false
:
<Entry Placeholder="Enter a System.Double" local:AttachedNumericValidationBehavior.AttachBehavior="false" />
Za běhu se metoda OnAttachBehaviorChanged
spustí, když je hodnota připojené vlastnosti AttachBehavior
nastavena na false
. Metoda OnAttachBehaviorChanged
pak zruší registraci obslužné rutiny pro událost TextChanged
, čímž zajistí, že dané chování se nespustí při interakci s ovládacím prvkem.
Chování v .NET MAUI
Chování rozhraní .NET MAUI se vytváří odvozením z třídy Behavior nebo Behavior<T>.
Proces vytvoření chování .NET MAUI je následující:
- Vytvořte třídu, která dědí z třídy Behavior nebo Behavior<T>, kde
T
je typ ovládacího prvku, na který se má chování použít. - Proveďte přepsání metody OnAttachedTo pro provedení požadovaného nastavení.
- Přepište metodu OnDetachingFrom pro provedení požadovaného čištění.
- Implementujte základní funkce chování.
Výsledkem je struktura zobrazená v následujícím příkladu:
public class MyBehavior : Behavior<View>
{
protected override void OnAttachedTo(View bindable)
{
base.OnAttachedTo(bindable);
// Perform setup
}
protected override void OnDetachingFrom(View bindable)
{
base.OnDetachingFrom(bindable);
// Perform clean up
}
// Behavior implementation
}
Metoda OnAttachedTo se volá okamžitě po připojení chování k ovládacímu prvku. Tato metoda obdrží odkaz na ovládací prvek, ke kterému je připojen, a lze jej použít k registraci obslužných rutin událostí nebo k provedení jiného nastavení, které je nutné pro podporu funkce chování. Můžete se například přihlásit k odběru události v ovládacím prvku. Chování by se pak implementovalo v obslužné rutině události.
Metoda OnDetachingFrom je volána při odebrání chování z ovládacího prvku. Tato metoda obdrží odkaz na ovládací prvek, ke kterému je připojen, a slouží k provedení požadovaného vyčištění. Například se můžete odhlásit z události u ovládacího prvku, abyste zabránili únikům paměti.
Chování pak může být využito tak, že ho připojíte k Behaviors kolekci ovládacího prvku.
Vytvořte chování .NET MAUI
Chování .NET MAUI lze implementovat vytvořením třídy odvozené od Behavior nebo Behavior<T> třídy a přepsáním OnAttachedTo a OnDetachingFrom metod.
Následující příklad ukazuje třídu NumericValidationBehavior
, která zvýrazní hodnotu zadaná uživatelem do ovládacího prvku Entry červeně, pokud se nejedná o double
:
public class NumericValidationBehavior : Behavior<Entry>
{
protected override void OnAttachedTo(Entry entry)
{
entry.TextChanged += OnEntryTextChanged;
base.OnAttachedTo(entry);
}
protected override void OnDetachingFrom(Entry entry)
{
entry.TextChanged -= OnEntryTextChanged;
base.OnDetachingFrom(entry);
}
void OnEntryTextChanged(object sender, TextChangedEventArgs args)
{
double result;
bool isValid = double.TryParse(args.NewTextValue, out result);
((Entry)sender).TextColor = isValid ? Colors.Black : Colors.Red;
}
}
V tomto příkladu je třída NumericValidationBehavior
odvozena od třídy Behavior<T>, kde T
je Entry. Metoda OnAttachedTo registruje obslužnou rutinu události pro událost TextChanged
, přičemž metoda OnDetachingFrom deregistruje událost TextChanged
, aby se zabránilo únikům paměti. Základní funkce chování poskytuje metoda OnEntryTextChanged
, která parsuje hodnotu zadanou v Entry a nastaví TextColor
vlastnost na červenou, pokud hodnota není double
.
Důležitý
.NET MAUI nenastavuje BindingContext
chování, protože chování lze sdílet a aplikovat na více ovládacích prvků prostřednictvím stylů.
Jak používat chování .NET MAUI
Každý ovládací prvek .NET MAUI má kolekci Behaviors, do které lze přidat jedno nebo více chování:
<Entry Placeholder="Enter a System.Double">
<Entry.Behaviors>
<local:NumericValidationBehavior />
</Entry.Behaviors>
</Entry>
Ekvivalentní Entry v jazyce C# je znázorněno v následujícím příkladu kódu:
Entry entry = new Entry { Placeholder = "Enter a System.Double" };
entry.Behaviors.Add(new NumericValidationBehavior());
Následující snímek obrazovky ukazuje chování .NET MAUI reagující na neplatný vstup:
Varování
Chování .NET MAUI se zapisuje pro konkrétní typ ovládacího prvku (nebo pro nadtřídu, která se může použít pro mnoho ovládacích prvků) a měly by se přidat jenom do kompatibilního ovládacího prvku. Při pokusu o připojení chování .NET MAUI k nekompatibilnímu ovládacímu prvku dojde k vyvolání výjimky.
Použití chování .NET MAUI se stylem
Chování .NET MAUI lze využívat prostřednictvím explicitního nebo implicitního stylu. Vytvoření stylu, který nastaví Behaviors vlastnost ovládacího prvku není možné, protože vlastnost je jen pro čtení. Řešením je přidat připojenou vlastnost do třídy chování, která řídí přidávání a odebírání chování. Proces je následující:
- Přidejte připojenou vlastnost do třídy chování, která bude použita k řízení přidání nebo odebrání chování do ovládacího prvku, ke kterému bude chování připojeno. Zajistěte, aby připojená vlastnost registrovala
propertyChanged
delegáta, který se spustí při změně hodnoty vlastnosti. - Vytvořte
static
getter a setter pro připojenou vlastnost. - Implementujte logiku v delegátu
propertyChanged
pro přidání a odebrání daného chování.
Následující příklad ukazuje třídu NumericValidationStyleBehavior
, která má připojenou vlastnost, která řídí přidávání a odebírání chování:
public class NumericValidationStyleBehavior : Behavior<Entry>
{
public static readonly BindableProperty AttachBehaviorProperty =
BindableProperty.CreateAttached("AttachBehavior", typeof(bool), typeof(NumericValidationStyleBehavior), false, propertyChanged: OnAttachBehaviorChanged);
public static bool GetAttachBehavior(BindableObject view)
{
return (bool)view.GetValue(AttachBehaviorProperty);
}
public static void SetAttachBehavior(BindableObject view, bool value)
{
view.SetValue(AttachBehaviorProperty, value);
}
static void OnAttachBehaviorChanged(BindableObject view, object oldValue, object newValue)
{
Entry entry = view as Entry;
if (entry == null)
{
return;
}
bool attachBehavior = (bool)newValue;
if (attachBehavior)
{
entry.Behaviors.Add(new NumericValidationStyleBehavior());
}
else
{
Behavior toRemove = entry.Behaviors.FirstOrDefault(b => b is NumericValidationStyleBehavior);
if (toRemove != null)
{
entry.Behaviors.Remove(toRemove);
}
}
}
protected override void OnAttachedTo(Entry entry)
{
entry.TextChanged += OnEntryTextChanged;
base.OnAttachedTo(entry);
}
protected override void OnDetachingFrom(Entry entry)
{
entry.TextChanged -= OnEntryTextChanged;
base.OnDetachingFrom(entry);
}
void OnEntryTextChanged(object sender, TextChangedEventArgs args)
{
double result;
bool isValid = double.TryParse(args.NewTextValue, out result);
((Entry)sender).TextColor = isValid ? Colors.Black : Colors.Red;
}
}
V tomto příkladu třída NumericValidationStyleBehavior
obsahuje připojenou vlastnost s názvem AttachBehavior
s static
getterem a seterem, které ovládají přidání nebo odebrání chování k ovládacímu prvku, ke kterému bude připojena. Tato připojená vlastnost zaregistruje OnAttachBehaviorChanged
metodu, která se spustí při změně hodnoty vlastnosti. Tato metoda přidává nebo odebírá chování k ovládacímu prvku na základě hodnoty vázané vlastnosti AttachBehavior
.
Následující příklad kódu ukazuje explicitní styl pro NumericValidationStyleBehavior
, který používá AttachBehavior
připojenou vlastnost a který lze použít pro Entry ovládací prvky.
<Style x:Key="NumericValidationStyle" TargetType="Entry">
<Style.Setters>
<Setter Property="local:NumericValidationStyleBehavior.AttachBehavior" Value="true" />
</Style.Setters>
</Style>
Style lze aplikovat na Entry nastavením vlastnosti Style na styl pomocí rozšíření značek StaticResource
.
<Entry Placeholder="Enter a System.Double" Style="{StaticResource NumericValidationStyle}">
Další informace o stylech naleznete v tématu Styly.
Poznámka
I když můžete přidat vázané vlastnosti k chování, které je nastaveno nebo dotazováno v XAML, pokud vytvoříte chování, které má stav, by nemělo být sdíleno mezi ovládacími prvky v Style v ResourceDictionary.
Odebrání chování .NET MAUI
Metoda OnDetachingFrom je volána při odebrání chování z ovládacího prvku a používá se k provedení požadovaného vyčištění, jako je zrušení odběru události, aby se zabránilo úniku paměti. Chování se však z ovládacích prvků implicitně neodebere, pokud není kolekce Behaviors ovládacího prvku upravena metodou Remove
nebo Clear
:
Behavior toRemove = entry.Behaviors.FirstOrDefault(b => b is NumericValidationStyleBehavior);
if (toRemove != null)
{
entry.Behaviors.Remove(toRemove);
}
Případně můžete vymazat kolekci Behaviors ovládacího prvku:
entry.Behaviors.Clear();
Poznámka
Chování .NET MAUI se implicitně neodebere z ovládacích prvků, když jsou stránky odstraněny z navigačního zásobníku. Místo toho je nutné je explicitně odebrat před přechodem na stránky mimo rozsah.
Chování platformy
Chování platformy se vytváří odvozením z třídy PlatformBehavior<TView> nebo PlatformBehavior<TView,TPlatformView>. Reagují na libovolné podmínky a události vestavěného ovládacího prvku.
Chování platformy lze implementovat prostřednictvím podmíněné kompilace nebo částečných tříd. Zde přijatý přístup spočívá v použití částečných tříd, kdy chování platformy se obvykle skládá z multiplatformní částečné třídy, která definuje rozhraní API chování, a nativní částečnou třídu, která implementuje chování na každé platformě. V době sestavení kombinuje cílení na více platforem částečné třídy k sestavení chování platformy na jednotlivých platformách.
Proces vytvoření chování platformy je následující:
Vytvořte částečnou třídu pro různé platformy, která definuje rozhraní API pro chování platformy.
Vytvořte nativní částečnou třídu na každé platformě, pro kterou je vaše aplikace vytvořená, která má stejný název jako částečná třída pro různé platformy. Tato nativní částečná třída by měla dědit z třídy PlatformBehavior<TView> nebo PlatformBehavior<TView,TPlatformView>, kde
TView
je multiplatformní ovládací prvek, na který se má chování použít, aTPlatformView
je nativní zobrazení, které implementuje řízení napříč platformami na konkrétní platformě.Poznámka
I když je potřeba vytvořit nativní částečnou třídu na každé platformě, pro které je vaše aplikace vytvořená, není nutné implementovat funkce chování platformy na každé platformě. Můžete například vytvořit chování platformy, které upraví tloušťku ohraničení nativního ovládacího prvku na některých, ale ne všech platformách.
V každé nativní částečné třídě, kterou potřebujete pro implementaci chování platformy, byste měli:
- Přepište metodu OnAttachedTo, aby se provedlo jakékoli nastavení.
- Přepište metodu OnDetachedFrom, abyste provedli veškeré potřebné vyčištění.
- Implementujte základní funkce chování platformy.
Chování pak může být využito tak, že ho připojíte do kolekce Behaviors ovládacího prvku.
Vytvořte chování platformy
Pokud chcete vytvořit chování platformy, musíte nejprve vytvořit částečnou třídu pro různé platformy, která definuje rozhraní API pro chování platformy:
namespace BehaviorsDemos
{
public partial class TintColorBehavior
{
public static readonly BindableProperty TintColorProperty =
BindableProperty.Create(nameof(TintColor), typeof(Color), typeof(TintColorBehavior));
public Color TintColor
{
get => (Color)GetValue(TintColorProperty);
set => SetValue(TintColorProperty, value);
}
}
}
Chování platformy je částečná třída, jejíž implementace bude dokončena na každé požadované platformě s další částečnou třídou, která používá stejný název. V tomto příkladu třída TintColorBehavior
definuje jednu přiřaditelnou vlastnost, TintColor
, která zabarví obrázek zadanou barvou.
Po vytvoření částečné třídy pro různé platformy byste měli vytvořit nativní částečnou třídu na každé platformě, pro kterou vytvoříte aplikaci. Toho lze dosáhnout přidáním částečných tříd do požadovaných podřízených složek složky Platforem:
Případně můžete projekt nakonfigurovat tak, aby podporoval cílení na více názvů souborů nebo více cílení na složky nebo obojí. Další informace o cílení na více platforem najdete v tématu Konfigurace cílení na více platforem.
Nativní částečné třídy by měly dědit z třídy PlatformBehavior<TView> nebo třídy PlatformBehavior<TView,TPlatformView>, kde TView
je multiplatformní ovládací prvek, na který se má chování použít, a TPlatformView
je nativní zobrazení, které implementuje řízení napříč platformami na konkrétní platformě. V každé nativní částečné třídě, kterou potřebujete k implementaci chování platformy, byste měli přepsat metodu OnAttachedTo a OnDetachedFrom a implementovat jádro funkčnosti chování platformy.
Metoda OnAttachedTo se volá ihned poté, co je platformní chování připojeno k multiplatformnímu ovládacímu prvku. Metoda obdrží odkaz na multiplatformní řízení, ke kterému je připojen, a volitelně odkaz na nativní ovládací prvek, který implementuje řízení mezi platformami. Tuto metodu lze použít k registraci obslužných rutin událostí nebo k provedení jiného nastavení, které je nezbytné pro podporu funkce chování platformy. Můžete se například přihlásit k odběru události v ovládacím prvku. Funkcionalita chování by pak byla implementována v obslužné rutině události.
Metoda OnDetachedFrom je volána, když je chování odebráno z řízení napříč platformami. Metoda obdrží odkaz na ovládací prvek, ke kterému je připojen, a volitelně odkaz na nativní ovládací prvek, který implementuje řízení napříč platformami. Metoda by se měla použít k provedení požadovaného vyčištění. Můžete například odregistrovat se z události na ovládacím prvku, abyste zabránili úniku paměti.
Důležitý
Částečné třídy musí být umístěné ve stejném oboru názvů a musí používat stejné názvy.
Následující příklad ukazuje TintColorBehavior
parciální třídu pro Android, která obarvuje obrázek zadanou barvou.
using Android.Graphics;
using Android.Widget;
using Microsoft.Maui.Platform;
using Color = Microsoft.Maui.Graphics.Color;
namespace BehaviorsDemos
{
public partial class TintColorBehavior : PlatformBehavior<Image, ImageView>
{
protected override void OnAttachedTo(Image bindable, ImageView platformView)
{
base.OnAttachedTo(bindable, platformView);
if (bindable is null)
return;
if (TintColor is null)
ClearColor(platformView);
else
ApplyColor(platformView, TintColor);
}
protected override void OnDetachedFrom(Image bindable, ImageView platformView)
{
base.OnDetachedFrom(bindable, platformView);
if (bindable is null)
return;
ClearColor(platformView);
}
void ApplyColor(ImageView imageView, Color color)
{
imageView.SetColorFilter(new PorterDuffColorFilter(color.ToPlatform(), PorterDuff.Mode.SrcIn ?? throw new NullReferenceException()));
}
void ClearColor(ImageView imageView)
{
imageView.ClearColorFilter();
}
}
}
V tomto příkladu je třída TintColorBehavior
odvozena od třídy PlatformBehavior<TView,TPlatformView>, kde TView
je Image a TPlatformView
je ImageView.
OnAttachedTo použije barvu nádechu na obrázek za předpokladu, že vlastnost TintColor
má hodnotu. Metoda OnDetachedFrom odebere tón z obrázku.
Na každé platformě, pro kterou vytváříte aplikaci, musí být přidána nativní částečná třída. Nativní částečnou třídu NO-OP ale můžete nastavit, pokud se chování platformy nevyžaduje na konkrétní platformě. Toho lze dosáhnout poskytnutím prázdné třídy:
using Microsoft.UI.Xaml;
namespace BehaviorsDemos
{
public partial class TintColorBehavior : PlatformBehavior<Image, FrameworkElement>
{
// NO-OP on Windows
}
}
Důležitý
Rozhraní .NET MAUI nenastavuje BindingContext
chování platformy.
Spotřebovávání chování platformy
Každý ovládací prvek .NET MAUI má kolekci Behaviors, do které lze přidat jedno nebo více chování platformy:
<Image Source="dotnet_bot.png"
HeightRequest="200"
HorizontalOptions="Center">
<Image.Behaviors>
<local:TintColorBehavior TintColor="Red" />
</Image.Behaviors>
</Image>
Ekvivalentní Image v jazyce C# je znázorněno v následujícím příkladu:
Image image = new Image { Source = "dotnet_bot.png", HeightRequest = 200, HorizontalOptions = LayoutOptions.Center };
image.Behaviors.Add(new TintColorBehavior());
Následující snímek obrazovky ukazuje, jak platforma obarvuje obrázek.
Varování
Chování platformy se zapisuje pro konkrétní typ ovládacího prvku (nebo pro nadtřídu, která se dá použít pro mnoho ovládacích prvků) a měly by se přidat jenom do kompatibilního ovládacího prvku. Při pokusu o připojení chování platformy k nekompatibilnímu ovládacímu prvku dojde k vyvolání výjimky.