Custom Control WPF II

lunes, 17 de septiembre de 2012

Continuando con el artículo anterior, vamos a insertar el control que hemos creado y personalizado en el diccionario de recursos, a la aplicación.

Para ello, referenciamos el namespace al marcado, como antes, con el prefijo "local" e insertamos el objeto en el punto de la aplicación que deseemos.

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Grid Background="AliceBlue">
        <local:CustomControl Style="{DynamicResource CustomCtrlv1}" Text="@rfcm83"
                             Clicks="0 clicks" HorizontalAlignment="Center" VerticalAlignment="Center">
            <local:CustomControl.Icon>
                <Image Source="twitter.png"/>
            </local:CustomControl.Icon>
        </local:CustomControl>
    </Grid>
</Window>

Es fundamental explicar que para que el control tenga el diseño que hemos creado, hay que referenciarlo dinámicamente al estilo creado, y después introducir las distintas propiedades que hemos creado. Para el texto he puesto "@rfcm83", para el contador he introducido un texto que dice "0 clicks" y luego una imagen de twitter, que previamente he introducido al proyecto. Las propiedades de alineación vertical y horizontal, es para que el control salga en el centro de la pantalla, pero esto es totalmente opcional.

Aunque he establecido un valor a la propiedad "Clicks", lo lógico es que esta propiedad se actualice con cada click que se realiza en la aplicación, para ello, hay que implementar la interfaz INotifyPropertyChanged de System.ComponentModel, la cual va a gestionar los cambios en la propiedad "Clicks" y relacionar esta propiedad con una que implementemos en el code behind. Además, es necesario crear un evento MouseLeftButtonDown sobre el control, para que se desencadene finalmente la modificación de la propiedad "Clicks".

Implementamos el código fuente, empezando por implementar los miembros de la interfaz INotifyPropertyChanged. Después creamos la propiedad pública "ClicksTxt", la cual va a ser la que que notifique el cambio, y modifique el texto del control. Por último creamos el evento MouseLeftButtonDown de nuestro control, y este se ocupará de modificar la propiedad, incrementando un contador en el código.

using System;
using System.Windows;
using System.Windows.Input;
using System.ComponentModel;

namespace WpfApplication1
{
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private const string ClickStr = "{0} click(s)";
        private int _nClicks = 0;
        private string _clicksTxt;
        public String ClicksTxt
        {
            get { return _clicksTxt; }
            set
            {
                _clicksTxt = value;
                NotifyChange("ClicksTxt");
            }
        }

        public MainWindow()
        {
            InitializeComponent();
        }

        private void BtnCControlClick(object sender, MouseButtonEventArgs e)
        {
            _nClicks++;
            ClicksTxt = String.Format(ClickStr, _nClicks);
        }
        
        private void NotifyChange(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
    }
}

A continuación vamos al diseñador, y modificamos el control, agregándole un evento y modificando la propiedad "Clicks" del control, enlazándola a la propiedad que hemos creado en el code behind ("ClicksTxt").

        <local:CustomControl x:Name="BtnCControl" Style="{DynamicResource CustomCtrlv1}" Text="@rfcm83"
                             Clicks="{Binding ClicksTxt, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
                             HorizontalAlignment="Center" VerticalAlignment="Center"
                             MouseLeftButtonDown="BtnCControlClick">
            <local:CustomControl.Icon>
                <Image Source="twitter.png"/>
            </local:CustomControl.Icon>
        </local:CustomControl>

Una vez realizados estos cambios, el control debería incrementar el número de clicks que se vayan pulsando sobre el objeto.

Botón sin iniciar

Al arrancar, tendríamos el control sin ningún texto, pues la propiedad no estará iniciada, después de hacer clicks tendremos algo como esto.

Botón iniciado

 

Deja un comentario

Buscar

Search