Chování

Projděte si ukázku. Projděte si ukázku.

Chování uživatelského rozhraní .NET Multi-Platform App UI (.NET MAUI) umožňuje přidávat funkce do ovládacích prvků uživatelského rozhraní, aniž byste je museli podtřídět. Místo toho je funkce implementována ve třídě chování a připojena k ovládacímu prvku, jako by byla součástí samotného ovládacího prvku.

Chování umožňuje implementovat kód, který byste normálně museli psát jako kód za sebou, protože přímo komunikuje s rozhraním API ovládacího prvku takovým způsobem, že může být stručně připojen k ovládacímu prvku a zabalen pro opakované použití ve více než jedné aplikaci. Dají se použít k poskytování celé řady funkcí ovládacím prvkům, například:

  • Přidání validátoru e-mailu do .Entry
  • Vytvoření ovládacího prvku hodnocení pomocí rozpoznávání gest klepnutím
  • Řízení animace

Rozhraní .NET MAUI podporuje dva různé typy chování:

  • Připojené chování jsou static třídy s jednou nebo více připojenými vlastnostmi. Další informace o připojeném chování naleznete v tématu Připojené chování.
  • Chování rozhraní .NET MAUI jsou třídy odvozené z Behavior třídy nebo Behavior<T> třídy, kde T je typ ovládacího prvku, na který se má chování použít. Další informace najdete v tématu Chování rozhraní .NET MAUI.

Připojené chování

Připojené chování jsou statické třídy s jednou nebo více připojenými vlastnostmi. Připojená vlastnost je speciální typ svázatelné 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á propertyChanged vlastnost může definovat delegáta, který se spustí, když se hodnota vlastnosti změní, například když je vlastnost nastavena na ovládací prvek. Když se propertyChanged delegát spustí, předá se odkaz na ovládací prvek, ke kterému je připojen, a parametry, které obsahují 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, a to manipulací s odkazem, který je předán, následujícím způsobem:

  1. Delegát propertyChanged přetypuje odkaz na ovládací prvek, který je přijat jako , BindableObjectna typ ovládacího prvku, který chování je určeno k vylepšení.
  2. Delegát propertyChanged 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 prvek, aby implementoval základní funkce chování.

Upozornění

Připojená chování jsou definována ve static třídě s vlastnostmi a metodami static . To znesnadňuje vytváření připojených chování, která mají stav.

Vytvoření připojeného 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 AttachedNumericValidationBehavior třídu, která zvýrazní hodnotu zadaná uživatelem Entry do ovládacího prvku červeně, pokud není 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 AttachedNumericValidationBehavior třída obsahuje připojenou vlastnost s static názvem AttachBehavior getter a setter, která řídí přidání nebo odebrání chování k ovládacímu prvku, ke kterému bude připojen. Tato připojená vlastnost registruje metodu OnAttachBehaviorChanged , která se spustí při změně hodnoty vlastnosti. Tato metoda zaregistruje nebo zruší registraci obslužné rutiny události pro TextChanged událost na základě hodnoty AttachBehavior připojené vlastnosti. Základní funkce chování je poskytována metodou OnEntryTextChanged , která parsuje hodnotu zadanou do Entry a nastaví TextColor vlastnost červeně, pokud hodnota není double.

Využití připojeného chování

Připojené chování lze využívat nastavením jeho připojené vlastnosti na cílovém ovládacím prvku.

Následující příklad ukazuje využití AttachedNumericValidationBehavior třídy na základě Entry přidání AttachBehavior připojené vlastnosti do Entry:


<ContentPage ...
             xmlns:local="clr-namespace:BehaviorsDemos">
    <Entry Placeholder="Enter a System.Double" local:AttachedNumericValidationBehavior.AttachBehavior="true" />
</ContentPage>

Entry Ekvivalent v jazyce C# je znázorněn 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í, které reaguje na neplatný vstup:

Snímek obrazovky s připojeným chováním, které reaguje 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 dá 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.

Odebrání připojeného chování

Třídu AttachedNumericValidationBehavior lze odebrat z ovládacího prvku nastavením AttachBehavior připojené vlastnosti na false:

<Entry Placeholder="Enter a System.Double" local:AttachedNumericValidationBehavior.AttachBehavior="false" />

Za běhu se metoda spustí, OnAttachBehaviorChanged když je hodnota AttachBehavior připojené vlastnosti nastavena na false. Metoda OnAttachBehaviorChanged pak zruší registraci obslužné rutiny události pro TextChanged událost a zajistí, že se chování nespustí při interakci s ovládacím prvku.

Chování rozhraní .NET MAUI

Chování rozhraní .NET MAUI se vytváří odvozením z Behavior třídy nebo Behavior<T> třídy.

Proces vytvoření chování rozhraní .NET MAUI je následující:

  1. Vytvořte třídu, která dědí z Behavior třídy nebo Behavior<T> třídy, kde T je typ ovládacího prvku, na který se má chování použít.
  2. Přepište metodu OnAttachedTo , aby se provedlo jakékoli požadované nastavení.
  3. Přepište metodu OnDetachingFrom , aby se provedlo jakékoli požadované vyčištění.
  4. 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 ho použít k registraci obslužných rutin událostí nebo k provedení jiného nastavení, které je nutné k podpoře funkce chování. Můžete se například přihlásit k odběru události ovládacího prvku. Funkce chování by se pak implementovala v obslužné rutině události události.

