Comportamientos
Los comportamientos de la interfaz de usuario de aplicaciones multiplataforma (.NET MAUI) de .NET permiten agregar funcionalidad a los controles de la interfaz de usuario sin tener que subclasarlos. En su lugar, la función se implementa en una clase de comportamiento y se asocia al control como si fuera parte de este.
Los comportamientos permiten implementar código que normalmente tendría que escribirse como código subyacente, ya que interactúan directamente con la API del control, de manera que pueden asociarse al control de manera concisa y empaquetarse para reutilizarlos en más de una aplicación. Pueden usarse para proporcionar una amplia variedad de funciones para los controles, como:
- Agregar un validador de correo electrónico a un elemento
Entry. - Crear un control de calificación mediante un reconocedor de gestos de pulsar.
- Controlar una animación.
.NET MAUI admite dos tipos diferentes de comportamientos:
- Los comportamientos asociados son clases
staticcon una o varias propiedades asociadas. Para obtener más información sobre los comportamientos adjuntos, consulte Comportamientos adjuntos. - Los comportamientos de MAUI de .NET son clases que se derivan de la
Behaviorclase oBehavior<T>, dondeTes el tipo del control al que se debe aplicar el comportamiento. Para obtener más información, consulte Comportamientos de MAUI de .NET.
Comportamientos adjuntos
Los comportamientos asociados son clases estáticas con una o varias propiedades asociadas. Una propiedad asociada es un tipo especial de propiedad enlazable. Se define en una clase, pero se asocia a otros objetos y puede reconocerse en XAML como un atributo que contiene una clase y un nombre de propiedad separado por un punto. Para obtener más información sobre las propiedades adjuntas, vea Propiedades adjuntas.
Una propiedad asociada puede definir un delegado propertyChanged que se ejecutará cuando cambie el valor de la propiedad (por ejemplo, cuando la propiedad se establezca en un control). Cuando se ejecute el delegado propertyChanged, se pasará una referencia al control donde esté asociado, así como los parámetros que contienen los valores nuevos y anteriores de la propiedad. Este delegado puede usarse para agregar nuevas funciones al control al que se asocie la propiedad; para hacerlo, se manipula la referencia en la que se pasa, como se muestra a continuación:
- El delegado
propertyChangedtransmite la referencia del control, que se recibe como un elementoBindableObject, al tipo de control cuyo comportamiento se ha diseñado para mejorar. - El delegado
propertyChangedmodifica las propiedades del control, llama a métodos del control o registra controladores de eventos expuestos por el control para implementar la función básica de comportamiento.
Advertencia
Los comportamientos adjuntos se definen en una static clase , con static propiedades y métodos. Esto hace que sea difícil crear comportamientos asociados que tengan un estado.
Creación de un comportamiento adjunto
Un comportamiento adjunto se puede implementar mediante la creación de una clase estática que contiene una propiedad adjunta que especifica un propertyChanged delegado.
En el ejemplo siguiente se muestra la AttachedNumericValidationBehavior clase , que resalta el valor especificado por el usuario en un Entry control en rojo si no es un 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;
}
}
En este ejemplo, la AttachedNumericValidationBehavior clase contiene una propiedad adjunta denominada AttachBehavior con un static captador y establecedor, que controla la adición o eliminación del comportamiento al control al que se asociará. Esta propiedad asociada registra el método OnAttachBehaviorChanged que se ejecutará cuando cambie el valor de la propiedad. Este método registra o anula el registro de un controlador de eventos para el evento TextChanged basándose en el valor de la propiedad asociada AttachBehavior. El método proporciona OnEntryTextChanged la funcionalidad principal del comportamiento, que analiza el valor especificado en y establece la TextColor propiedad en Entry rojo si el valor no es .double
Consumo de un comportamiento adjunto
Se puede consumir un comportamiento adjunto estableciendo su propiedad adjunta en el control de destino.
En el ejemplo siguiente se muestra cómo consumir la AttachedNumericValidationBehavior clase en un Entry mediante la adición de la AttachBehavior propiedad adjunta a Entry:
<ContentPage ...
xmlns:local="clr-namespace:BehaviorsDemos">
<Entry Placeholder="Enter a System.Double" local:AttachedNumericValidationBehavior.AttachBehavior="true" />
</ContentPage>
En el siguiente ejemplo de código, se muestra el control Entry equivalente en C#:
Entry entry = new Entry { Placeholder = "Enter a System.Double" };
AttachedNumericValidationBehavior.SetAttachBehavior(entry, true);
En la captura de pantalla siguiente se muestra el comportamiento adjunto que responde a una entrada no válida:
Nota
Los comportamientos asociados se escriben para un tipo de control específico (o una superclase que se puede aplicar a muchos controles) y solo se tienen que agregar a un control compatible.
Eliminación de un comportamiento adjunto
La AttachedNumericValidationBehavior clase se puede quitar de un control estableciendo la AttachBehavior propiedad adjunta en false:
<Entry Placeholder="Enter a System.Double" local:AttachedNumericValidationBehavior.AttachBehavior="false" />
En tiempo de ejecución, el método OnAttachBehaviorChanged se ejecutará cuando el valor de la propiedad asociada AttachBehavior se establezca en false. A OnAttachBehaviorChanged continuación, el método anulará el registro del controlador de eventos para el TextChanged evento, lo que garantiza que el comportamiento no se ejecuta mientras interactúa con el control.
Comportamientos de .NET MAUI
Los comportamientos de MAUI de .NET se crean derivando de la Behavior clase o Behavior<T> .
El proceso para crear un comportamiento de MAUI de .NET es el siguiente:
- Cree una clase que herede de la clase
BehavioroBehavior<T>, dondeTsea el tipo del control al que se debe aplicar el comportamiento. - Invalide el método
OnAttachedTopara realizar cualquier configuración necesaria. - Invalide el método
OnDetachingFrompara realizar cualquier limpieza necesaria. - Implemente la funcionalidad básica del comportamiento.
Esto da como resultado la estructura que se muestra en el ejemplo siguiente:
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
}
Se OnAttachedTo llama al método inmediatamente después de adjuntar el comportamiento a un control . Este método recibe una referencia al control al que se adjunta, y se puede usar para registrar controladores de eventos o realizar otra configuración necesaria para admitir la funcionalidad del comportamiento. Por ejemplo, se podría suscribir a un evento en un control. Después, se implementaría la funcionalidad del comportamiento en el controlador de eventos para el evento.
Se OnDetachingFrom llama al método cuando se quita el comportamiento del control. Este método recibe una referencia al control al que se adjunta y se usa para realizar cualquier limpieza necesaria. Por ejemplo, podría cancelar la suscripción a un evento en un control para evitar fugas de memoria.
A continuación, el comportamiento se puede consumir adjuntando a la Behaviors colección del control .
Creación de un comportamiento de MAUI de .NET
Se puede implementar un comportamiento de MAUI de .NET mediante la creación de una clase que se derive de la Behavior clase o Behavior<T> y que invalide los OnAttachedTo métodos y OnDetachingFrom .
En el ejemplo siguiente se muestra la NumericValidationBehavior clase , que resalta el valor especificado por el usuario en un Entry control en rojo si no es un 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;
}
}
En este ejemplo, la NumericValidationBehavior clase deriva de la Behavior<T> clase , donde T es .Entry El método OnAttachedTo registra un controlador de eventos para el evento TextChanged, y el método OnDetachingFrom anula el registro del evento TextChanged para evitar fugas de memoria. El método proporciona OnEntryTextChanged la funcionalidad principal del comportamiento, que analiza el valor especificado en y establece la TextColor propiedad en Entry rojo si el valor no es .double
Importante
.NET MAUI no establece el BindingContext de un comportamiento, ya que los comportamientos se pueden compartir y aplicar a varios controles a través de estilos.
Consumo de un comportamiento de MAUI de .NET
Cada control MAUI de .NET tiene una Behaviors colección a la que se pueden agregar uno o varios comportamientos:
<Entry Placeholder="Enter a System.Double">
<Entry.Behaviors>
<local:NumericValidationBehavior />
</Entry.Behaviors>
</Entry>
En el siguiente ejemplo de código, se muestra el control Entry equivalente en C#:
Entry entry = new Entry { Placeholder = "Enter a System.Double" };
entry.Behaviors.Add(new NumericValidationBehavior());
En la captura de pantalla siguiente se muestra el comportamiento de MAUI de .NET que responde a una entrada no válida:
Advertencia
Los comportamientos de MAUI de .NET se escriben para un tipo de control específico (o una superclase que se puede aplicar a muchos controles) y solo se deben agregar a un control compatible. Si se intenta adjuntar un comportamiento de MAUI de .NET a un control incompatible, se producirá una excepción.
Consumo de un comportamiento de MAUI de .NET con un estilo
Los comportamientos de .NET MAUI se pueden consumir mediante un estilo explícito o implícito. Pero no se puede crear un estilo que establece la propiedad Behaviors de un control porque la propiedad es de solo lectura. La solución consiste en agregar una propiedad adjunta a la clase de comportamiento que controle la adición y eliminación del comportamiento. El proceso es el siguiente:
- Agregue una propiedad adjunta a la clase de comportamiento que se usará para controlar la adición o eliminación del comportamiento al control al que se asociará el comportamiento. Se asegura que la propiedad adjunta registra un delegado
propertyChangedque se ejecutará cuando cambie el valor de la propiedad. - Se crea un captador y establecedor
staticpara la propiedad adjunta. - Se implementa la lógica en el delegado
propertyChangedpara agregar y quitar el comportamiento.
En el ejemplo siguiente se muestra la NumericValidationStyleBehavior clase , que tiene una propiedad adjunta que controla la adición y eliminación del comportamiento:
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);
}
}
}
...
}
En este ejemplo, la NumericValidationStyleBehavior clase contiene una propiedad adjunta denominada AttachBehavior con un static captador y establecedor, que controla la adición o eliminación del comportamiento al control al que se asociará. Esta propiedad asociada registra el método OnAttachBehaviorChanged que se ejecutará cuando cambie el valor de la propiedad. Este método agrega o quita el comportamiento del control, en función del valor de la propiedad adjunta AttachBehavior.
En el ejemplo de código siguiente se muestra un estilo explícito para el elemento NumericValidationStyleBehavior que usa la propiedad adjunta AttachBehavior y que se puede aplicar a controles Entry:
<Style x:Key="NumericValidationStyle" TargetType="Entry">
<Style.Setters>
<Setter Property="local:NumericValidationStyleBehavior.AttachBehavior" Value="true" />
</Style.Setters>
</Style>
Style Se puede aplicar a un Entry mediante el establecimiento de su Style propiedad en el estilo mediante la StaticResource extensión de marcado:
<Entry Placeholder="Enter a System.Double" Style="{StaticResource NumericValidationStyle}">
Para obtener más información sobre los estilos, vea Estilos.
Nota
Aunque se pueden agregar propiedades enlazables a un comportamiento que se establece o se consulta en XAML, si se crean comportamientos que tienen estado, no se deberían compartir entre los controles en un elemento Style de un objeto ResourceDictionary.
Eliminación de un comportamiento de MAUI de .NET
Se OnDetachingFrom llama al método cuando se quita un comportamiento de un control y se usa para realizar cualquier limpieza necesaria, como cancelar la suscripción de un evento para evitar una pérdida de memoria. Sin embargo, los comportamientos no se quitan implícitamente de los controles a menos que el Remove método o Clear modifique la colección del Behaviors control:
Behavior toRemove = entry.Behaviors.FirstOrDefault(b => b is NumericValidationStyleBehavior);
if (toRemove != null)
{
entry.Behaviors.Remove(toRemove);
}
Como alternativa, la colección del Behaviors control se puede borrar:
entry.Behaviors.Clear();
Nota
Los comportamientos de MAUI de .NET no se quitan implícitamente de los controles cuando se extrae páginas de la pila de navegación. En su lugar, se deben quitar explícitamente antes de que las páginas queden fuera del ámbito.
Examinar el ejemplo