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"]));
}
}
}