Behaviors en WPF

Con la llegada de Expression Blend 3 tenmos un nuevo concepto en nuestros desarrollos que nos va a permitir que la unión entre desarrolladores y diseñadores sea todavía mejor.

Los behaviors son piezas de código que los diseñadores pueden asociar a un objeto simplemente arrastrándolos con el ratón.Blend ya nos trae una serie de behaviors que podemos utilizar ya, además de poder descargar unos cuantos mas de la pagina Expression Gallery’s Behaviors, pero además podemos construir nuestros behaviors  para acelerar nuestros desarrollos. Con los behaviors  conseguimos añadir interactividad sin escribir ningún código con lo que los diseñadores pueden incluirlos en sus diseños.

Para crear nuestros behaviors debemos de crear una clase que herede de Behavior o Behavior<T>, estas clases están implementadas en el assembly System.Windows.Interactivity.dll que añadiremos a nuestro proyecto, pero como siempre un ejemplo sencillo para ver como se crean, en este ejemplo vamos a crear un behaivour para los objetos TextBox a los cuales les vamos a añadir la funcionalidad de marca de agua.

Una vez añadida la referencia creamos nuestra clase

  1. public class WatermarkTextBehavior : Behavior<TextBox>
  2.     {
  3.     

 

Ahora creamos una DependencyProperty donde vamos a asignar el texto que queremos mostrar en la marca de agua, todas las propiedades que queremos que el diseñador utilize a la hora de configurar el behavior seran DependencyProperty, en nuestro caso

  1. public class WatermarkTextBehavior : Behavior<TextBox>
  2.     {
  3.         public static readonly DependencyProperty TextProperty =
  4.      DependencyProperty.Register(“Text”, typeof(string), typeof(WatermarkTextBehavior),
  5.                                         new FrameworkPropertyMetadata(string.Empty));
  6.         static readonly DependencyPropertyKey IsWatermarkedPropertyKey =
  7.             DependencyProperty.RegisterAttachedReadOnly(“IsWatermarked”, typeof(bool), typeof(WatermarkTextBehavior),
  8.                                         new FrameworkPropertyMetadata(false));
  9.         public static readonly DependencyProperty IsWatermarkedProperty = IsWatermarkedPropertyKey.DependencyProperty;
  10.         public static bool GetIsWatermarked(TextBox tb)
  11.         {
  12.             return (bool)tb.GetValue(IsWatermarkedProperty);
  13.         }
  14.         public bool IsWatermarked
  15.         {
  16.             get { return GetIsWatermarked(AssociatedObject); }
  17.             private set { AssociatedObject.SetValue(IsWatermarkedPropertyKey, value); }
  18.         }
  19.         public string Text
  20.         {
  21.             get { return (string)base.GetValue(TextProperty); }
  22.             set { base.SetValue(TextProperty, value); }
  23.         }
  24.     

Una vez creadas las propiedades que necesitamos, debemos de sobrescribir los metodos OnAttached y OnDetaching estos métodos son lanzados cuando asignamos un behavior a un elemento y cuando lo quitamos. En nuestro caso lo que haremos sera subscribirnos a los eventos LostFocus y GotFocus, para ello los behavior tiene una propiedad que es AssociatedObject que contiene el objeto al cual se ha asignado el behavior.

 

  1. protected override void OnAttached()
  2.         {
  3.             base.OnAttached();
  4.             AssociatedObject.GotFocus += OnGotFocus;
  5.             AssociatedObject.LostFocus += OnLostFocus;
  6.             OnLostFocus(null, null);
  7.         }
  8.       
  9.         protected override void OnDetaching()
  10.         {
  11.             base.OnDetaching();
  12.             AssociatedObject.GotFocus -= OnGotFocus;
  13.             AssociatedObject.LostFocus -= OnLostFocus;
  14.         }

 

Ya solo queda implementar esta funcionalidad

  1. private void OnGotFocus(object sender, RoutedEventArgs e)
  2.         {
  3.             if (string.Compare(AssociatedObject.Text, this.Text, StringComparison.OrdinalIgnoreCase) == 0)
  4.             {
  5.                 AssociatedObject.Text = string.Empty;
  6.                 IsWatermarked = false;
  7.             }
  8.         }
  9.         private void OnLostFocus(object sender, RoutedEventArgs e)
  10.         {
  11.             if (string.IsNullOrEmpty(AssociatedObject.Text))
  12.             {
  13.                 AssociatedObject.Text = this.Text;
  14.                 IsWatermarked = true;
  15.             }
  16.         

Este seria nuestro primer behavior para utilizarlo ahora desde el Blend abrimos el proyecto y en Assets

 

image

Vemos la galería de behavior que vienen con Blend 3 además del que acabamos de crear, lo seleccionamos y lo arrastramos al objeto que queremos asignar, pero no a la ventana sino a la pestaña de Objects adnTimeline

image

 

Seleccionando el Behavior

image

 

Vemos que nos aparece en sus propiedades la que hemos configurado en nuestro caso el texto de la marca de agua

 

image

 

 

 

El Xaml nos quedaría

 

  1. <Window    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”    xmlns:i=”clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity” xmlns:local=”clr-namespace:TestWpfApp”    x:Class=”TestWpfApp.Window3″    x:Name=”Window”    Title=”Window3″    Width=”640″ Height=”480″>    <Grid x:Name=”LayoutRoot”>        <TextBox x:Name=”txtText” Margin=”69,44,256,0″ VerticalAlignment=”Top” Height=”34″ TextWrapping=”Wrap”>            <i:Interaction.Behaviors>                <local:WatermarkTextBehavior Text=”Prueba”/>            </i:Interaction.Behaviors>        </TextBox>    </Grid>Window>
  2. </

 

Sencillo de crear y de utilizar.

2 comentarios en “Behaviors en WPF”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *