Академический Документы
Профессиональный Документы
Культура Документы
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Crear el proyecto
El primer paso consiste en crear el proyecto para la aplicación.
Para crear el proyecto
1. Cree un nuevo proyecto de aplicación de WPF en Visual Basic o en Visual C#
denominado FolderExplorer. Para obtener más información, vea Cómo: Crear
un nuevo proyecto de aplicación de WPF.
MainWindow.xaml se abrirá en WPF Designer.
2. En la Vista de diseño, seleccione la ventana. Para obtener más información,
vea Cómo: Seleccionar y mover elementos en la superficie de diseño.
3. En la ventana Propiedades, establezca el valor de la propiedad Title en Folder
Explorer.
Crear el diseño
El diseño define cómo se organizan los controles en la ventana principal de la
aplicación. En los pasos siguientes se muestra cómo construir los elementos de diseño
que contendrán los controles de la aplicación.
Para crear el diseño
1. Seleccione el control Grid raíz en la ventana.
2. Agregue una segunda fila a la cuadrícula. Para obtener más información, vea
Cómo: Agregar filas y columnas a una cuadrícula.
3. Agregue una segunda columna a la cuadrícula.
Propiedad. Valor
Grid.ColumnSpan 1
Grid.RowSpan 2
Alto Auto
HorizontalAlignment Stretch
Margin 0,0,0,0
VerticalAlignment Stretch
Ancho Auto
3. El control TreeView cambia de tamaño para ajustarse a la primera columna de
la cuadrícula y abarcar las dos filas de esta última.
4. Seleccione los dos controles ListView.
5. En la ventana Propiedades, establezca las propiedades siguientes tal y como
se indica.
Propiedad. Valor
Grid.ColumnSpan 1
Grid.RowSpan 1
Alto Auto
HorizontalAlignment Stretch
Margin 0,0,0,0
VerticalAlignment Stretch
Ancho Auto
6. Los controles ListView cambian de tamaño para ajustarse a sus celdas
respectivas de la cuadrícula.
7.
8. Abra la ventana Esquema del documento. Para obtener más información, vea
Navegar en la jerarquía de elementos de un documento de WPF.
9. Expanda el nodo ColumnDefinitions de la cuadrícula.
10. Seleccione el primer elemento ColumnDefinition.
C#
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
namespace FolderExplorer
{
public class Folder
{
private DirectoryInfo _folder;
private ObservableCollection<Folder> _subFolders;
private ObservableCollection<FileInfo> _files;
public Folder()
{
this.FullPath = @"c:\";
}
set
{
if (Directory.Exists(value))
{
this._folder = new DirectoryInfo(value);
}
else
{
throw new ArgumentException("must exist",
"fullPath");
}
}
}
FileInfo[] fi = this._folder.GetFiles();
return this._files;
}
}
DirectoryInfo[] di =
this._folder.GetDirectories();
return this._subFolders;
}
}
}
}
XAML
<Window.Resources>
<HierarchicalDataTemplate
DataType = "{x:Type my:Folder}"
ItemsSource = "{Binding Path=SubFolders}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</Window.Resources>
XAML
<ListView Name="listView1"
ItemsSource="{Binding Path=SelectedItem.SubFolders,
ElementName=treeView1, Mode=OneWay}"
Grid.Column="1"
Grid.RowSpan="1" />
<ListView Name="listView2"
ItemsSource="{Binding Path=SelectedItem.Files,
ElementName=treeView1, Mode=OneWay}"
Grid.Column="1"
Grid.Row="1" />
Pasos siguientes
Actualmente, la aplicación FolderExplorer se muestra con los estilos
predeterminados. Puede aplicar sus propios estilos para cambiar el aspecto de
la aplicación y su comportamiento.
Visual Studio también proporciona numerosas herramientas para depurar la
aplicación de WPF. Para obtener más información, vea Tutorial: Depurar
controles personalizados de WPF en tiempo de diseño.
Tutorial: Crear un diseño
dinámico
[Esta documentación se proporciona solo para fines preliminares y está sujeta a
cambios en versiones posteriores. Se incluye temas en blanco como marcadores].
En posición dinámica, los elementos secundarios se organizan especificando cómo
deberían estar organizados y cómo deberían ajustarse en relación con sus elementos
primarios. También puede establecer ventanas y controles para que se expandan
automáticamente cuando su contenido se expanda. Para obtener más información,
veaDiseño con posición absoluta y dinámica.
WPF Designer para Visual Studio proporciona muchos controles Panel que admiten la
posición dinámica. Los controles de panel se pueden combinar agregando un control
de panel como elemento secundario de otro control. Puede usar los siguientes
controles de panel para colocar los elementos en sus aplicaciones dinámicamente:
Grid
DockPanel
WrapPanel
StackPanel
UniformGrid
Importante
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Crear el proyecto
El primer procedimiento es crear el proyecto para la aplicación.
Para crear el proyecto
1. Cree un nuevo proyecto de aplicación de WPF en Visual Basic o en Visual C#
denominado DynamicLayout. Para obtener más información
Note
Propiedad. Valor
Ancho 400
Alto 200
SizeToContent WidthAndHeight
Tip
Propiedad. Valor
Content Nombre:
Grid.Column 0
Grid.ColumnSpan 1
Grid.Row 0
Grid.RowSpan 1
Ancho Auto
Alto 23
HorizontalAlignment Stretch
VerticalAlignment Top
Margin 20,20,10,10
Content Password:
Grid.Column 0
Grid.ColumnSpan 1
Grid.Row 1
Grid.RowSpan 1
Ancho Auto
Alto 23
HorizontalAlignment Stretch
VerticalAlignment Top
Margin 20,10,10,10
5. En el Cuadro de herramientas, en el grupo Común, arrastre un control
TextBox hasta Grid.
6. En la ventana Propiedades, establezca las siguientes propiedades de TextBox:
Propiedad. Valor
Grid.Column 1
Grid.ColumnSpan 3
Grid.Row 0
Grid.RowSpan 1
Ancho Auto
Alto Auto
HorizontalAlignment Stretch
VerticalAlignment Stretch
Margin 10,20,20,10
7. En el Cuadro de herramientas, en el grupo Común, arrastre un control
TextBox hasta Grid.
8. En la ventana Propiedades, establezca las siguientes propiedades de TextBox:
Propiedad. Valor
Grid.Column 1
Grid.ColumnSpan 3
Grid.Row 1
Grid.RowSpan 1
Ancho Auto
Alto Auto
HorizontalAlignment Stretch
VerticalAlignment Stretch
Margin 10,10,20,10
9. En el Cuadro de herramientas, en el grupo Común, arrastre un control
Button hasta Grid.
10. En la ventana Propiedades, establezca las siguientes propiedades de Button:
Propiedad. Valor
Content OK
Grid.Column 2
Grid.ColumnSpan 1
Grid.Row 3
Grid.RowSpan 1
Ancho 75
Alto 23
HorizontalAlignment Stretch
VerticalAlignment Stretch
Margin 10,10,6,20
11. En el Cuadro de herramientas, en el grupo Común, arrastre un control
Button hasta Grid.
12. En la ventana Propiedades, establezca las siguientes propiedades de Button:
Propiedad. Valor
Content Cancelar
Grid.Column 3
Grid.ColumnSpan 1
Grid.Row 3
Grid.RowSpan 1
Ancho 75
Alto 23
HorizontalAlignment Stretch
VerticalAlignment Stretch
Margin 6,10,20,20
13. En el menú Archivo, haga clic en Guardar todo.
Probar el diseño
Finalmente se ejecuta la aplicación y se comprueba que el diseño cambia
dinámicamente a medida que el usuario cambia el tamaño de la ventana y a medida
que el contenido de los controles se expande más allá del tamaño de los controles.
Para probar el diseño
1. En el menú Depurar, haga clic en Iniciar depuración.
La aplicación se inicia y aparece la ventana.
2. En el cuadro de texto Nombre, escriba de forma aleatoria para rellenar el
cuadro de texto. Al llegar al fin del cuadro de texto, el cuadro de texto y la
ventana se expandirán para ajustar el texto que está escribiendo.
3. Cierre la ventana.
4. En el menú Depurar, haga clic en Iniciar depuración.
La aplicación se inicia y aparece la ventana.
5. Cambie el tamaño de la ventana tanto vertical como horizontalmente.
Las columnas se expandirán uniformemente para usar el espacio disponible.
Los cuadros de texto se ajustan para rellenar las columnas expandidas. Tres
filas mantienen su alto y la cuarta fila se expandirá para usar el espacio
disponible.
6. Cierre la ventana.
7. En la Vista de diseño, seleccione la etiqueta Nombre.
8. En la ventana Propiedades, cambie la propiedad Content a Please enter your
full name here:.
En la Vista de diseño, la etiqueta se expande para ajustar el texto.
9. En el menú Depurar, haga clic en Iniciar depuración.
La aplicación se inicia y aparece la ventana. El control de etiqueta muestra el
texto más largo.
10. Cierre la ventana.
Resultado final
A continuación se muestra el archivo MainWindow.xaml completo:
XAML
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="200" Width="400"
SizeToContent="WidthAndHeight">
<Grid ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Grid.Row="0" Margin="20,20,10,10"
Width="Auto" Height="23" HorizontalAlignment="Stretch"
VerticalAlignment="Top" Name="Label1">Name:</Label>
<Label Grid.Column="0" Grid.Row="1" Margin="20,10,10,10"
Width="Auto" Height="23" HorizontalAlignment="Stretch"
VerticalAlignment="Top" Name="Label2">Password:</Label>
<TextBox Grid.Column="1" Grid.Row="0" Margin="10,20,20,10"
Grid.ColumnSpan="3" Height="Auto" VerticalAlignment="Stretch"
Name="TextBox1" />
<TextBox Grid.Column="1" Grid.Row="1" Margin="10,10,20,10"
Grid.ColumnSpan="3" Name="TextBox2" />
<Button Grid.Column="2" Grid.Row="3" Margin="10,10,6,20"
Width="75" Height="23" HorizontalAlignment="Stretch"
Name="Button1">OK</Button>
<Button Grid.Column="3" Grid.Row="3" Margin="6,10,20,20"
Width="75" Height="23" Name="Button2">Cancel</Button>
</Grid>
</Window>
Pasos siguientes
Puede realizar pruebas para aprender a lograr diferentes efectos con diseños
dinámicos reemplazando el panel Grid de este tutorial por los paneles siguientes:
DockPanel
WrapPanel
StackPanel
UniformGrid
Tutorial: Crear una aplicación cuyo
tamaño pueda ser modificado
mediante WPF Designer
[Esta documentación se proporciona solo para fines preliminares y está sujeta a
cambios en versiones posteriores. Se incluye temas en blanco como marcadores].
Puede utilizar el control GridSplitter junto con el control contenedor Grid para crear
diseños de ventanas cuyo tamaño pueda ajustar el usuario en tiempo de ejecución.
Por ejemplo, en una aplicación que tiene una interfaz dividida en áreas, el usuario
puede arrastrar un divisor para agrandar una de ellas, dependiendo de la que desee
ver mejor.En este tutorial se crea el diseño para una aplicación como las de mensajería.
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Crear el proyecto
El primer procedimiento es crear el proyecto para la aplicación.
Para crear el proyecto
1. Cree un nuevo proyecto de aplicación de WPF en Visual Basic o en Visual C#
denominado ResizableApplication. Para obtener más información,
Note
Propiedad. Valor
ResizeDirection Filas
Grid.Column 0
Grid.ColumnSpan 1
Grid.Row 1
Grid.RowSpan 1
Ancho Auto
Alto 10
HorizontalAlignment Stretch
VerticalAlignment Stretch
Margin 0
4. En el menú Archivo, haga clic en Guardar todo.
Propiedad. Valor
Grid.Column 0
Grid.ColumnSpan 1
Grid.Row 0
Grid.RowSpan 1
LastChildFill True (activada)
Ancho Auto
Alto Auto
HorizontalAlignment Stretch
VerticalAlignment Stretch
Margin 0
4. En el Cuadro de herramientas, arrastre un control Label hasta DockPanel.
5. En la ventana Propiedades, establezca las siguientes propiedades de Label:
Propiedad. Valor
Content Display
DockPanel.Dock Top
Ancho Auto
Alto 23
HorizontalAlignment Stretch
VerticalAlignment Stretch
Margin 0
6. En la vista Diseño, seleccione DockPanel.
Tip
Propiedad. Valor
DockPanel.Dock Bottom
Ancho Auto
Alto Auto
HorizontalAlignment Stretch
VerticalAlignment Stretch
Margin 0
Propiedad. Valor
Grid.Column 0
Grid.ColumnSpan 1
Grid.Row 2
Grid.RowSpan 1
Ancho Auto
Alto Auto
HorizontalAlignment Stretch
VerticalAlignment Stretch
Margin 0
4. En la ventana Propiedades, busque la propiedad ColumnDefinitions y haga
clic en el botón de puntos suspensivos en la columna de valores de propiedad.
Aparecerá el Editor de colecciones.
5. Haga clic en Agregar dos veces para agregar dos columnas.
6. Establezca la propiedad Width de la segunda columna en Auto.
7. Haga clic en Aceptar para cerrar el Editor de colecciones y volver a WPF
Designer.
8. Desde el Cuadro de herramientas, arrastre un control Button hasta Grid.
9. En la ventana Propiedades, establezca las siguientes propiedades de Button:
Propiedad. Valor
Content OK
Grid.Column 1
Grid.ColumnSpan 1
Grid.Row 0
Grid.RowSpan 1
Ancho 60
Alto 60
HorizontalAlignment Stretch
VerticalAlignment Stretch
Margin 5
10. En el Cuadro de herramientas, arrastre un control RichTextBox hasta Grid.
11. En la ventana Propiedades, establezca las siguientes propiedades de
RichTextBox:
Propiedad. Valor
Grid.Column 0
Grid.ColumnSpan 1
Grid.Row 0
Grid.RowSpan 1
Ancho Auto
Alto Auto
HorizontalAlignment Stretch
VerticalAlignment Stretch
Margin 0
Probar la aplicación
El último procedimiento consiste en probar la aplicación.
Para probar la aplicación
1. En el menú Depurar, haga clic en Iniciar depuración.
La aplicación se iniciará y aparecerá MainWindow.
2. Cambie el tamaño de la ventana tanto vertical como horizontalmente.
Las mitades superior e inferior de la aplicación se expanden y contraen para
utilizar el espacio disponible.
3. Arrastre el divisor para cambiar el tamaño de las partes de la aplicación.
Reduzca mucho una parte de la aplicación.
4. Cambie de nuevo el tamaño de la ventana.
Las mitades superior e inferior de la aplicación se expanden y contraen
proporcionalmente de acuerdo con la ubicación del divisor.
5. Arrastre el divisor tanto como pueda hacia la parte superior de la aplicación.
La mitad superior de la aplicación desaparece y se muestra la mitad inferior.
6. Arrastre el divisor tanto como pueda hacia la parte inferior de la aplicación.
La mitad inferior de la aplicación se sigue mostrando. Esto se debe a que
estableció la propiedad MinHeight de la tercera fila en 70.
Note
70 = 60 (el alto del botón) + 5 (el margen superior del botón) + 5 (el
margen inferior del botón)
1. Cierre la ventana.
Resultado final
A continuación se muestra el archivo MainWindow.xaml completo:
XAML
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
<RowDefinition MinHeight="70" />
</Grid.RowDefinitions>
<DockPanel Grid.Row="0" Grid.RowSpan="1"
HorizontalAlignment="Stretch" Margin="0" Name="DockPanel1">
<Label DockPanel.Dock="Top" Height="23" Width="Auto"
Background="Blue" Foreground="White" Name="Label1">Display</Label>
<RichTextBox DockPanel.Dock="Bottom" Height="Auto"
Width="Auto" Background="LightBlue" IsReadOnly="True"
Name="RichTextBox1" />
</DockPanel>
<GridSplitter Grid.Row="1" Grid.RowSpan="1"
ResizeDirection="Rows" Width="Auto" Height="10"
HorizontalAlignment="Stretch" Margin="0" Name="GridSplitter1" />
<Grid Grid.Row="2" HorizontalAlignment="Stretch" Margin="0"
Name="Grid1">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button Grid.Column="1" HorizontalAlignment="Stretch"
Margin="5" Width="60" Height="60" Name="Button1">OK</Button>
<RichTextBox Grid.Column="0" Grid.ColumnSpan="1"
HorizontalAlignment="Stretch" Margin="0" Background="PaleGoldenrod"
Name="RichTextBox2" />
</Grid>
</Grid>
</Window>
Pasos siguientes
La aplicación que creó en este tutorial contenía un divisor horizontal. Puede
experimentar creando la misma aplicación pero con un divisor vertical.
La aplicación creada muestra únicamente técnicas de diseño. Puede experimentar
agregando código que haga que la aplicación sea funcional. Por ejemplo, puede
agregar código al evento clic de botón para que se copie el texto del cuadro de texto
inferior en el cuadro de texto superior.
Tutorial: Crear un enlace de
datos mediante WPF Designer
[Esta documentación se proporciona solo para fines preliminares y está sujeta a
cambios en versiones posteriores. Se incluye temas en blanco como marcadores].
En este tutorial se muestra cómo usar WPF Designer para Visual Studio para crear
enlaces de datos que conectan los datos a un control.
Cuando haya terminado, tendrá un cuadro de lista que se enlaza a una lista de
estudiantes. Para cada uno de los elementos de dicho cuadro, se muestra un cuadrado
coloreado que indica si el estudiante está inscrito actualmente.
Note
Para enlazar a los datos de una conexión de datos, use la ventana Orígenes
de datos. Para obtener más información, vea Enlazar controles WPF a datos
en Visual Studio.
Note
Crear el proyecto
El primer paso consiste en crear el proyecto de aplicación WPF y agregar el origen de
datos. El origen de datos es un objeto ObservableCollection<T> que contiene
instancias de una clase Student simple. El proyecto también tiene un objeto
IValueConverter y un objeto DataTemplate personalizado para aplicar estilo al control
ListBox.
Para crear el proyecto
1. Cree un nuevo proyecto de aplicación WPF en Visual Basic o en Visual C#
denominado DataBindingDemo. Para obtener más información, vea Cómo:
Crear un nuevo proyecto de aplicación de WPF.
MainWindow.xaml se abrirá en WPF Designer.
2. Agregue al proyecto una nueva clase denominada Student. Para obtener más
información, vea How to: Add New Project Items.
3. Reemplace el código generado automáticamente por el código siguiente.
C#
using System;
using System.Collections.ObjectModel;
using System.Windows;
namespace DataBindingDemo
{
// Student is a simple class that stores a name and an
// IsEnrolled value.
public class Student
{
// The default constructor is required for creation
from XAML.
public Student()
{
}
// The StudentName property is a string that holds the
first and last name.
public string StudentName { get; set; }
}
}
C#
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Windows.Media;
namespace DataBindingDemo
{
// The BoolToBrushConverter class is a value converter
// that helps to bind a bool value to a brush property.
[ValueConversion(typeof(bool), typeof(Brush))]
public class BoolToBrushConverter : IValueConverter
{
public object Convert(
object value,
Type targetType,
object parameter,
CultureInfo culture)
{
Brush b = null;
return b;
}
// Not used.
public object ConvertBack(
object value,
Type targetType,
object parameter,
CultureInfo culture)
{
return null;
}
}
}
6. Compile el proyecto.
7. Abra MainWindow.xaml en WPF Designer.
8. Reemplace el XAML generado automáticamente por el siguiente XAML.
XAML
<Window x:Class="DataBindingDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataBindingDemo"
Title="Databinding Demo" Height="300" Width="300">
<Window.Resources>
<local:BoolToBrushConverter x:Key="boolToBrushConverter"
/>
<DataTemplate x:Key="listBoxTemplate">
<StackPanel Orientation="Horizontal" >
<Rectangle Fill="{Binding Path=IsEnrolled,
Converter={StaticResource boolToBrushConverter}}"
Height="10"
Width="10"
Margin="0,0,5,0" />
<TextBlock Text="{Binding Path=StudentName}" />
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid></Grid>
</Window
Asignar un enlace de datos
Use el objeto Binding para mostrar el elemento studentCollection en el control
ListBox. WPF Designer habilita el enlace de datos sin escribir código o XAML.
Para enlazar el control ListBox al origen de datos
1. Desde el Cuadro de herramientas, arrastre un control ListBox hasta Window.
2. En la ventana Propiedades, desplácese a la propiedad ItemsSource.
3. En el borde de la columna izquierda, haga clic en el marcador de propiedad
().
Aparece un menú.
Tip
Note
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Visual Studio 2010.
Crear el proyecto
El primer paso consiste en crear un proyecto de aplicación WPF y habilitar las
propiedades en tiempo de diseño.
Para crear el proyecto
1. Cree un nuevo proyecto de aplicación WPF en Visual Basic o en Visual C#
denominado DataBindingDemo. Para obtener más información
MainWindow.xaml se abrirá en WPF Designer.
2. En la Vista de diseño, haga clic en la etiqueta de tamaño de raíz () que aparece
en la parte inferior derecha de MainWindow para establecer la opción de ajuste
de tamaño automático para el tamaño raíz.
En la vista XAML, el diseñador agrega la asignación del espacio de nombres d,
que habilita el acceso a los atributos en tiempo de diseño, como
DesignHeight yDesignInstance.
Note
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DataBindingDemo
{
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
Establecer el contexto de datos en tiempo de
diseño
Para crear los enlaces de datos mediante el generador de enlace de datos, debe crear
un contexto de datos en tiempo de diseño especial y establecer DesignInstance en
el tipo del objeto de negocios.
Para establecer el contexto de datos en tiempo de diseño
1. Abra MainWindow.xaml en WPF Designer.
2. En la vista XAML, agregue la siguiente asignación de espacio de nombres a la
etiqueta de apertura de MainWindow. Para obtener más información, vea
Cómo: Importar un espacio de nombres a XAML.
3. xmlns:local="clr-namespace:DataBindingDemo"
4. Reemplace la etiqueta de apertura del elemento Grid por el código XAML
siguiente.
XAML
También puede hacer clic con el botón secundario en la fila para mostrar el menú.
C#
public MainWindow()
{
InitializeComponent();
this._grid.DataContext = c;
}
Importante
Este tutorial sirve como guía en los pasos necesarios para crear la
aplicación escribiendo, o copiando y pegando Lenguaje XAML en
Microsoft Visual Studio. Si prefiere aprender a usar una herramienta de
diseño (Microsoft Expression Blend) para crear la misma aplicación, vea
Tutorial: Crear un botón mediante Microsoft Expression Blend.
La figura siguiente muestra los botones acabados.
Crear botones básicos
Empecemos por crear un nuevo proyecto y agregar unos botones a la ventana.
Para crear un nuevo proyecto de WPF y agregar botones a la
ventana
1. Inicie Visual Studio.
2. Cree un nuevo proyecto de WPF: En el menú Archivo, señale a Nuevo y, a
continuación, haga clic en Proyecto. Busque la plantilla Aplicación para
Windows (WPF)y asigne al proyecto el nombre "AnimatedButton". Esto
creará el esqueleto para la aplicación.
3. Agregue los botones predeterminados básicos: la plantilla proporciona
todos los archivos que necesita para este tutorial. Abra el archivo
Window1.xaml haciendo doble clic en él en el Explorador de soluciones. De
forma predeterminada, hay un elemento Grid en Window1.xaml. Quite el
elemento Grid y agregue unos botones a la página Lenguaje XAML
escribiendo o copiando y pegando el siguiente código resaltado en
Window1.xaml:
4. <Window x:Class="AnimatedButton.Window1"
5.
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentatio
n"
6. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
7. Title="AnimatedButton" Height="300" Width="300"
8. Background="Black">
9.
10. <!-- Buttons arranged vertically inside a StackPanel. -->
11. <StackPanel HorizontalAlignment="Left">
12. <Button>Button 1</Button>
13. <Button>Button 2</Button>
14. <Button>Button 3</Button>
15. </StackPanel>
16.
17. </Window>
Presione F5 para ejecutar la aplicación; debería ver un conjunto de botones
parecido a la ilustración siguiente.
Ahora que ha creado los botones básicos, ha terminado de trabajar en el archivo
Window1.xaml. El resto del tutorial se centra en el archivo app.xaml, definiendo estilos
y una plantilla para los botones.
Hay mucho más que puede hacer con estilos, incluidas diversas maneras de
ajustar con precisión a qué objetos se destinan, especificar valores de
propiedad complejos e incluso utilizar estilos como entrada para otros estilos.
Para obtener más información, consulte Aplicar estilos y plantillas.
23. Establezca un valor de propiedad de estilo en un recurso: los recursos
permiten reutilizar fácilmente objetos y valores que se definen con frecuencia.
Es especialmente útil definir valores complejos utilizando recursos, para hacer
el código más modular. Agregue el marcado resaltado siguiente a app.xaml.
24. <Application.Resources>
25.
26. <LinearGradientBrush x:Key="GrayBlueGradientBrush"
27. StartPoint="0,0" EndPoint="1,1">
28. <GradientStop Color="DarkGray" Offset="0" />
29. <GradientStop Color="#CCCCFF" Offset="0.5" />
30. <GradientStop Color="DarkGray" Offset="1" />
31. </LinearGradientBrush>
32.
33. <Style TargetType="{x:Type Button}">
34. <Setter Property="Background"
35. Value="{StaticResource GrayBlueGradientBrush}" />
36. <Setter Property="Width" Value="80" />
37. <Setter Property="Margin" Value="10" />
38. </Style>
39.
40. </Application.Resources>
Directamente bajo el bloque Application.Resources, creó un recurso llamado
"GrayBlueGradientBrush". Este recurso define un degradado horizontal. Este
recurso se puede utilizar en cualquier parte de la aplicación como un valor de
propiedad, incluso dentro del establecedor de estilo del botón para la
propiedad Background.Ahora, todos los botones tienen un valor de propiedad
Background de este degradado.
Presione F5 para ejecutar la aplicación. Debe tener este aspecto:
Crear una plantilla que define la apariencia del
botón
En esta sección creará una plantilla que personaliza la apariencia (presentación) del
botón. La presentación del botón se compone de varios objetos, que incluyen
rectángulos y otros componentes para dar una apariencia única al botón.
Hasta ahora, el control de la apariencia de los botones de la aplicación se ha
confinado a cambiar propiedades del botón. ¿Qué ocurre si desea realizar cambios
más radicales en la apariencia del botón? Las plantillas permiten un control eficaz
sobre la presentación de un objeto. Dado que las plantillas se pueden utilizar dentro
de estilos, puede aplicar una plantilla a todos los objetos a los que se aplica el estilo
(en este tutorial, el botón).
Para utilizar la plantilla para definir la apariencia del botón
1. Configure la plantilla: dado que los controles como Button tienen una
propiedad Template, puede definir el valor de la propiedad de la plantilla igual
que los demás valores de propiedades que hemos establecido en un objeto
Style, utilizando un objeto Setter. Agregue el marcado resaltado siguiente al
estilo de botón.
2. <Application.Resources>
3.
4. <LinearGradientBrush x:Key="GrayBlueGradientBrush"
5. StartPoint="0,0" EndPoint="1,1">
6. <GradientStop Color="DarkGray" Offset="0" />
7. <GradientStop Color="#CCCCFF" Offset="0.5" />
8. <GradientStop Color="DarkGray" Offset="1" />
9. </LinearGradientBrush>
10.
11. <Style TargetType="{x:Type Button}">
12. <Setter Property="Background" Value="{StaticResource
GrayBlueGradientBrush}" />
13. <Setter Property="Width" Value="80" />
14. <Setter Property="Margin" Value="10" />
15. <Setter Property="Template">
16. <Setter.Value>
17. <!-- The button template is defined here. -->
18. </Setter.Value>
19. </Setter>
20. </Style>
21.
22. </Application.Resources>
23. Modifique la presentación del botón: en este punto, debe definir la plantilla.
Agregue el siguiente marcado resaltado: Este marcado especifica dos
elementosRectangle con bordes redondeados, seguidos por un control
DockPanel. El control DockPanel se utiliza para hospedar el objeto
ContentPresenter del botón. Un objeto ContentPresenter muestra el
contenido del botón. En este tutorial, el contenido es texto ("Button 1",
"Button 2", "Button 3"). Todos los componentes de la plantilla (los rectángulos
y el control DockPanel) se disponen dentro de un control Grid.
24. <Setter.Value>
25. <ControlTemplate TargetType="Button">
26. <Grid Width="{TemplateBinding Width}"
27. Height="{TemplateBinding Height}" ClipToBounds="True">
28.
29. <!-- Outer Rectangle with rounded corners. -->
30. <Rectangle x:Name="outerRectangle"
31. HorizontalAlignment="Stretch"
32. VerticalAlignment="Stretch"
33. Stroke="{TemplateBinding Background}"
34. RadiusX="20" RadiusY="20" StrokeThickness="5"
35. Fill="Transparent" />
36.
37. <!-- Inner Rectangle with rounded corners. -->
38. <Rectangle x:Name="innerRectangle"
39. HorizontalAlignment="Stretch"
40. VerticalAlignment="Stretch" Stroke="Transparent"
41. StrokeThickness="20"
42. Fill="{TemplateBinding Background}"
43. RadiusX="20" RadiusY="20" />
44.
45. <!-- Present Content (text) of the button. -->
46. <DockPanel Name="myContentPresenterDockPanel">
47. <ContentPresenter x:Name="myContentPresenter"
Margin="20"
48. Content="{TemplateBinding Content}"
49. TextBlock.Foreground="Black" />
50. </DockPanel>
51. </Grid>
52. </ControlTemplate>
53. </Setter.Value>
Presione F5 para ejecutar la aplicación. Debe tener este aspecto:
Resumen
En este tutorial, ha realizado los siguientes ejercicios:
Ha destinado un objeto Style a un tipo de objeto (Button).
Ha controlado propiedades básicas de los botones en toda la aplicación
utilizando el objeto Style.
Ha creado recursos tales como degradados para utilizarlos para valores de
propiedades de los establecedores de Style.
Ha personalizado la apariencia de botones de toda la aplicación aplicando una
plantilla a los botones.
Ha personalizado el comportamiento de los botones en respuesta a acciones
del usuario (tales como MouseEnter, MouseLeave y Click) incluyendo efectos
de animación.
Tutorial: Crear un botón mediante
Microsoft Expression Blend
Este tutorial le guía a lo largo del proceso de creación de un botón personalizado de
WPF mediante Microsoft Expression Blend.
Importante
Microsoft Expression Blend funciona generando Lenguaje XAML que luego se compila
para crear el programa ejecutable. Si prefiere trabajar directamente con Lenguaje XAML,
hay otro tutorial que crea la misma aplicación que este utilizando Lenguaje XAML con
Visual Studio en lugar de Blend. Para obtener más información, consulteTutorial: Crear un
botón mediante el uso de XAML.
3. Redondee las esquinas del rectángulo: arrastre los puntos de control del
rectángulo o establezca directamente las propiedades RadiusX y RadiusY.
Establezca los valores de RadiusX y RadiusY en 20.
4. Convierta el rectángulo en un botón: seleccione el rectángulo. En el menú
Herramientas, haga clic en Crear botón.
5. Especifique el ámbito del estilo o la plantilla: aparece un cuadro de diálogo
como el siguiente.
Para Nombre de recurso (clave), seleccione Aplicar a todo. Esto hará que el
estilo y la plantilla del botón resultantes se apliquen a todos los objetos que
sean botones. Para Definir en, seleccione Aplicación. Esto hará que el ámbito
del estilo y de la plantilla del botón resultantes sea toda la aplicación. Al
establecer los valores de estos dos cuadros, el estilo y la plantilla del botón se
aplicarán a todos los botones de la aplicación, y cualquier botón que cree en
la aplicación usará esta plantilla de forma predeterminada.
Nota
Nota
Nota
c. Para esta escala de tiempo, cree dos fotogramas clave, uno a los 0,0
segundos y el otro a los 0,3 segundos.
d. Con el fotograma clave de los 0,3 segundos resaltado, establezca el
Ángulo de giro en 360 grados.
Conclusión
Ya ha completado el botón personalizado. Para ello, ha utilizado una plantilla de botón
que se aplicaba a todos los botones de la aplicación. Si sale del modo de edición de
plantillas (consulte la ilustración siguiente) y crea más botones, verá que se parecen y
se comportan como el botón personalizado en lugar de como el botón
predeterminado.
Presione F5 para ejecutar la aplicación. Haga clic en los botones y observe cómo todos
ellos se comportan del mismo modo.
Recuerde que mientras estaba personalizando la plantilla, estableció la propiedad Fill
de RectánguloInterior y la propiedad Stroke de RectánguloExterior en el fondo de
plantilla ({Fondo de TemplateBinding}). Por ello, cuando establezca el color de fondo
de los botones individuales, el fondo que estableció se utilizará para las propiedades
respectivas. Pruebe a cambiar los fondos ahora. En la ilustración siguiente, se utilizan
distintos degradados. Por lo tanto, aunque una plantilla sea útil para realizar una
personalización global de controles como los botones, los controles basados en
plantillas también pueden modificarse para que sean distintos entre sí.
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Visual Studio 2012.
Acceso a una instancia en ejecución de SQL Server o SQL Server Express que
tenga adjunta la base de datos de ejemplo AdventureWorksLT2008. La base
de datos AdventureWorksLT2008 se puede descargar desde el sitio web de
CodePlex.
Para crear clases de entidad
1. Cree un nuevo proyecto de aplicación WPF en Visual Basic o C# y asígnele el
nombre DataGridSQLExample.
2. En el Explorador de soluciones, haga clic con el botón secundario en el
proyecto, elija Agregar y seleccione Nuevo elemento.
Aparecerá el cuadro de diálogo Agregar nuevo elemento.
3. En el panel Plantillas instaladas, seleccione Datos y, en la lista de plantillas,
seleccione Modelo de datos de entidad de ADO.NET.
4. Asigne al archivo el nombre AdventureWorksModel.edmx y haga clic en
Agregar.
Aparecerá el Asistente para Entity Data Model.
5. En la pantalla Elegir contenido de Model, seleccione Generar desde la base
de datos y haga clic en Siguiente.
6. En la pantalla Elegir la conexión de datos, proporcione la conexión a la base
de datos AdventureWorksLT2008. Para obtener más información, vea Cuadro
de diálogo Elegir la conexión de datos.
7. Asegúrese de que el nombre sea AdventureWorksLT2008Entities y que la
casilla Guardar configuración de conexión de la entidad en App.Config
como esté activada; a continuación, haga clic en Siguiente.
8. En la pantalla Elija los objetos de base de datos, expanda el nodo Tablas, y
seleccione las tablas Product y ProductCategory.
Puede generar clases de entidad para todas las tablas; sin embargo, en este
ejemplo solo recupera datos de esas dos tablas.
9. Haga clic en Finalizar.
Las entidades Product y ProductCategory se mostrarán en Entity Designer.
Para recuperar y presentar los datos
1. Abra el archivo MainWindow.xaml.
2. Establezca la propiedad Width del control Window en 450.
3. En el editor XAML, agregue la siguiente etiqueta DataGrid entre las etiquetas
<Grid> y </Grid> para agregar un objeto DataGrid denominado dataGrid1.
XAML
Nota
XAML
<Window x:Class="DataGridSQLExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentatio
n"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="450"
Loaded="Window_Loaded">
<Grid>
<DataGrid Name="dataGrid1" />
</Grid>
</Window>
6. Abra el archivo de código subyacente (MainWindow.xaml.vb o
MainWindow.xaml.cs) para Window.
7. Agregue el código siguiente para recuperar solo determinados valores de las
tablas combinadas y establecer la propiedad ItemsSource de DataGrid en los
resultados de la consulta.
C#
using System.Data.Objects;
using System.Linq;
using System.Windows;
namespace DataGridSQLExample
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
AdventureWorksLT2008Entities dataEntities = new
AdventureWorksLT2008Entities();
public MainWindow()
{
InitializeComponent();
}
var query =
from product in products
where product.Color == "Red"
orderby product.ListPrice
select new { product.Name, product.Color,
CategoryName = product.ProductCategory.Name, product.ListPrice
};
dataGrid1.ItemsSource = query.ToList();
}
}
}
8. Ejecute el ejemplo.
Debe aparecer un control DataGrid que muestre datos.
MIGRACION E
INTEROPERABILIDAD EN WPF
Tutorial: Hospedar un control de
Windows Forms en WPF
WPF proporciona numerosos controles con un completo conjunto de características.
Sin embargo, en ocasiones puede que prefiera utilizar controles de formularios
Windows Forms en páginas de WPF. Por ejemplo, es posible que disponga de un
importante parque de controles de formularios Windows Forms existentes, o un
control de formularios Windows Forms que proporcione una funcionalidad única.
En este tutorial se muestra cómo hospedar un control
System.Windows.Forms.MaskedTextBox de formularios Windows Forms en una página
de WPF mediante código.
Para ver una lista de código completa de las tareas mostradas en este tutorial, vea
Hosting a Windows Forms Control in WPF Sample.
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Visual Studio 2010.
XAML
<Grid Name="grid1">
</Grid>
C#
using System.Windows.Forms;
Crear el proyecto
Para iniciar el proyecto:
1. Inicie Microsoft Visual Studio y abra el cuadro de diálogo Nuevo proyecto.
2. En la categoría de ventana, seleccione la plantilla Biblioteca de controles de
Windows Forms.
3. Denomine el nuevo proyecto MyControls.
4. Para la ubicación, especifique una carpeta de nivel superior con un nombre
adecuado, por ejemplo WpfHostingWindowsFormsControl. Más adelante,
colocará la aplicación host en esta carpeta.
5. Haga clic en Aceptar para crear el proyecto. El proyecto predeterminado
contiene un solo control cuyo nombre es UserControl1.
6. En el Explorador de soluciones, cambie el nombre UserControl1 por
MyControl1.
El proyecto debe tener referencias a las siguientes DLL del sistema. Si cualquiera de
estas DLL no está incluida de forma predeterminada, agréguela al proyecto.
Sistema
System.Data
System.Drawing
System.Windows.Forms
System.Xml
Agregar controles al formulario
Para agregar controles al formulario:
Abra MyControl1 en el diseñador.
Agregue cinco controles Label y sus controles TextBox correspondientes, con los
tamaños y la organización indicados en la ilustración anterior, en el formulario. En el
ejemplo, los controles TextBox tienen los nombres siguientes:
txtName
txtAddress
txtCity
txtState
txtZip
Agregue dos controles Button con las etiquetas Aceptar y Cancelar. En el ejemplo, los
nombres de botón son btnOK y btnCancel, respectivamente.
Implementar el código de compatibilidad
Abra el formulario en la vista de código. El control devuelve los datos recolectados al
host provocando el evento OnButtonClick personalizado. Los datos están contenidos
en el objeto de argumento de evento. En el siguiente código se muestra la declaración
del evento y el delegado.
Agregue el código siguiente a la clase MyControl1.
C#
Cuando el usuario hace clic en el botón Aceptar o Cancelar, los controladores del
evento Click crean un objeto MyControlEventArgs que contiene los datos y provoca
el evento OnButtonClick. La única diferencia entre los dos controladores es la
propiedad IsOK del argumento de evento. Esta propiedad permite al host determinar
en qué botón se hizo clic. Se establece en true para el botón Aceptar y en false para
el botón Cancelar. En el siguiente código se muestran los controladores de los dos
botones.
Agregue el código siguiente a la clase MyControl1.
C#
txtName.Text,
txtAddress.Text,
txtCity.Text,
txtState.Text,
txtZip.Text);
OnButtonClick(this, retvals);
}
private void btnCancel_Click(object sender, System.EventArgs e)
{
MyControlEventArgs retvals = new MyControlEventArgs(false,
txtName.Text,
txtAddress.Text,
txtCity.Text,
txtState.Text,
txtZip.Text);
OnButtonClick(this, retvals);
}
Crear el proyecto
Para iniciar el proyecto:
1. Abra Visual Studio y seleccione Nuevo proyecto.
2. En la categoría de ventana, seleccione la plantilla Aplicación WPF.
3. Denomine el nuevo proyecto WpfHost.
4. Para la ubicación, especifique la misma carpeta de nivel superior que contiene
el proyecto MyControls.
5. Haga clic en Aceptar para crear el proyecto.
También debe agregar referencias a la DLL que contiene MyControl1 y a otros
ensamblados.
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse
en el nombre del proyecto y seleccione Agregar referencia.
2. Haga clic en la pestaña Examinar y busque la carpeta que contiene
MyControls.dll. Para este tutorial, esta carpeta es MyControls\bin\Debug.
3. Seleccione MyControls.dll y, a continuación, haga clic en Aceptar.
4. Agregue una referencia al ensamblado WindowsFormsIntegration, que se
denomina WindowsFormsIntegration.dll.
Implementar el diseño básico
La interfaz de usuario (UI) de la aplicación host se implementa en MainWindow.xaml.
Este archivo contiene el marcado de Lenguaje XAML que define el diseño y hospeda el
control de formularios Windows Forms. La aplicación está dividida en tres áreas:
El panel Control Properties (Propiedades del control), que contiene una
colección de botones de opción que puede utilizar para modificar varias
propiedades del control hospedado.
El panel Data from Control (Datos del control) que contiene varios elementos
TextBlock que muestran los datos devueltos del control hospedado.
El propio control hospedado.
El diseño básico se muestra en el código XAML siguiente. El marcado que se necesita
para hospedar MyControl1 se omite en este ejemplo, pero se explicará más adelante.
Reemplace el XAML de MainWindow.xaml con lo siguiente. Si utiliza Visual Basic,
cambie el nombre de la clase a x:Class="MainWindow".
XAML
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfHost.MainWindow"
xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
Loaded="Init">
<DockPanel>
<DockPanel.Resources>
<Style x:Key="inlineText" TargetType="{x:Type Inline}">
<Setter Property="FontWeight" Value="Normal"/>
</Style>
<Style x:Key="titleText" TargetType="{x:Type TextBlock}">
<Setter Property="DockPanel.Dock" Value="Top"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Margin" Value="10,5,10,0"/>
</Style>
</DockPanel.Resources>
<StackPanel Orientation="Vertical"
DockPanel.Dock="Left"
Background="Bisque"
Width="250">
<TextBlock Margin="10,10,10,10"
FontWeight="Bold"
FontSize="12">Control Properties</TextBlock>
<TextBlock Style="{StaticResource titleText}">Background
Color</TextBlock>
<StackPanel Margin="10,10,10,10">
<RadioButton Name="rdbtnOriginalBackColor"
IsChecked="True"
Click="BackColorChanged">Original</RadioButton>
<RadioButton Name="rdbtnBackGreen"
Click="BackColorChanged">LightGreen</RadioButton>
<RadioButton Name="rdbtnBackSalmon"
Click="BackColorChanged">LightSalmon</RadioButton>
</StackPanel>
<WindowsFormsHost Name="wfh"
DockPanel.Dock="Top"
Height="300">
<mcl:MyControl1 Name="mc"/>
</WindowsFormsHost>
<StackPanel Orientation="Vertical"
Height="Auto"
Background="LightBlue">
<TextBlock Margin="10,10,10,10"
FontWeight="Bold"
FontSize="12">Data From Control</TextBlock>
<TextBlock Style="{StaticResource titleText}">
Name: <Span Name="txtName" Style="{StaticResource
inlineText}"/>
</TextBlock>
<TextBlock Style="{StaticResource titleText}">
Street Address: <Span Name="txtAddress"
Style="{StaticResource inlineText}"/>
</TextBlock>
<TextBlock Style="{StaticResource titleText}">
City: <Span Name="txtCity" Style="{StaticResource
inlineText}"/>
</TextBlock>
<TextBlock Style="{StaticResource titleText}">
State: <Span Name="txtState" Style="{StaticResource
inlineText}"/>
</TextBlock>
<TextBlock Style="{StaticResource titleText}">
Zip: <Span Name="txtZip" Style="{StaticResource
inlineText}"/>
</TextBlock>
</StackPanel>
</DockPanel>
</Window>
El primer elemento StackPanel contiene varios conjuntos de controles RadioButton
que permiten modificar diversas propiedades predeterminadas del control hospedado.
A continuación, hay un elemento WindowsFormsHost en el que se hospeda
MyControl1. El último elemento StackPanel contiene varios elementos TextBlock que
muestran los datos devueltos por el control hospedado. El orden de los elementos y
los valores de atributo de Dock y Height incrustan el control hospedado en la ventana
sin dejar separaciones ni provocar distorsión.
Hospedar el control
La versión editada siguiente del XAML anterior se centra en los elementos que se
necesitan para hospedar MyControl1.
XAML
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfHost.MainWindow"
xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
Loaded="Init">
<WindowsFormsHost Name="wfh"
DockPanel.Dock="Top"
Height="300">
<mcl:MyControl1 Name="mc"/>
</WindowsFormsHost>
Los atributos de asignación del espacio de nombres xmlns crean una referencia al
espacio de nombres MyControls que contiene el control hospedado. Esta asignación
permite representar MyControl1 en XAML como <mcl:MyControl1>.
Dos elementos del XAML controlan el hospedaje:
WindowsFormsHost representa el elemento WindowsFormsHost que permite
hospedar un control de formularios Windows Forms en una aplicación WPF.
mcl:MyControl1, que representa a MyControl1, se agrega a la colección de
elementos secundarios del elemento WindowsFormsHost. Por consiguiente,
este control de formularios Windows Forms se presenta como parte de la
ventana de WPF y es posible comunicarse con el control desde la aplicación.
Implementar el archivo de código subyacente
El archivo de código subyacente, MainWindow.xaml.vb o MainWindow.xaml.cs,
contiene el código de procedimiento que implementa la funcionalidad de la interfaz
de usuario descrito en la sección anterior. Las principales tareas son:
Asociar un controlador al evento OnButtonClick de MyControl1.
Modificar diversas propiedades de MyControl1, basándose en cómo se
establezca la colección de botones de opción.
Mostrar los datos recolectados por el control.
Inicializar la aplicación
El código de inicialización está contenido en un controlador para el evento Loaded de
la ventana y adjunta un controlador al evento OnButtonClick del control.
En MainWindow.xaml.vb o MainWindow.xaml.cs, agregue el código siguiente a la clase
MainWindow.
using MyControls;
Controlar el evento OnButtonClick
MyControl1 provoca el evento OnButtonClick cuando el usuario hace clic en
cualquiera de los botones del control.
Agregue el código siguiente a la clase MainWindow.
C#
if (args.IsOK)
{
txtName.Inlines.Add( " " + args.MyName );
txtAddress.Inlines.Add( " " + args.MyStreetAddress );
txtCity.Inlines.Add( " " + args.MyCity );
txtState.Inlines.Add( " " + args.MyState );
txtZip.Inlines.Add( " " + args.MyZip );
}
}
Los datos de los cuadros de texto se empaquetan en el objeto MyControlEventArgs.
Si el usuario hace clic en el botón Aceptar botón, el controlador de eventos extrae los
datos y los muestra en el panel situado debajo de MyControl1.
Modificar las propiedades del control
El elemento WindowsFormsHost expone algunas de las propiedades predeterminadas
de control hospedado. Por consiguiente, puede cambiar el aspecto del control para
adaptarlo mejor al estilo de la aplicación. Los conjuntos de botones de opción del
panel izquierdo permiten al usuario modificar varias propiedades de color y
fuente.Cada conjunto de botones tiene un controlador para el evento Click, que
detecta qué botón selecciona el usuario y cambia la propiedad correspondiente del
control.
Agregue el código siguiente a la clase MainWindow.
C#
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Visual Studio 2010.
Implementar el control compuesto de WPF
Crear el proyecto
Para iniciar el proyecto:
1. Inicie Microsoft Visual Studio y abra el cuadro de diálogo Nuevo proyecto.
2. En Visual C# y la categoría de Windows, seleccione la plantilla Biblioteca de
controles de usuario de WPF.
3. Denomine el nuevo proyecto MyControls.
4. Para la ubicación, especifique una carpeta de nivel superior con un nombre
adecuado, por ejemplo WindowsFormsHostingWpfControl. Más adelante,
colocará la aplicación host en esta carpeta.
5. Haga clic en Aceptar para crear el proyecto. El proyecto predeterminado
contiene un solo control cuyo nombre es UserControl1.
6. En el Explorador de soluciones, cambie el nombre UserControl1 por
MyControl1.
El proyecto debe tener referencias a las siguientes DLL del sistema. Si cualquiera de
estas DLL no se incluye de forma predeterminada, agréguela al proyecto.
PresentationCore
PresentationFramework
Sistema
WindowsBase
Crear la interfaz de usuario
El elemento interfaz de usuario (UI) del control compuesto se implementa mediante
Lenguaje XAML. El control compuesto interfaz de usuario consta de cinco
elementosTextBox. Cada elemento TextBox tiene un elemento TextBlock asociado que
actúa como una etiqueta. Hay dos elementos Button en la parte inferior, Aceptar y
Cancelar.Cuando el usuario hace clic en cualquiera de los botones, el control genera
un evento personalizado para devolver la información al host.
Diseño básico
Los diversos elementos interfaz de usuario se contienen en un elemento Grid. Puede
utilizar Grid para organizar el contenido del control compuesto de manera muy similar
a como utilizaría un elemento Table en HTML. WPF también tiene un elemento Table,
pero Grid es más ligero y más adecuado para las tareas sencillas de diseño.
El siguiente código XAML muestra el diseño básico. Este código XAML define la
estructura global del control especificando el número de columnas y filas del
elementoGrid.
En MyControl1.xaml, reemplace el XAML existente por el siguiente XAML.
XAML
<Grid
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyControls.MyControl1"
Background="#DCDCDC"
Width="375"
Height="250"
Name="rootElement"
Loaded="Init">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
</Grid>
<TextBlock Grid.Column="0"
Grid.Row="0"
Grid.ColumnSpan="4"
Margin="10,5,10,0"
HorizontalAlignment="Center"
Style="{StaticResource titleText}">Simple WPF
Control</TextBlock>
<TextBlock Grid.Column="0"
Grid.Row="1"
Style="{StaticResource inlineText}"
Name="nameLabel">Name</TextBlock>
<TextBox Grid.Column="1"
Grid.Row="1"
Grid.ColumnSpan="3"
Name="txtName"/>
<TextBlock Grid.Column="0"
Grid.Row="2"
Style="{StaticResource inlineText}"
Name="addressLabel">Street Address</TextBlock>
<TextBox Grid.Column="1"
Grid.Row="2"
Grid.ColumnSpan="3"
Name="txtAddress"/>
<TextBlock Grid.Column="0"
Grid.Row="3"
Style="{StaticResource inlineText}"
Name="cityLabel">City</TextBlock>
<TextBox Grid.Column="1"
Grid.Row="3"
Width="100"
Name="txtCity"/>
<TextBlock Grid.Column="2"
Grid.Row="3"
Style="{StaticResource inlineText}"
Name="stateLabel">State</TextBlock>
<TextBox Grid.Column="3"
Grid.Row="3"
Width="50"
Name="txtState"/>
<TextBlock Grid.Column="0"
Grid.Row="4"
Style="{StaticResource inlineText}"
Name="zipLabel">Zip</TextBlock>
<TextBox Grid.Column="1"
Grid.Row="4"
Width="100"
Name="txtZip"/>
Aplicar estilos a los elementos de la interfaz de usuario
Muchos de los elementos del formulario de entrada de datos tienen un aspecto
similar, lo que significa que tienen valores idénticos para varias de sus propiedades. En
lugar de establecer los atributos de cada elemento de forma independiente, el XAML
anterior utiliza elementos Style para definir los valores estándar de las propiedades
para las clases de elementos. Este enfoque reduce la complejidad del control y permite
cambiar el aspecto de varios elementos a través de un atributo de estilo único.
Los elementos Style se incluyen en la propiedad Resources del elemento Grid, por lo
que pueden ser utilizados por todos los elementos del control. Si un estilo tiene
nombre, puede aplicarlo a un elemento agregando un elemento Style establecido en
el nombre del estilo. Los estilos que no tienen nombre se convierten en el estilo
predeterminado del elemento. Para obtener más información acerca de los estilos de
WPF, vea Aplicar estilos y plantillas.
En el código XAML siguiente se muestran los elementos Style del control compuesto.
Para ver cómo se aplican los estilos a los elementos, vea el XAML anterior. Por
ejemplo, el último elemento TextBlock tiene el estilo inlineText y el último elemento
TextBox utiliza el estilo predeterminado.
En MyControl1.xaml, agregue el siguiente XAML justo después del elemento de inicio
Grid.
<Grid.Resources>
<Style x:Key="inlineText" TargetType="{x:Type TextBlock}">
<Setter Property="Margin" Value="10,5,10,0"/>
<Setter Property="FontWeight" Value="Normal"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<Style x:Key="titleText" TargetType="{x:Type TextBlock}">
<Setter Property="DockPanel.Dock" Value="Top"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="Margin" Value="10,5,10,0"/>
</Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Margin" Value="10,5,10,0"/>
<Setter Property="Width" Value="60"/>
</Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="10,5,10,0"/>
</Style>
</Grid.Resources>
Agregar los botones Aceptar y Cancelar
Los elementos finales del control compuesto son los elementos Aceptar y
CancelarButton, que ocupan las primeras dos columnas de la última fila del elemento
Grid. Estos elementos utilizan un controlador de eventos común, ButtonClicked y el
estilo Button predeterminado definido en el código XAML anterior.
En MyControl1.xaml, agregue el siguiente XAML justo después del último elemento
TextBox. El componente XAML del control compuesto está ahora completo.
XAML
<Button Grid.Row="5"
Grid.Column="0"
Name="btnOK"
Click="ButtonClicked">OK</Button>
<Button Grid.Row="5"
Grid.Column="1"
Name="btnCancel"
Click="ButtonClicked">Cancel</Button>
namespace MyControls
{
public partial class MyControl1 : Grid
{
//...
}
public class MyControlEventArgs : EventArgs
{
//...
}
}
La primera clase, MyControl1, es una clase parcial que contiene el código que
implementa la funcionalidad de la interfaz de usuario definida en MyControl1.xaml.
Cuando se analiza MyControl1.xaml, el XAML se convierte en la misma clase parcial y
las dos clases parciales se combinan para formar el control compilado. Por esta razón,
el nombre de clase del archivo de código subyacente debe coincidir con el nombre de
clase asignado a MyControl1.xaml y debe heredar del elemento raíz del control. La
segunda clase, MyControlEventArgs, es una clase de argumentos de evento que se
utiliza para devolver los datos al host.
Abra MyControl1.xaml.cs. Cambie la declaración de clase existente de forma que tenga
el siguiente nombre y herede de Grid.
C#
Inicializar el control
El siguiente código implementa varias tareas básicas:
Declara un evento privado, OnButtonClick y su delegado asociado,
MyControlEventHandler.
Crea varias variables globales privadas que almacenan los datos del usuario.
Estos datos se exponen a través de las propiedades correspondientes.
Implementa un controlador, Init, para el evento Loaded del control. Este
controlador inicializa las variables globales asignándoles los valores definidos
en MyControl1.xaml. Utiliza para ello la propiedad Name asignada a un
elemento TextBlock típico, nameLabel, para tener acceso a los valores de las
propiedades de ese elemento.
Elimine el constructor existente y agregue el código siguiente a la clase MyControl1.
txtState.Text,
txtZip.Text);
if (sender == btnCancel)
{
retvals.IsOK = false;
}
if (OnButtonClick != null)
OnButtonClick(this, retvals);
}
Crear propiedades
El resto de la clase simplemente expone propiedades que corresponden a las variables
globales explicadas anteriormente. Cuando una propiedad cambia, el descriptor de
acceso set modifica el aspecto del control cambiando las propiedades de elemento
correspondientes y actualizando las variables globales subyacentes.
Agregue el código siguiente a la clase MyControl1.
C#
Crear el proyecto
Para iniciar el proyecto:
1. Inicie Visual Studio y abra el cuadro de diálogo Nuevo proyecto.
2. En Visual C# y la categoría de Windows, seleccione la plantilla Aplicación de
Windows Forms.
3. Denomine el nuevo proyecto WFHost.
4. Para la ubicación, especifique la misma carpeta de nivel superior que contiene
el proyecto MyControls.
5. Haga clic en Aceptar para crear el proyecto.
También debe agregar referencias a la DLL que contiene MyControl1 y a otros
ensamblados.
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse
en el nombre del proyecto y seleccione Agregar referencia.
2. Haga clic en la pestaña Examinar y busque la carpeta que contiene
MyControls.dll. Para este tutorial, esta carpeta es MyControls\bin\Debug.
3. Seleccione MyControls.dll y, a continuación, haga clic en Aceptar.
4. Agregue referencias a los siguientes ensamblados.
o PresentationCore
o PresentationFramework
o System.Xaml
o WindowsBase
o WindowsFormsIntegration
Implementar la interfaz de usuario de la aplicación
La interfaz de usuario de la aplicación de Windows Forms contiene varios controles
para interactuar con el control compuesto de WPF.
1. Abra Form1 en el Diseñador de Windows Forms.
2. Amplíe el formulario para alojar los controles.
3. En la esquina superior derecha del formulario, agregue un control
System.Windows.Forms.Panel para incluir el control compuesto de WPF.
4. Agregue los siguientes controles System.Windows.Forms.GroupBox al
formulario.
Name Text
groupBox3 FontSize
groupBox3 radioSizeTen 10
groupBox3 radioSizeTwelve 12
Inicializar el formulario
Generalmente, implementará el código host en el controlador de eventos Load del
formulario. El código siguiente muestra el controlador de eventos Load, un
controlador del evento Loaded del control compuesto de WPF y las declaraciones de
varias variables globales que se utilizarán más adelante.
En el Diseñador de Windows Forms, haga doble clic en el formulario para crear un
controlador de eventos Load. En la parte superior de Form1.cs, agregue las siguientes
instrucciones using.
C#
using System;
using System.Windows;
using System.Windows.Navigation;
using System.Windows.Controls;
using System.Windows.Media;
namespace MyControls
{
public partial class MyControl1 : Grid
{
public delegate void MyControlEventHandler(object sender,
MyControlEventArgs args);
public event MyControlEventHandler OnButtonClick;
private FontWeight _fontWeight;
private double _fontSize;
private FontFamily _fontFamily;
private FontStyle _fontStyle;
private SolidColorBrush _foreground;
private SolidColorBrush _background;
txtName.Text,
txtAddress.Text,
txtCity.Text,
txtState.Text,
txtZip.Text);
if (sender == btnCancel)
{
retvals.IsOK = false;
}
if (OnButtonClick != null)
OnButtonClick(this, retvals);
}
C#
using System.Windows;
using System.Windows.Forms.Integration;
using System.Windows.Media;
public Form1()
{
InitializeComponent();
}
wpfAddressCtrl.OnButtonClick +=
new MyControls.MyControl1.MyControlEventHandler(
avAddressCtrl_OnButtonClick);
wpfAddressCtrl.Loaded += new RoutedEventHandler(
avAddressCtrl_Loaded);
}
void avAddressCtrl_OnButtonClick(
object sender,
MyControls.MyControl1.MyControlEventArgs args)
{
if (args.IsOK)
{
lblAddress.Text = "Street Address: " + args.MyStreetAddress;
lblCity.Text = "City: " + args.MyCity;
lblName.Text = "Name: " + args.MyName;
lblState.Text = "State: " + args.MyState;
lblZip.Text = "Zip: " + args.MyZip;
}
else
{
lblAddress.Text = "Street Address: ";
lblCity.Text = "City: ";
lblName.Text = "Name: ";
lblState.Text = "State: ";
lblZip.Text = "Zip: ";
}
}
Compile y ejecute la aplicación. Haga clic en los distintos botones de radio para ver el
efecto en el control compuesto de WPF.
Tutorial: Organizar controles de
formularios Windows Forms en WPF
En este tutorial se muestra cómo utilizar las características de diseño de WPF para
organizar controles de formularios Windows Forms en una aplicación híbrida.
Las tareas ilustradas en este tutorial incluyen:
Crear el proyecto.
Utilizar la configuración de diseño predeterminada.
Ajustar el tamaño al contenido.
Utilizar posiciones absolutas.
Especificar explícitamente el tamaño.
Establecer las propiedades de diseño.
Entender las limitaciones del orden z.
Acoplamiento.
Establecer la visibilidad.
Hospedar un control que no se ajusta.
Cambiar la escala.
Girar.
Establecer relleno y márgenes.
Utilizar contenedores de diseño dinámico.
Para ver una lista de código completa de las tareas mostradas en este tutorial, vea
Arranging Windows Forms Controls in WPF Sample.
Cuando termine, comprenderá las características de diseño de formularios Windows
Forms en aplicaciones basadas en WPF.
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Visual Studio 2010.
Crear el proyecto
Para crear y configurar el proyecto
1. Cree un proyecto de aplicación de WPF denominado WpfLayoutHostingWf.
2. En el Explorador de soluciones, agregue referencias a los ensamblados
siguientes.
o WindowsFormsIntegration
o System.Windows.Forms
o System.Drawing
3. Haga doble clic en MainWindow.xaml para abrirlo en la vista XAML.
4. En el elemento Window, agregue la siguiente asignación de espacio de
nombres formularios Windows Forms.
XAML
xmlns:wf="clr-
namespace:System.Windows.Forms;assembly=System.Windows.Forms"
5. En el elemento Grid, establezca la propiedad ShowGridLines en true y defina
cinco filas y tres columnas.
XAML
<Grid ShowGridLines="true">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
XAML
XAML
XAML
XAML
C#
private void button1_Click(object sender, EventArgs e )
{
System.Windows.Forms.Button b = sender as
System.Windows.Forms.Button;
b.Top = 20;
b.Left = 20;
}
XAML
XAML
Acoplamiento
El elemento WindowsFormsHost admite el acoplamiento de WPF. Establezca la
propiedad Dock adjunta para acoplar el control hospedado en un elemento
DockPanel.
Para acoplar un control hospedado
1. Copie el XAML siguiente en el elemento Grid.
XAML
Establecer la visibilidad
Puede hacer que el control de formularios Windows Forms sea invisible o contraerlo
estableciendo la propiedad Visibility del elemento WindowsFormsHost. Cuando un
control no está visible, no se muestra, pero ocupa espacio en el diseño. Cuando se
contrae un control, no se muestra, ni ocupa el espacio en el diseño.
Para establecer la visibilidad de un control hospedado
1. Copie el XAML siguiente en el elemento Grid.
XAML
XAML
Ajustar la escala
A diferencia de los elementos de WPF, la escala de la mayoría de los controles de
formularios Windows Forms no se puede cambiar continuamente. De forma
predeterminada, el elemento de WindowsFormsHost escala el control hospedado
cuando es posible. Para habilitar el ajuste de escala hechos y derecho, establezca la
IsRedirected de WindowsFormsHost en true y la propiedad de
propiedad de
CompositionMode a Full o a OutputOnly.
Escalar un control hospedado utilizando el comportamiento
predeterminado
1. Copie el XAML siguiente en el elemento Grid.
XAML
<StackPanel.RenderTransform>
<ScaleTransform CenterX="0" CenterY="0" ScaleX="0.5"
ScaleY="0.5" />
</StackPanel.RenderTransform>
<WindowsFormsHost Background="Yellow">
<wf:Button Text="Windows Forms control" FlatStyle="Flat"/>
</WindowsFormsHost>
</StackPanel>
XAML
</StackPanel>
Girar
A diferencia de los elementos de WPF, los controles de formularios Windows Forms no
admiten el giro. De forma predeterminada, el elemento de WindowsFormsHost no gira
con otros elementos de WPF cuando se aplica una transformación de giro. Cualquier
valor de giro distinto de 180 grados provoca el evento LayoutError. Para habilitar girar
IsRedirected de WindowsFormsHost
a cualquier ángulo, establezca la propiedad de
en true y la propiedad de CompositionMode a Full o a OutputOnly.
Para ver el efecto del giro en una aplicación híbrida
1. Copie el XAML siguiente en el elemento Grid.
XAML
<StackPanel.RenderTransform>
<RotateTransform CenterX="200" CenterY="50" Angle="180" />
</StackPanel.RenderTransform>
<WindowsFormsHost Background="Yellow">
<wf:Button Text="Windows Forms control" FlatStyle="Flat"/>
</WindowsFormsHost>
</StackPanel>
<StackPanel.RenderTransform>
<RotateTransform CenterX="200" CenterY="50" Angle="180" />
</StackPanel.RenderTransform>
</StackPanel>
2. Presione F5 para compilar y ejecutar la aplicación. Gira el control hospedado.
Observe que la propiedad de Angle se puede establecer en cualquier valor. Es
posible que deba cambiar de tamaño la ventana para ver los elementos.
XAML
XAML
flp.WrapContents = true;
public MainWindow()
{
InitializeComponent();
this.InitializeFlowLayoutPanel();
}
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Visual Studio 2010.
Acceso a la base de datos de ejemplo Northwind ejecutándose en SQL Server.
Crear el proyecto
Para crear y configurar el proyecto
1. Cree un proyecto Aplicación WPF denominado
WPFWithWFAndDatabinding.
2. En el Explorador de soluciones, agregue referencias a los ensamblados
siguientes.
o WindowsFormsIntegration
o System.Windows.Forms
3. Abra MainWindow.xaml en WPF Designer.
4. En el elemento Window, agregue la siguiente asignación de espacio de
nombres formularios Windows Forms.
XAML
xmlns:wf="clr-
namespace:System.Windows.Forms;assembly=System.Windows.Forms"
5. Nombre el elemento GridmainGrid predeterminado asignando la propiedad
Name.
XAML
<Grid x:Name="mainGrid">
XAML
<Grid.Resources>
<DataTemplate x:Key="ListItemsTemplate">
<TextBlock Text="{Binding
Path=ContactName}"/>
</DataTemplate>
</Grid.Resources>
XAML
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
XAML
XAML
XAML
public MainWindow()
{
InitializeComponent();
4. Abra MainWindow.xaml.
5. En la vista Diseño o en la vista XAML, seleccione el elemento Window.
6. En la ventana Propiedades, haga clic en la pestaña Eventos.
7. Haga doble clic en el evento Loaded.
8. Copie el código siguiente en el controlador de eventos Loaded.
Este código asigna el componente BindingSource como el contexto de datos y
rellena los objetos de adaptador Customers y Orders.
BindingListCollectionView cv =
CollectionViewSource.GetDefaultView(
this.nwBindingSource) as BindingListCollectionView;