miércoles, 27 de febrero de 2013

Ventana Popup En Control WPF

Para asignar una ventana popup a un control, se puede realizar la siguiente lógica. En nuestro ejemplo vamos a mostrar una ventana popup para un boton, osea al dar clic en el botón se mostrara  la ventana.
El código para mostrar la ventana se agrega en el evento clic del botón:


private void Boton_Click(object sender, System.Windows.Input.ExecutedRoutedEventArgs e)
        {
            try
            {
                Dictionary<string, string> paramUserControl = new Dictionary<string, string>();
                paramUserControl.Add("unParametro");

                //Instanciamos el control wpf que va a mostrar la información.
                UCExample u = new UCExample ();
                u.SetContext(paramStateTreatment);

                //Instanciamos la ventana contenedora del control
                Popup popup = new Popup()
                {
                    Child = u,
                    AllowsTransparency = true,
                    StaysOpen = true,
                    IsOpen = false,
                    PlacementTarget = ((System.Windows.Controls.Control)(e.OriginalSource)),
                    Placement = PlacementMode.Left
                };

                //Binding para setear la propiedad "Width" del contenedor con la ventana de la información
                Binding widthBinding = new Binding("Width") { Mode = BindingMode.OneWay, Source = popup };
                ((FrameworkElement)u).SetBinding(WidthProperty, widthBinding);

                 //Le damos un tiempo para mostrar la ventana
                DispatcherTimer activeTimer = new DispatcherTimer { Interval = new TimeSpan(0,0,7) };
                activeTimer.Tick += (obj, ea) => ClosePopup(popup);
                activeTimer.Start();

                popup.IsOpen = true;
                return;
            }
            catch (Exception)
            {
                throw;
            }
        }

Dentro de una ventana popup puede ir cualquier template. El código del usercontrol que va a ir dentro de la ventana popup, es el siguiente:

XAML

<UserControl x:Class="Servinte.Clinic.Controls.UCSeeTreatmentStatus"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d" Height="Auto" Width="Auto">
    <UserControl.Resources>
        <Style TargetType="Label" x:Key="lblControl">
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
        </Style>
        <Style TargetType="TextBlock" x:Key="txtbControl">
            <Setter Property="HorizontalAlignment" Value="Left"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
        </Style>
    </UserControl.Resources>
    <Border Background="White" BorderBrush="Black" BorderThickness="2">
        <Grid Margin="5">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Label Content="Nombre " Style="{StaticResource lblControl}"/>
            <TextBlock Grid.Column="1" Name="txtbName" Style="{StaticResource txtbControl}"/>
            <Label Grid.Row="1" Content="Apellidos " Style="{StaticResource lblControl}"/>
            <TextBlock Grid.Row="1" Grid.Column="1" Name="txtbLastName" Style="{StaticResource txtbControl}"/>
            <Label Grid.Row="2" Content="Profesión " Style="{StaticResource lblControl}"/>
            <TextBlock Grid.Row="2" Grid.Column="1" Name="txtbProfession" Style="{StaticResource txtbControl}"/>
            <Label Grid.Row="3" Content="Fecha Nacimiento " Style="{StaticResource lblControl}"/>
            <TextBlock Grid.Row="3" Grid.Column="1" Name="txtbDateBorn" Style="{StaticResource txtbControl}"/>
        </Grid>
    </Border>
</UserControl>


C#

using System.Collections.Generic;
using System.Windows.Controls;

namespace MyNamespace.Controls
{
    /// <summary>
    /// Interaction logic for UCExample.xaml
    /// </summary>
    public partial class UCExample : UserControl
    {
        public UCExample()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Seteamos el contexto de la ventana que informa los datos de la persona
        /// </summary>
        public void SetContext(Dictionary<string,string> param)
        {           
            //Nombre
            txtbName.Text = string.Format(": {0}", param["Name"]);
            //Apellidos
            txtbLastName.Text = string.Format(": {0}", param["LastName"]);
            //Profesion
            txtbProfession.Text = string.Format(": {0}", param["Profesion"]);
            //Fecha de nacimiento
            txtbDateBorn.Text = string.Format(": {0}",param["DateBorn"]));           
        }
    }
}



No hay comentarios: