Vytváření Xamarin.Forms chování
Xamarin.Forms chování jsou vytvořeny odvozením z Chování nebo Chování<T> třídy. Tento článek ukazuje, jak vytvářet a využívat Xamarin.Forms chování.
Přehled
Proces vytvoření Xamarin.Forms chování je následující:
- Vytvořte třídu, která dědí z
Behavior
třídy,Behavior<T>
kdeT
je typ ovládacího prvku, na který se má chování použít. - Přepište metodu
OnAttachedTo
pro provedení požadované instalace. - Přepište metodu pro provedení požadovaného
OnDetachingFrom
vyčištění. - Implementujte základní funkce chování.
Výsledkem je struktura zobrazená v následujícím příkladu kódu:
public class CustomBehavior : 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 aktivuje 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. Funkce chování by se pak implementovala v obslužné rutině události události.
Metoda OnDetachingFrom
se aktivuje 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í. Můžete například odhlásit odběr události na ovládacím prvku, abyste zabránili nevracení paměti.
Chování pak může být využito tak, že ho připojíte ke Behaviors
kolekci příslušného ovládacího prvku.
Xamarin.Forms Vytvoření chování
Ukázková aplikace ukazuje NumericValidationBehavior
, který zvýrazní hodnotu zadaná uživatelem Entry
do ovládacího prvku červeně, pokud není double
. Chování je znázorněno v následujícím příkladu kódu:
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 ? Color.Default : Color.Red;
}
}
Odvozuje NumericValidationBehavior
se od Behavior<T>
třídy, kde T
je .Entry
Metoda OnAttachedTo
zaregistruje obslužnou rutinu TextChanged
události pro událost s metodou OnDetachingFrom
zrušení TextChanged
registrace události, aby se zabránilo nevracení paměti. Základní funkce chování je poskytována OnEntryTextChanged
metodou, která parsuje hodnotu zadanou uživatelem do Entry
a nastaví TextColor
vlastnost na červenou, pokud hodnota není double
.
Poznámka:
Xamarin.Forms 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ů.
Xamarin.Forms Využívání chování
Každý Xamarin.Forms ovládací prvek má kolekci Behaviors
, do které lze přidat jedno nebo více chování, jak je znázorněno v následujícím příkladu kódu XAML:
<Entry Placeholder="Enter a System.Double">
<Entry.Behaviors>
<local:NumericValidationBehavior />
</Entry.Behaviors>
</Entry>
Ekvivalent Entry
v jazyce C# je znázorněn v následujícím příkladu kódu:
var entry = new Entry { Placeholder = "Enter a System.Double" };
entry.Behaviors.Add (new NumericValidationBehavior ());
Za běhu bude chování reagovat na interakci s ovládacím prvku podle implementace chování. Následující snímky obrazovky ukazují chování reagující na neplatný vstup:
Poznámka:
Chování se zapisuje pro konkrétní 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. Při pokusu o připojení chování k nekompatibilnímu ovládacímu prvku dojde k vyvolání výjimky.
Xamarin.Forms Využívání chování pomocí stylu
Chování lze také 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í. 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 delegáta
propertyChanged
, 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
, která chování přidá a odebere.
Následující příklad kódu ukazuje připojenou vlastnost, která řídí přidání a odebrání NumericValidationBehavior
:
public class NumericValidationBehavior : Behavior<Entry>
{
public static readonly BindableProperty AttachBehaviorProperty =
BindableProperty.CreateAttached ("AttachBehavior", typeof(bool), typeof(NumericValidationBehavior), 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)
{
var entry = view as Entry;
if (entry == null) {
return;
}
bool attachBehavior = (bool)newValue;
if (attachBehavior) {
entry.Behaviors.Add (new NumericValidationBehavior ());
} else {
var toRemove = entry.Behaviors.FirstOrDefault (b => b is NumericValidationBehavior);
if (toRemove != null) {
entry.Behaviors.Remove (toRemove);
}
}
}
...
}
Třída NumericValidationBehavior
obsahuje připojenou vlastnost s static
názvem AttachBehavior
getter a setter, která řídí přidání nebo odebrání chování ovládacího 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 proNumericValidationBehavior
, který používá připojenou AttachBehavior
vlastnost, a který lze použít pro Entry
ovládací prvky:
<Style x:Key="NumericValidationStyle" TargetType="Entry">
<Style.Setters>
<Setter Property="local:NumericValidationBehavior.AttachBehavior" Value="true" />
</Style.Setters>
</Style>
Lze Style
použít na Entry
ovládací prvek nastavením jeho Style
vlastnosti na Style
instanci pomocí StaticResource
rozšíření značek, jak je znázorněno v následujícím příkladu kódu:
<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 vlastnosti vázání k chování, které je nastaveno nebo dotazováno v XAML, pokud vytvoříte chování, které mají stav, které by neměly být sdíleny mezi ovládacími prvky v objektu Style
ResourceDictionary
.
Odebrání chování z ovládacího prvku
Metoda OnDetachingFrom
se aktivuje při odebrání chování z ovládacího prvku a slouží k provedení požadovaného vyčištění, jako je zrušení odběru události, aby se zabránilo nevrácení paměti. Chování však není implicitně odebráno z ovládacích prvků, pokud kolekce ovládacího prvku Behaviors
není upravena nějakou metodou Remove
nebo Clear
metodou. Následující příklad kódu ukazuje odebrání konkrétního chování z kolekce ovládacího prvku Behaviors
:
var toRemove = entry.Behaviors.FirstOrDefault (b => b is NumericValidationBehavior);
if (toRemove != null) {
entry.Behaviors.Remove (toRemove);
}
Případně můžete kolekci ovládacího prvku Behaviors
vymazat, jak je znázorněno v následujícím příkladu kódu:
entry.Behaviors.Clear();
Kromě toho mějte na paměti, že chování se implicitně neodebere z ovládacích prvků, když se stránky přepnou z navigačního zásobníku. Místo toho je nutné je explicitně odebrat před přechodem na stránky mimo rozsah.
Shrnutí
Tento článek ukazuje, jak vytvářet a využívat Xamarin.Forms chování. Xamarin.Forms chování jsou vytvořena odvozením z Behavior
nebo Behavior<T>
třídy.