Metoda OnDetachingFrom se volá, když je chování odebráno z ovládacího prvku. Tato metoda obdrží odkaz na ovládací prvek, ke kterému je připojen, a slouží k provedení jakéhokoli požadovaného vyčištění. Můžete například zrušit odběr události ovládacího prvku, abyste zabránili nevracení paměti.

Chování pak můžete využít tak, že ho připojíte k Behaviors kolekci ovládacího prvku.

Vytvoření chování rozhraní .NET MAUI

Chování rozhraní .NET MAUI lze implementovat vytvořením třídy, která je odvozena z Behavior třídy, Behavior<T> a přepsáním OnAttachedTo a OnDetachingFrom metodami.

Následující příklad ukazuje NumericValidationBehavior třídu, která zvýrazní hodnotu zadaná uživatelem Entry do ovládacího prvku červeně, pokud není 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 NumericValidationBehavior třída je odvozena od Behavior<T> třídy, kde T je Entry. Metoda OnAttachedTo zaregistruje obslužnou rutinu TextChanged události pro událost, přičemž OnDetachingFrom metoda deregistruje TextChanged událost, aby se zabránilo nevracení paměti. Základní funkce chování je poskytována metodou OnEntryTextChanged , která parsuje hodnotu zadanou do Entry a nastaví TextColor vlastnost červeně, pokud hodnota není double.

Důležité

Rozhraní .NET MAUI nenastavuje BindingContext chování, protože chování lze sdílet a použít u více ovládacích prvků prostřednictvím stylů.

Využití chování rozhraní .NET MAUI

Každý ovládací prvek .NET MAUI má Behaviors kolekci, do které se dá přidat jedno nebo více chování:

<Entry Placeholder="Enter a System.Double">
    <Entry.Behaviors>
        <local:NumericValidationBehavior />
    </Entry.Behaviors>
</Entry>

Entry Ekvivalent v jazyce C# je znázorněn 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í rozhraní .NET MAUI reagující na neplatný vstup:

Snímek obrazovky s chováním rozhraní .NET MAUI reagující na neplatný vstup

Upozornění

Chování rozhraní .NET MAUI se zapisuje pro určitý typ ovládacího prvku (nebo pro nadtřídu, která se dá 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. Pokus o připojení chování rozhraní .NET MAUI k nekompatibilnímu ovládacímu prvku způsobí vyvolání výjimky.

Využití chování rozhraní .NET MAUI pomocí stylu

Chování rozhraní .NET MAUI je možné využívat explicitním nebo implicitním stylem. Vytvoření stylu, který nastaví Behaviors vlastnost ovládacího prvku, však 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í. Postup je následující:

  1. Přidejte připojenou vlastnost do třídy chování, která bude použita k řízení přidání nebo odebrání chování k ovládacímu prvku, ke kterému bude toto chování připojeno. Ujistěte se, že připojená vlastnost registruje propertyChanged delegáta, který se spustí při změně hodnoty vlastnosti.
  2. static Vytvořte getter a setter pro připojenou vlastnost.
  3. Implementujte logiku delegáta propertyChanged , která chování přidá a odebere.

Následující příklad ukazuje NumericValidationStyleBehavior třídu, 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);
            }
        }
    }
    ...
}

V tomto příkladu NumericValidationStyleBehavior třída obsahuje připojenou vlastnost s static názvem AttachBehavior getter a setter, která řídí přidání nebo odebrání chování k ovládacímu prvku, ke kterému bude připojen. Tato připojená vlastnost registruje metodu OnAttachBehaviorChanged , která se spustí při změně hodnoty vlastnosti. Tato metoda přidá nebo odebere chování ovládacího prvku na základě hodnoty AttachBehavior připojené vlastnosti.

Následující příklad kódu ukazuje explicitní styl pro NumericValidationStyleBehavior , který používá připojenou AttachBehavior vlastnost, a kterou lze použít u Entry ovládacích prvků:

<Style x:Key="NumericValidationStyle" TargetType="Entry">
    <Style.Setters>
        <Setter Property="local:NumericValidationStyleBehavior.AttachBehavior" Value="true" />
    </Style.Setters>
</Style>

Lze Style použít na objekt Entry nastavením jeho Style vlastnosti na styl pomocí StaticResource rozšíření značek:

<Entry Placeholder="Enter a System.Double" Style="{StaticResource NumericValidationStyle}">

Další informace o stylech najdete v tématu Styly.

Poznámka

I když můžete přidat svázatelné vlastnosti k chování, které je nastaveno nebo dotazováno v JAZYCE XAML, pokud vytvoříte chování, které mají stav, by neměly být sdíleny mezi ovládacími prvky v objektu StyleResourceDictionary.

Odebrání chování rozhraní .NET MAUI

Metoda OnDetachingFrom se volá, když je chování odebráno z ovládacího prvku a slouží k provedení jakéhokoli požadovaného vyčištění, jako je zrušení odběru události, aby se zabránilo úniku paměti. Chování však není implicitně odebráno z ovládacích prvků, pokud kolekce ovládacího prvku Behaviors není upravena metodou nebo Clear metodouRemove:

Behavior toRemove = entry.Behaviors.FirstOrDefault(b => b is NumericValidationStyleBehavior);
if (toRemove != null)
{
    entry.Behaviors.Remove(toRemove);
}

Případně je možné kolekci ovládacího prvku Behaviors vymazat:

entry.Behaviors.Clear();

Poznámka

Chování rozhraní .NET MAUI není implicitně odebráno z ovládacích prvků, když se stránky zobrazí z navigačního zásobníku. Místo toho musí být explicitně odebrány před stránkami mimo rozsah.