Академический Документы
Профессиональный Документы
Культура Документы
Windows Presentation Foundation (WPF) es un sistema de presentación de la próxima generación, para crear aplicaciones cliente de Windows
que proporcionen una experiencia impactante para el usuario desde el punto de vista visual. Con WPF, puede crear una amplia gama de
aplicaciones independientes y hospedadas en explorador. Algunos ejemplos de ello son Yahoo! Messenger y New York Times Reader, así como la
aplicación de ejemplo para atención sanitaria, Contoso Healthcare Sample Application que se muestra en la ilustración siguiente.
El núcleo de WPF es un motor de representación independiente de la resolución y basado en vectores construido para aprovechar al máximo el
hardware de gráficos moderno. WPF amplía el núcleo con un completo conjunto de características de programación de aplicaciones, entre las que
se incluyen Lenguaje de marcado de aplicaciones extensible (XAML), controles, enlaces de datos, diseño, gráficos 2D y 3D, animación, estilos,
plantillas, documentos, multimedia, texto y tipografía. WPF se incluye en Microsoft .NET Framework, lo que permite crear aplicaciones que
incorporen otros elementos de la biblioteca de clases de .NET Framework.
Esta introducción está dirigida a personas que no conocen aún WPF, y en ella se abordan sus conceptos y capacidades principales. Los
programadores de WPF experimentados que deseen revisar este marco de trabajo también la encontrarán de utilidad.
Nota:
Para conocer las características nuevas y actualizadas de WPF en .NET Framework 3.5, vea Lo nuevo en Windows Presentation Foundation
versión 3.5.
Aplicaciones
Controles
Animación
Multimedia
Texto y tipografía
Documentos
Personalizar las aplicaciones WPF
WPF constituye un subconjunto de tipos de .NET Framework, en su mayoría contenidos en el espacio de nombres de System.Windows. Si
ha creado previamente aplicaciones con .NET Framework mediante tecnologías administradas como ASP.NET y formularios Windows Forms,
los conceptos fundamentales de la programación en WPF deben resultarle familiares; creará instancias de clases, definirá propiedades,
llamará a métodos y controlará eventos con el lenguaje de programación de .NET Framework que prefiera, como C# o Visual Basic.
Para admitir algunas de las funciones de WPF más eficaces y simplificar la experiencia de programación, WPF incluye construcciones de
programación adicionales que mejoran las propiedades y los eventos: las propiedades de dependencia y los eventos enrutados. Para
obtener más información acerca de las propiedades de dependencia, vea Información general sobre las propiedades de dependencia. Para
obtener más información acerca de los eventos enrutados, vea Información general sobre eventos enrutados.
WPF proporciona mejoras de programación adicionales para el desarrollo de aplicaciones cliente de Windows. Una mejora evidente es la
capacidad para programar una aplicación mediante código de lenguaje marcado y subyacente, una experiencia con la que resultará familiar
a los programadores de ASP.NET. En general, se utiliza el lenguaje marcado Lenguaje de marcado de aplicaciones extensible (XAML) para
implementar la apariencia de una aplicación, y los lenguajes de programación administrados (subyacentes) para implementar su
comportamiento. Esta separación entre la apariencia y el comportamiento aporta las ventajas siguientes:
Se reducen los costos de programación y mantenimiento, al no estar el marcado específico de la apariencia estrechamente relacionado
con el código específico del comportamiento.
La programación es más eficaz porque los diseñadores pueden implementar la apariencia de una aplicación al mismo tiempo que los
programadores implementan su comportamiento.
Se pueden utilizar varias herramientas de diseño para implementar y compartir el lenguaje marcado XAML, a fin de responder a los
requisitos de los colaboradores de programación de aplicaciones; Microsoft Expression Blend proporciona una experiencia apropiada
para los diseñadores, mientras que Visual Studio 2005 está dirigido a los programadores.
La globalización y localización de las aplicaciones WPF se ha simplificado en gran medida (vea Información general sobre la localización
y globalización de WPF).
A continuación, se muestra una introducción breve al código de lenguaje marcado y subyacente de WPF. Para obtener más información
acerca de este modelo de programación, vea Información general sobre XAML y Código subyacente y XAML.
Marcado
XAML es un lenguaje de marcado basado en XML que se utiliza para implementar la apariencia de una aplicación mediante declaración. Se
suele utilizar para crear ventanas, cuadros de diálogo, páginas y controles de usuario, así como para rellenarlos con controles, formas y
gráficos.
En el ejemplo siguiente se utiliza XAML para implementar la apariencia de una ventana que contiene un solo botón.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="Window with Button"
Width="250" Height="100">
</Window>
En concreto, este código XAML define una ventana y un botón mediante los elementos Window y Button, respectivamente. Cada elemento
se configura con atributos, como el atributo Title del elemento Window, para especificar el texto de la barra de título de la ventana. En
tiempo de ejecución, WPF convierte los elementos y los atributos definidos en el marcado en instancias de clases de WPF. Por ejemplo, el
elemento Window se convierte en una instancia de la clase Window cuya propiedad Title es el valor del atributo Title.
En la ilustración siguiente se muestra la interfaz de usuario (UI) definida mediante el código XAML del ejemplo anterior.
Puesto que XAML se basa en XML, la interfaz de usuario que se crea con este lenguaje se ensambla en una jerarquía de elementos anidados
que se denomina árbol de elementos. El árbol de elementos proporciona una manera lógica e intuitiva de crear y administrar las UIs. Para
obtener más información, vea Árboles en WPF.
Código subyacente
El comportamiento principal de una aplicación es implementar la funcionalidad que responde a las interacciones con el usuario, lo que
incluye controlar los eventos (por ejemplo, hacer clic en un menú, una barra de herramientas o un botón) y llamar, en respuesta, a la lógica
empresarial y de acceso a los datos. En WPF, este comportamiento se suele implementar en código asociado al marcado. Este tipo de
código se denomina subyacente. En el ejemplo siguiente se muestran el código subyacente y el marcado actualizado del ejemplo anterior.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.AWindow"
Title="Window with Button"
Width="250" Height="100">
C# Copiar código
namespace SDKSample
{
public partial class AWindow : Window
{
public AWindow()
{
// InitializeComponent call is required to merge the UI
// that is defined in markup with this class, including
// setting properties and registering event handlers
InitializeComponent();
}
Namespace SDKSample
End Sub
End Sub
End Class
End Namespace
En este ejemplo, el código subyacente implementa una clase que se deriva de la clase Window. El atributo x:Class se utiliza para asociar el
marcado a la clase de código subyacente. Se llama a InitializeComponent desde el constructor de la clase de código subyacente para
combinar la interfaz de usuario definida en el marcado con la clase de código subyacente. ((InitializeComponent se genera
automáticamente al generar la aplicación, por lo que no se requiere su implementación manual.) La combinación de x:Class e
InitializeComponent garantiza que la implementación se inicializa correctamente cada vez que se crea. La clase de código subyacente
también implementa un controlador de eventos para el evento Click del botón. Cuando se hace clic en el botón, el controlador de eventos
muestra un cuadro de mensaje llamando al método MessageBox.Show.
Aplicaciones
.NET Framework, System.Windows, así como el código de lenguaje marcado y subyacente, constituyen la base de la experiencia de
programación de aplicaciones en WPF. Además, WPF cuenta con características completas para crear experiencias de usuario con contenido
enriquecido. Para empaquetar este contenido y distribuirlo a los usuarios en forma de "aplicaciones", WPF proporciona tipos y servicios
denominados colectivamente el modelo de aplicación. El modelo de aplicación admite la programación de aplicaciones independientes y
hospedadas en explorador.
Aplicaciones independientes
Para las aplicaciones independientes, puede utilizar la clase Window para crear las ventanas y cuadros de diálogo a los que se tiene acceso
desde las barras de menús y las barras de herramientas. En la ilustración siguiente se muestra una aplicación independiente con una
ventana principal y un cuadro de diálogo.
Además, puede utilizar los cuadros de diálogo siguientes de WPF: MessageBox, OpenFileDialog, SaveFileDialog y PrintDialog.
Para obtener más información, vea Información general sobre ventanas de WPF.
Clase Application
Tanto las XBAPs como las aplicaciones independientes suelen presentar la complejidad suficiente para necesitar servicios adicionales de
ámbito de la aplicación, lo que incluye administración del inicio y de la duración, así como las propiedades y los recursos compartidos. La
clase Application incluye todos estos servicios y más, y se puede implementar sólo mediante XAML, como se muestra en el ejemplo
siguiente.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="MainWindow.xaml" />
Este código de lenguaje marcado es la definición de aplicación de una aplicación independiente, e indica a WPF que cree un objeto
Application que abre MainWindow automáticamente cuando se inicia la aplicación.
Un concepto que es fundamental entender acerca de Application es que proporciona una plataforma común de compatibilidad para las
aplicaciones independientes y hospedadas en explorador. Por ejemplo, el código XAML anterior podría utilizarlo una aplicación hospedada en
explorador para navegar automáticamente a una página al iniciar una XBAP, como se muestra en el ejemplo siguiente.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="HomePage.xaml" />
Para obtener más información, vea Información general sobre la administración de aplicaciones.
Seguridad
Dado que las XBAPs se hospedan en un explorador, la seguridad es importante. En particular, las XBAPs utilizan un recinto de seguridad de
confianza parcial para aplicar restricciones menores o iguales a las que se imponen a las aplicaciones basadas en HTML. Además, todas las
características de HTML que es seguro ejecutar desde las XBAPs con confianza parcial se han probado mediante un proceso de seguridad
completo, que se detalla en Estrategia de seguridad de Windows Presentation Foundation: Ingeniería de seguridad.
Aún así, la mayoría de las características de WPF se pueden ejecutar con seguridad desde las XBAPs, como se describe en Seguridad de
confianza parcial en Windows Presentation Foundation.
Controles
Las experiencias para el usuario proporcionadas por el modelo de aplicación son controles construidos. En WPF, un "control" es un término
general que se aplica a una categoría de clases de WPF hospedadas en una ventana o una página, tienen una interfaz de usuario (UI) e
implementa un comportamiento determinado.
Para obtener más información, vea Información general sobre controles. Para ver ejemplos de introducción, vea Ejemplos de Control
Library.
Los controles casi siempre detectan las acciones del usuario y responden a ellas. El sistema de entrada de WPF utiliza eventos directos y
enrutados para admitir entradas de texto, la administración del enfoque y la posición del mouse. Para obtener más información, vea
Información general sobre acciones del usuario.
Las aplicaciones suelen tener requisitos de entrada complejos. WPF proporciona un sistema de comandos que separa las acciones de
entrada del usuario del código que responde a esas acciones. Para obtener más información, vea Información general sobre comandos.
Diseño
Al crear una interfaz de usuario, se organizan los controles según su ubicación y tamaño para crear un diseño. Un requisito fundamental de
cualquier diseño es adaptarse a los cambios de tamaño de la ventana y de configuración de pantalla. En lugar de obligarle a escribir código
que adapte el diseño en estas circunstancias, WPF le proporciona un sistema de diseño extensible de primera clase.
La piedra angular del sistema de diseño es la situación relativa, que aumenta la capacidad de adaptación a los cambios en la configuración
de las ventanas y de la pantalla. Además, el sistema de diseño administra la negociación entre los controles para determinar el diseño. La
negociación es un proceso de dos pasos: en primer lugar, el control indica a su elemento primario qué ubicación y tamaño necesita; en
segundo lugar, el elemento primario indica al control de qué espacio dispone.
El sistema de diseño se expone a los controles secundarios mediante las clases base de WPF. Para los diseños comunes, como son las
cuadrículas, el apilamiento y el acoplamiento, WPF incluye varios controles de diseño:
Canvas: los controles secundarios proporcionan su propio diseño.
DockPanel: los controles secundarios se alinean con los bordes del panel.
Grid: los controles secundarios se sitúan por filas y columnas.
VirtualizingStackPanel: los controles secundarios se organizan en una vista "virtual" de una sola línea en sentido horizontal o vertical.
WrapPanel: los controles secundarios se sitúan por orden de izquierda a derecha y se ajustan a la línea siguiente cuando hay más
controles de los que caben en la línea actual.
En el ejemplo siguiente se utiliza un control DockPanel para situar varios controles TextBox.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.LayoutWindow"
Title="Layout with the DockPanel" Height="143" Width="319">
</Window>
DockPanel permite que los controles secundarios TextBox le indiquen cómo se deben organizar. Para ello, DockPanel implementa una
propiedad Dock que se expone a los controles secundarios, a fin de para permitir que cada uno de ellos especifique un estilo de
acoplamiento.
Nota:
Una propiedad implementada por un control principal para que la utilicen los controles secundarios es una construcción de
WPF denominada propiedad asociada (vea Información general sobre propiedades asociadas).
En la ilustración siguiente se muestra el resultado del marcado XAML del ejemplo anterior.
Para obtener más información, vea Sistema de diseño. Para ver un ejemplo de introducción, vea Ejemplo WPF Layout Gallery.
Enlace de datos
La mayoría de las aplicaciones se crean para proporcionar recursos a los usuarios que les permitan ver y editar los datos. Para aplicaciones
WPF, el trabajo de almacenar los datos y tener acceso a ellos se proporciona mediante tecnologías existentes, como Microsoft SQL Server y
ADO.NET. Después de obtener acceso a los datos y de cargarlos a los objetos administrados de una aplicación, comienza la tarea ardua de
las aplicaciones WPF. En esencia, esto implica dos cosas:
1. Copiar los datos desde los objetos administrados en los controles, donde los datos se pueden mostrar y editar.
2. Asegurarse de que los cambios realizados en los datos mediante los controles se vuelvan a copiar en los objetos administrados.
Para simplificar la programación de aplicaciones, WPF proporciona un motor de enlace de datos que realiza estos pasos
automáticamente. La unidad que constituye el núcleo del motor de enlace de datos es la clase Binding, encargada de enlazar un control (el
destino del enlace) a un objeto de datos (el origen del enlace). Esta relación se muestra en la ilustración siguiente.
En el ejemplo siguiente se muestra cómo enlazar un control TextBox a una instancia de un objeto Person personalizado. La implementación
de Person se muestra en el código siguiente.
C# Copiar código
namespace SDKSample
{
class Person
{
string name = "No Name";
Namespace SDKSample
Class Person
End Class
End Namespace
El marcado siguiente enlaza el control TextBox a una instancia de un objeto Person personalizado.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.DataBindingWindow">
...
<!-- Bind the TextBox to the data source (TextBox.Text to Person.Name) -->
<TextBox Name="personNameTextBox" Text="{Binding Path=Name}" />
...
</Window>
C# Copiar código
namespace SDKSample
{
public partial class DataBindingWindow : Window
{
public DataBindingWindow()
{
InitializeComponent();
Namespace SDKSample
End Sub
End Class
End Namespace
En este ejemplo, se crea una instancia de la clase Person en el código subyacente y se establece como el contexto de datos de
DataBindingWindow. En el marcado, la propiedad Text de TextBox se enlaza a la propiedad Person.Name (mediante la sintaxis
"{Binding ... }" de XAML). Este código XAML indica a WPF que enlace el control TextBox al objeto Person almacenado en la propiedad
DataContext de la ventana.
El motor de enlace de datos de WPF proporciona compatibilidad adicional que incluye validación, ordenación, filtrado y agrupación. Además,
el enlace de datos admite el uso de plantillas de datos, a fin de crear una interfaz de usuario personalizada para los datos enlazados cuando
la interfaz de usuario mostrada por los controles estándar de WPF no es adecuada.
Para obtener más información, vea Información general sobre el enlace de datos. Para ver un ejemplo de introducción, vea Demo Data
Binding.
Gráficos
WPF presenta un conjunto extenso, escalable y flexible de características de gráficos que aportan las ventajas siguientes:
Gráficos independientes de la resolución e independientes del dispositivo. La unidad de medida básica del sistema de gráficos
de WPF es el píxel independiente del dispositivo, que es 1/96 de pulgada, independientemente de la resolución de pantalla real, y que
proporciona la base para la representación independiente de la resolución y del dispositivo. Cada píxel independiente del dispositivo se
escala automáticamente para coincidir con el valor de puntos por pulgada (ppp) del sistema en que se representa.
Precisión mejorada. El sistema de coordenadas de WPF se mide con números de punto flotante de precisión doble, en lugar de
precisión simple. Las transformaciones y los valores de opacidad también se expresan como doble precisión. WPF admite también una
amplia gama de colores (scRGB) y proporciona compatibilidad integrada para administrar las entradas desde espacios de color
diferentes.
Compatibilidad con gráficos avanzados y animación. WPF simplifica la programación de gráficos administrando automáticamente
las escenas de animación; no tendrá que preocuparse por el procesamiento de escenas, los bucles de representación ni la interpolación
bilineal. Además, WPF admite la comprobación de clics y proporciona compatibilidad plena con la composición alfa.
Aceleración de hardware. El sistema de gráficos de WPF saca partido del hardware de gráficos para minimizar el uso de la CPU.
Formas 2D
WPF proporciona una biblioteca de formas 2D comunes dibujadas mediante vectores, como los rectángulos y las elipses que se muestran en
la ilustración siguiente.
Una función interesante de las formas es que no sirven únicamente para su presentación; las formas implementan muchas de las
características que cabe esperar de los controles, incluida la entrada de datos desde el teclado y el mouse. En el ejemplo siguiente se
muestra el control del evento MouseUp de una forma Ellipse.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.EllipseEventHandlingWindow"
Title="Click the Ellipse">
<Ellipse Name="clickableEllipse" Fill="Blue" MouseUp="clickableEllipse_MouseUp" />
</Window>
C# Copiar código
namespace SDKSample
{
public partial class EllipseEventHandlingWindow : Window
{
public EllipseEventHandlingWindow()
{
InitializeComponent();
}
Namespace SDKSample
End Class
End Namespace
En la ilustración siguiente se muestra lo que el código anterior genera.
Para obtener más información, vea Información general sobre formas y dibujo básico en WPF. Para ver un ejemplo de introducción, vea
Ejemplo Shape Elements.
Geometrías 2D
Las formas 2D proporcionadas por WPF abarcan el conjunto estándar de formas básicas. Sin embargo, puede que sea preciso crear formas
personalizadas para facilitar el diseño de una interfaz de usuario personalizada. Para este fin, WPF proporciona las geometrías. En la
ilustración siguiente se muestra el uso de geometrías para crear una forma personalizada que se puede dibujar directamente, utilizar como
un pincel o utilizar para recortar otras formas y controles.
Los objetos Path se pueden utilizar para dibujar formas cerradas o abiertas, varias formas o incluso formas curvas.
Los objetos Geometry se pueden utilizar para el recorte, la comprobación de visitas y la representación de datos de gráficos 2D.
Para obtener más información, vea Información general sobre geometría. Para ver un ejemplo de introducción, vea Ejemplo Geometries.
Efectos 2D
Un subconjunto de las funciones 2D de WPF son los efectos visuales, tales como degradados, mapas de bits, dibujos, pintar con vídeos,
rotación, ajuste de escala y sesgo. Todas ellas se aplican mediante pinceles; en la siguiente ilustración se muestran algunos ejemplos.
Para obtener más información, vea Información general sobre pinceles de WPF. Para ver un ejemplo de introducción, vea Ejemplo Brushes.
Representación 3D
WPF también incluye funciones de representación 3D que se integran con los gráficos 2D para permitir la creación de UIs más interesantes
y apasionantes. Por ejemplo, en la ilustración siguiente se muestran imágenes 2D representadas en formas 3D.
Para obtener más información, vea Información general sobre gráficos 3D. Para ver un ejemplo de introducción, vea Ejemplo 3-D Solids.
Animación
La compatibilidad de WPF con la animación permite hacer que los controles crezcan, tiemblen, giren o se desvanezcan, crear transiciones de
página interesantes, y mucho más. Puede animar la mayoría de las clases de WPF, incluso las personalizadas. En la ilustración siguiente se
muestra una animación simple en acción.
Para obtener más información, vea Información general sobre animaciones. Para ver un ejemplo de introducción, vea Ejemplo Animation
Example Gallery.
Multimedia
Una manera de mostrar un contenido enriquecido es utilizar medios audiovisuales (multimedia). WPF proporciona compatibilidad especial
con imágenes, vídeo y audio.
Imágenes
Las imágenes están presentes en la mayoría de las aplicaciones y WPF proporciona varias maneras de utilizarlas. En la ilustración siguiente
se muestra una interfaz de usuario con un cuadro de lista que contiene imágenes en miniatura. Cuando se selecciona una miniatura,
aparece la imagen a tamaño completo.
Para obtener más información, vea Información general sobre imágenes. Para ver un ejemplo de introducción, vea Demo WPF Photo
Viewer.
Vídeo y audio
El control MediaElement es capaz de reproducir vídeo y audio y presenta la flexibilidad suficiente para constituir la base de un reproductor
multimedia personalizado. El marcado XAML siguiente implementa un reproductor multimedia.
<MediaElement
Name="myMediaElement"
Source="media/wpf.wmv"
LoadedBehavior="Manual"
Width="350" Height="250" />
Para obtener más información, vea Información general sobre características de gráficos, animación y multimedia en WPF. Para ver un
ejemplo de introducción, vea Ejemplo Media Gallery.
Texto y tipografía
Para facilitar una representación de texto de gran calidad, WPF ofrece las características siguientes:
Compatibilidad con fuentes OpenType.
Mejoras de ClearType.
Alto rendimiento que saca partido de la aceleración de hardware.
Integración de texto con multimedia, gráficos y animación.
A modo de demostración de la integración del texto con gráficos, en la ilustración siguiente se muestra la aplicación de decoraciones al
texto.
Para obtener más información, vea Tipografía en Windows Presentation Foundation. Para ver ejemplos de introducción, vea Ejemplos de
tipografía.
Documentos
WPF permite trabajar de forma nativa con tres tipos de documentos: documentos de flujo, documentos fijos y documentos de XML Paper
Specification (XPS). WPF proporciona también servicios para crear, ver, administrar, anotar, empaquetar e imprimir documentos.
Documentos dinámicos
Los documentos dinámicos se han diseñado para optimizar su presentación y legibilidad ajustando dinámicamente su contenido y
modificando su flujo cuando se producen cambios en el tamaño de la ventana y la configuración de pantalla. En el marcado XAML siguiente
se muestra la definición de FlowDocument.
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Paragraph>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy
nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi
enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis
nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure.
</Paragraph>
...
</FlowDocument>
En el ejemplo siguiente se muestra cómo cargar un documento dinámico en FlowDocumentReader para leerlo, realizar búsquedas e
imprimirlo.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.FlowDocumentReaderWindow"
Title="Flow Document Reader">
<FlowDocumentReader Name="flowDocumentReader" />
</Window>
C# Copiar código
namespace SDKSample
{
public partial class FlowDocumentReaderWindow : System.Windows.Window
{
public FlowDocumentReaderWindow()
{
InitializeComponent();
Namespace SDKSample
End Class
End Namespace
Para obtener más información, vea Información general sobre documentos dinámicos. Para ver un ejemplo de introducción, vea Ejemplo
FlowDocument Properties.
Documentos fijos
Los documentos fijos están destinados a aplicaciones que requieren una presentación con representación fiel (lo que se ve es lo que se
obtiene, o WYSIWYG, en sus siglas en inglés) precisa, especialmente por lo que respecta a su impresión. Los usos típicos para los
documentos fijos incluyen la creación de publicaciones, el procesamiento de textos y el diseño de formularios, donde es vital que se respete
el diseño de página original.
Los documentos fijos conservan la organización precisa de su contenido de una manera independiente del dispositivo. Por ejemplo, un
documento fijo mostrado en una pantalla de 96 puntos por pulgada (ppp) aparece exactamente igual que cuando se imprime en una
impresora láser de 600 ppp o una máquina tipográfica fotográfica de 4800 ppp. El diseño permanece inalterado en todos los casos, aunque
la calidad del documento varía según las funciones de cada dispositivo.
Documentos XPS
Los documentos de XML Paper Specification (XPS) se basan en documentos fijos de WPF. Los documentos de XPS se describen con un
esquema basado en XML que básicamente es una representación en forma de página de documentos electrónicos. XPS es un formato de
documento abierto habilitado para varios exploradores y diseñado para facilitar la creación, el uso compartido, la impresión y el
almacenamiento de documentos paginados. Entre las características importantes de la tecnología XPS se incluyen:
Empaquetado de documentos XPS como archivos ZipPackage conformes con la especificación Open Packaging Conventions (OPC).
Para obtener más información, vea Documentos en Windows Presentation Foundation. Para ver un ejemplo de introducción, vea Ejemplo
Creating an XPS Document.
Anotaciones
Las anotaciones son notas o comentarios que se agregan a los documentos para marcar la información o resaltar elementos de interés, a fin
de consultarlos más adelante. Aunque escribir notas en documentos impresos es fácil, la posibilidad de "escribir" notas en los documentos
electrónicos con frecuencia es limitada o no está disponible en absoluto. Sin embargo, en WPF se proporciona un sistema de anotaciones
que admite la inserción de notas rápidas y el resaltado. Además, estas anotaciones se pueden aplicar a documentos hospedados en el
control DocumentViewer, como se muestra en la ilustración siguiente.
Para obtener más información, vea Información general sobre anotaciones. Para ver un ejemplo de introducción, vea Ejemplo Document
Serialization.
Empaquetado
Las API System.IO.Packaging de WPF permiten que las aplicaciones organicen los datos, el contenido y los recursos en un único documento
ZIP portátil, sencillo de distribuir y de fácil acceso. Es posible incluir firmas digitales para autenticar los elementos contenidos en un paquete
y comprobar que el elemento firmado no se haya manipulado ni modificado. También puede cifrar los paquetes mediante la administración
de derechos para restringir el acceso a la información protegida.
Para obtener más información, vea Documentos en Windows Presentation Foundation. Para ver ejemplos, vea Ejemplos de empaquetado.
Impresión
.NET Framework incluye un subsistema de impresión al que WPF aporta, además, compatibilidad con el control de sistemas de impresión
mejorados. Las mejoras de impresión incluyen las siguientes:
Instalación en tiempo real de servidores de impresión y colas remotos.
Los documentos XPS presenta, además, una mejora fundamental del rendimiento. La ruta de acceso de Interfaz de dispositivo gráfico de
Microsoft Windows (GDI) de impresión suele requerir dos conversiones:
La primera conversión del documento a un formato de procesador de impresión, como Metarchivo mejorado (EMF).
Una segunda conversión al lenguaje de descripción de páginas de la impresora, como PCL o PostScript.
Sin embargo, los documentos XPS evitan estas conversiones porque un componente del formato de archivo XPS es un lenguaje de
procesador de impresión y un lenguaje de descripción de páginas. Esta compatibilidad ayuda a reducir tamaño del archivo de cola y las
cargas de las impresoras integradas en red.
Para obtener más información, vea Información general sobre impresión. Para ver un ejemplo de introducción, vea Printing an XPS
Document.
Sin embargo, con frecuencia estos elementos fundamentales no bastan para crear y administrar una experiencia del usuario realmente
diferenciada y visualmente impactante. Puede que los controles de WPF no se integren con la apariencia deseada de la aplicación. Es posible
que los datos no se muestren del modo más eficaz. La apariencia y el funcionamiento predeterminados de los temas de Windows pueden no
ser adecuados para proporcionar la experiencia global del usuario con respecto a la aplicación. En muchos aspectos, una tecnología de
presentación requiere la extensibilidad visual tanto como cualquier otro tipo de extensibilidad.
Por esta razón, WPF proporciona gran variedad de mecanismos para la creación de experiencias de usuario únicas, incluido un modelo de
contenido enriquecido para los controles, desencadenadores, plantillas de controles y datos, estilos, recursos de la interfaz de usuario,
temas y máscaras.
Modelo de contenido
El propósito principal de la mayoría de los controles de WPF es mostrar contenido. En WPF, el tipo y número de elementos que pueden
constituir el contenido de un control se denomina el modelo de contenido del control. Algunos controles pueden contener un solo elemento
y tipo de contenido; por ejemplo, el contenido de un control TextBox es un valor de tipo String que está asignado a la propiedad Text. En el
ejemplo siguiente se establece el contenido de TextBox.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.TextBoxContentWindow"
Title="TextBox Content">
...
...
</Window>
Otros controles, sin embargo, pueden contener varios elementos con tipos diferentes de contenido; el contenido de un control Button,
especificado por la propiedad Content, puede contener gran variedad de elementos, entre los que se incluyen controles de diseño, texto,
imágenes y formas. En el ejemplo siguiente se muestra un control Button con contenido que incluye DockPanel, Label, Border y
MediaElement.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.ButtonContentWindow"
Title="Button Content">
...
<Button Margin="20">
<!-- Button Content -->
<DockPanel Width="200" Height="180">
<Label DockPanel.Dock="Top" HorizontalAlignment="Center">Click Me!</Label>
<Border Background="Black" BorderBrush="Yellow" BorderThickness="2"
CornerRadius="2" Margin="5">
<MediaElement Source="media/wpf.wmv" Stretch="Fill" />
</Border>
</DockPanel>
</Button>
...
</Window>
Desencadenadores
Aunque el propósito principal del marcado XAML es implementar la apariencia de una aplicación, también puede utilizar XAML para
implementar algunos aspectos del comportamiento de una aplicación. Un ejemplo de ello es el uso de desencadenadores para cambiar la
apariencia de una aplicación de acuerdo con las interacciones con el usuario. Para obtener más información, vea "Desencadenadores" en
Aplicar estilos y plantillas.
Plantillas de control
Las UIs predeterminadas para los controles de WPF suelen construirse a partir de otros controles y formas. Por ejemplo, un control Button
está compuesto de los controles ButtonChrome y ContentPresenter. ButtonChrome proporciona la apariencia del botón estándar, mientras
que ContentPresenter muestra el contenido del botón, especificado por la propiedad Content.
A veces, la apariencia predeterminada de un control puede ser incongruente con la apariencia global de una aplicación. En este caso, puede
utilizar una plantilla de control ControlTemplate para cambiar la apariencia de la interfaz de usuario del control sin modificar su contenido ni
su comportamiento.
En el ejemplo siguiente se muestra cómo cambiar la apariencia de un control Button mediante ControlTemplate.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.ControlTemplateButtonWindow"
Title="Button with Control Template" Height="158" Width="290">
</Button>
</Window>
C# Copiar código
namespace SDKSample
{
public partial class ControlTemplateButtonWindow : Window
{
public ControlTemplateButtonWindow()
{
InitializeComponent();
}
Namespace SDKSample
InitializeComponent()
End Sub
End Class
End Namespace
En este ejemplo, la interfaz de usuario del botón predeterminado se ha reemplazado por una forma Ellipse que tiene un borde azul marino y
se rellena mediante RadialGradientBrush. El control ContentPresenter muestra el contenido del control Button, "Click Me!" (¡Haga clic
aquí!). Al hacer clic en Button, se provoca como siempre el evento Click, que forma parte del comportamiento predeterminado del control
Button. El resultado se muestra en la ilustración siguiente.
Para obtener más información, vea ControlTemplate. Para ver un ejemplo de introducción, vea Ejemplo Styling with ControlTemplates.
Plantillas de datos
Mientras que una plantilla de control permite especificar la apariencia de un control, una plantilla de datos permite especificar la apariencia
del contenido del control. Las plantillas de datos se utilizan con frecuencia para mejorar la manera de mostrar los datos enlazados. En la
ilustración siguiente se muestra la apariencia predeterminada de un control ListBox enlazado a una colección de objetos Task, donde cada
tarea tiene un nombre, descripción y prioridad.
La apariencia predeterminada es la que cabría esperar de un control ListBox. Sin embargo, la apariencia predeterminada de cada tarea
contiene únicamente el nombre de tarea. Para mostrar el nombre de tarea, la descripción y la prioridad, la apariencia predeterminada de
los elementos de lista enlazados al control ListBox se debe modificar, mediante DataTemplate. En el código XAML siguiente se define una
plantilla de datos DataTemplate, que se aplica a cada tarea mediante el atributo ItemTemplate.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.DataTemplateWindow"
Title="With a Data Template">
...
<!-- Data Template (applied to each bound task item in the task collection) -->
<DataTemplate x:Key="myTaskTemplate">
<Border Name="border" BorderBrush="DarkSlateBlue" BorderThickness="2"
CornerRadius="2" Padding="5" Margin="5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Padding="0,0,5,0" Text="Task Name:"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=TaskName}"/>
<TextBlock Grid.Row="1" Grid.Column="0" Padding="0,0,5,0" Text="Description:"/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Description}"/>
<TextBlock Grid.Row="2" Grid.Column="0" Padding="0,0,5,0" Text="Priority:"/>
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=Priority}"/>
</Grid>
</Border>
</DataTemplate>
...
...
</Window>
Observe que ListBox ha conservado su comportamiento y su apariencia global; únicamente ha cambiado la apariencia del contenido
mostrado por el cuadro de lista.
Para obtener más información, vea Información general sobre plantillas de datos. Para ver un ejemplo de introducción, vea Introducción al
ejemplo Data Templating.
Estilos
Los estilos permiten a los programadores y diseñadores normalizar un aspecto determinado de sus productos. WPF proporciona un modelo
de estilo sólido, que es la base del elemento Style. En el ejemplo siguiente se crea un estilo que establece el color de fondo de todos los
controles Button de una ventana en Orange.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.StyleWindow"
Title="Styles">
...
...
<!-- This labe will not have the style applied to it -->
<Label>Don't Click Me!</Label>
...
</Window>
Dado que este estilo tiene como destino todos los controles Button, se aplica automáticamente a todos los botones de la ventana, como se
muestra en la ilustración siguiente.
Para obtener más información, vea Aplicar estilos y plantillas. Para ver un ejemplo de introducción, vea Ejemplo Introduction to Styling and
Templating.
Recursos
Los controles de una aplicación deben tener la misma apariencia, que puede incluir todo tipo de recursos, desde fuentes y colores de fondo
hasta plantillas de control, pasando por las plantillas de datos y los estilos. Puede utilizar la compatibilidad de WPF con los recursos de
interfaz de usuario (UI) para encapsular estos recursos en una ubicación única y poder reutilizarlos.
En el ejemplo siguiente se define un color de fondo común que es compartido por los controles Button y Label.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.ResourcesWindow"
Title="Resources Window">
...
...
</Window>
En este ejemplo se implementa un recurso de color de fondo mediante el elemento de propiedad Window.Resources. Este recurso está
disponible para todos los elementos secundarios de Window. Existe gran variedad de ámbitos de recursos, incluidos los siguiente, que se
muestran en el orden en que se resuelven:
1. Un control individual (que utiliza la propiedad FrameworkElement.Resources heredada).
2. Window o Page (que también utiliza la propiedad FrameworkElement.Resources heredada).
3. Application (que utiliza la propiedad Application.Resources).
La variedad de ámbitos aporta flexibilidad al programador con respecto a la manera de definir y compartir los recursos.
Como alternativa a la asociación directa de los recursos a un ámbito determinado, puede empaquetar uno o varios recursos mediante un
ResourceDictionary independiente al que puede hacer referencia en otras partes de una aplicación. En el ejemplo siguiente se define un
color de fondo predeterminado en un diccionario de recursos.
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
...
</ResourceDictionary>
En el ejemplo siguiente se hace referencia al diccionario de recursos definido en el ejemplo anterior para compartirlo en toda la aplicación.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="BackgroundColorResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
...
</Application>
Los recursos y diccionarios de recursos constituyen el fundamento de la compatibilidad de WPF con los temas y las máscaras.
Para obtener más información, vea Información general sobre recursos. Para ver un ejemplo de introducción, vea Ejemplo Application
Resources.
Temas y máscaras
Desde una perspectiva visual, un tema define la apariencia global de Windows y de las aplicaciones que se ejecutan en su seno. Windows
incluye varios temas. Por ejemplo, Microsoft Windows XP se distribuye con los temas clásicos de Windows XP y Windows, mientras que
Windows Vista se distribuye con los temas clásicos de Windows Vista y Windows. La apariencia definida por un tema establece la apariencia
predeterminada de una aplicación WPF. Sin embargo, WPF no se integra directamente con los temas de Windows. Como el aspecto de WPF
se define mediante plantillas, WPF incluye una plantilla para cada uno de los temas conocidos de Windows, como Aero (Windows Vista),
Clásico (Microsoft Windows 2000), Luna (Microsoft Windows XP) y Royale (Microsoft Windows XP Media Center Edition 2005). Estos temas
están empaquetados en diccionarios de recursos que se resuelven cuando no se encuentran los recursos correspondientes en una
aplicación. Muchas aplicaciones se basan en estos temas para definir su apariencia visual; mantener la coherencia con la apariencia de
Windows ayuda a los usuarios a familiarizarse con las aplicaciones con mayor facilidad.
Por otro lado, la experiencia del usuario para algunas aplicaciones no procede necesariamente de los temas estándar. Por ejemplo,
Microsoft Windows Media Player funciona a través de datos de audio y vídeo y saca partido de un estilo diferente de experiencia del usuario.
Tales UIs tienden a proporcionar temas personalizados, específicos de cada aplicación. Se denominan máscaras, y las aplicaciones con
máscaras suelen proporcionar enlaces que permiten a los usuarios personalizar diversos aspectos de la máscara. Microsoft Windows Media
Player tiene varias máscaras prefabricadas, así como una serie de máscaras de otros fabricantes.
Tanto los temas como las máscaras de WPF se definen con toda facilidad mediante los diccionarios de recursos. En el ejemplo siguiente se
muestran ejemplos de definiciones de máscaras.
...
...
</ResourceDictionary>
...
</ResourceDictionary>
...
...
</ResourceDictionary>
...
</ResourceDictionary>
Para obtener más información, vea la sección sobre temas y recursos compartidos en Aplicar estilos y plantillas. Para ver un ejemplo de
introducción, vea Ejemplo Skinned Application.
Controles personalizados
Aunque WPF proporciona una amplísima compatibilidad con funciones de personalización, puede encontrar situaciones en que los controles
existentes de WPF no satisfagan las necesidades de la aplicación o de los usuarios. Esto puede suceder cuando:
La interfaz de usuario que necesita no se puede crear personalizando la apariencia y el funcionamiento de las implementaciones de WPF
existentes.
Las implementaciones de WPF existentes no admiten el comportamiento que se necesita (o lo admiten, pero no fácilmente).
Sin embargo, en este punto puede sacar partido de uno de los tres modelos de WPF para crear un nuevo control. Cada modelo está
destinado a un escenario concreto y exige que el control personalizado se derive de una clase base de WPF determinada. A continuación se
muestran los tres modelos:
Modelo de control de usuario. El control personalizado se deriva de UserControl y se crea a partir de uno o varios controles.
Modelo de control. El control personalizado se deriva de Control y se utiliza para generar implementaciones que separan su
comportamiento de su apariencia mediante plantillas, de un modo muy similar a la mayoría de los controles de WPF. Al derivarse de
Control, aporta mayor libertad para la creación de una interfaz de usuario personalizada que los controles de usuario, pero puede
requerir más esfuerzo.
Modelo de elemento de marco de trabajo. Un control personalizado se deriva de FrameworkElement cuando su apariencia se define
mediante la lógica de representación personalizada (no mediante plantillas).
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.NumericUpDown">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
</Grid>
</UserControl>
C# Copiar código
namespace SDKSample
{
public partial class NumericUpDown : UserControl
{
// NumericUpDown user control implementation
...
}
}
Namespace SDKSample
...
End Class
End Namespace
En el ejemplo siguiente se muestra el código XAML necesario para incorporar el control de usuario a una ventana (Window).
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.UserControlWindow"
xmlns:local="clr-namespace:SDKSample"
Title="User Control Window">
...
<!-- Numeric Up/Down user control -->
<local:NumericUpDown />
...
</Window>
Para obtener más información sobre controles personalizados, vea Información general sobre la creación de controles. Para ver ejemplos de
introducción, vea Ejemplos de personalización de controles.
Como sucede con cualquier plataforma de programación, WPF se puede utilizar de diversas maneras para lograr el resultado deseado. A fin
de asegurarse de que sus aplicaciones WPF proporcionen la experiencia de usuario necesaria y cumplan las exigencias del público en
general, existen procedimientos recomendados de accesibilidad, globalización y localización, y rendimiento. Para obtener más información,
vea las secciones siguientes:
Procedimientos de accesibilidad recomendados
Información general sobre la localización y globalización de WPF
Optimizar WPF: Rendimiento de aplicaciones
Resumen
WPF es una completa tecnología de presentación para generar gran variedad aplicaciones cliente impactantes desde el punto de vista
visual. En esta introducción se ha proporcionado una introducción general a las principales características de WPF.
Durante el proceso de creación, puede consultar de nuevo esta introducción para repasar las características clave y encontrar referencias a
artículos donde se abordan en mayor profundidad todas las características tratadas en esta introducción.
Temas de introducción
Ejemplos
Vea también
Conceptos
Información general sobre Windows Presentation Foundation
Comentarios de la comunidad de Windows Presentation Foundation
Sintaxis
C#
public class Button : ButtonBase
Visual C++
public ref class Button : public ButtonBase
J#
public class Button extends ButtonBase
JScript
public class Button extends ButtonBase
Comentarios
Administre el evento ButtonBase.Click para responder cuando el usuario hace clic en Button.
Ejemplos
El ejemplo siguiente muestra tres botones que responden a los clics de tres maneras diferentes.
Desplazar: el primer botón cambia de color cuando el usuario se desplaza con el mouse sobre el
botón.
Presionar: el segundo botón requiere que se presione el mouse mientras el puntero del mouse está
encima del botón.
Soltar: el tercero no restablece el color de fondo de los botones hasta que se presione el mouse y
se suelte el botón.
<Button Name="btn3"
Click="OnClick3" ClickMode="Release">
Reset
</Button>
C# Copiar código
Más código
Cómo: Crear un botón que En este ejemplo se muestra cómo incluir una imagen en un control
tenga una imagen Button.
Cómo: Crear un control que En este ejemplo se muestra cómo crear un control que tiene una
tenga tecla de acceso y tecla de acceso y admite el ajuste de texto. En el ejemplo se utiliza
ajuste de texto un control Label para ilustrar estos conceptos.
Jerarquía de herencia
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
System.Windows.Controls.Control
System.Windows.Controls.ContentControl
System.Windows.Controls.Primitives.ButtonBase
System.Windows.Controls.Button
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para
obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Conceptos
Ejemplo WPF Controls Gallery
Button Samples
Información general sobre controles
Biblioteca de controles
Referencia
Button (Miembros)
System.Windows.Controls (Espacio de nombres)
Representa un control que provoca su evento Click de forma repetida desde el momento en que se presiona
hasta que se suelta.
Sintaxis
C#
public class RepeatButton : ButtonBase
Visual C++
public ref class RepeatButton : public ButtonBase
J#
public class RepeatButton extends ButtonBase
JScript
public class RepeatButton extends ButtonBase
Comentarios
La clase RepeatButton que representa un control que es similar a Button. Sin embargo, los botones
repetidos le proporcionan control sobre cuándo y cómo se produce el evento Click. RepeatButton
provoca el evento Click de forma repetida desde el momento en que se presiona hasta que se suelta.
La propiedad Delay determina cuándo comienza el evento. También puede controlar el intervalo de las
repeticiones con la propiedad Interval.
Ejemplos
<TextBlock Name="valueText"
Width="100" DockPanel.Dock="Top"
TextAlignment="Center" FontSize="16">
0
</TextBlock>
C# Copiar código
Num = CInt(valueText.Text)
Num = CInt(valueText.Text)
Jerarquía de herencia
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
System.Windows.Controls.Control
System.Windows.Controls.ContentControl
System.Windows.Controls.Primitives.ButtonBase
System.Windows.Controls.Primitives.RepeatButton
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para
obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Referencia
RepeatButton (Miembros)
System.Windows.Controls.Primitives (Espacio de nombres)
Representa un cuadro de diálogo común que permite al usuario especificar un nombre de archivo para abrir
uno o varios archivos.
Sintaxis
C#
public sealed class OpenFileDialog : FileDialog
Visual C++
public ref class OpenFileDialog sealed : public FileDialog
J#
public final class OpenFileDialog extends FileDialog
JScript
public final class OpenFileDialog extends FileDialog
Jerarquía de herencia
System.Object
Microsoft.Win32.CommonDialog
Microsoft.Win32.FileDialog
Microsoft.Win32.OpenFileDialog
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para
obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Referencia
OpenFileDialog (Miembros)
Microsoft.Win32 (Espacio de nombres)
Invoca un cuadro de diálogo de impresión de Microsoft Windows estándar que configura PrintTicket y PrintQueue según los datos
proporcionados por el usuario e imprime luego un documento.
Sintaxis
C#
public class PrintDialog
Visual C++
public ref class PrintDialog
J#
public class PrintDialog
JScript
Comentarios
Un usuario puede utilizar el cuadro de diálogo Imprimir para seleccionar una impresora, configurarla y realizar un trabajo de
impresión.
En sentido estricto, puede utilizar el método PrintDocument sin abrir nunca el cuadro de diálogo. En ese sentido, se puede utilizar el
control como un componente de impresión oculto. No obstante, por razones de rendimiento, sería mejor utilizar el método AddJob o
uno de los numerosos métodos Write y WriteAsync de XpsDocumentWriter. Para obtener más información sobre esto, vea Cómo:
Imprimir mediante programación archivos XPS y Printing an XPS Document.
No confunda esta clase, System.Windows.Controls.PrintDialog, con System.Windows.Forms.PrintDialog. Esta última se utiliza con
aplicaciones de formularios Windows Forms. System.Windows.Controls.PrintDialog se utiliza con aplicaciones de Windows
Presentation Foundation (WPF).
Ejemplos
El ejemplo siguiente muestra cómo crear una instancia y mostrar un sencillo PrintDialog mediante marcado y código de Lenguaje de
marcado de aplicaciones extensible (XAML).
...
C# Copiar código
// Display the dialog. This returns true if the user presses the Print button.
Nullable<Boolean> print = pDialog.ShowDialog();
if (print == true)
{
XpsDocument xpsDocument = new XpsDocument("C:\\FixedDocumentSequence.xps", FileAccess.ReadWrite);
FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();
pDialog.PrintDocument(fixedDocSeq.DocumentPaginator, "Test print job");
}
}
Jerarquía de herencia
System.Object
System.Windows.Controls.PrintDialog
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las
versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Conceptos
Información general sobre impresión
Referencia
PrintDialog (Miembros)
System.Windows.Controls (Espacio de nombres)
Representa un cuadro de diálogo común que permite al usuario especificar un nombre de archivo para
guardar un archivo con ese nombre. Una aplicación que se ejecute con confianza parcial no podrá utilizar
SaveFileDialog.
Sintaxis
C#
public sealed class SaveFileDialog : FileDialog
Visual C++
public ref class SaveFileDialog sealed : public FileDialog
J#
public final class SaveFileDialog extends FileDialog
JScript
public final class SaveFileDialog extends FileDialog
Jerarquía de herencia
System.Object
Microsoft.Win32.CommonDialog
Microsoft.Win32.FileDialog
Microsoft.Win32.SaveFileDialog
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para
obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Referencia
SaveFileDialog (Miembros)
Microsoft.Win32 (Espacio de nombres)
Sintaxis
C#
[ContentPropertyAttribute("Children")]
public class InkCanvas : FrameworkElement, IAddChild
Visual C++
[ContentPropertyAttribute(L"Children")]
public ref class InkCanvas : public FrameworkElement,
IAddChild
J#
/** @attribute ContentPropertyAttribute("Children") */
public class InkCanvas extends FrameworkElement implements IAddChild
JScript
public class InkCanvas extends FrameworkElement implements IAddChild
Comentarios
InkCanvas es un elemento que se puede utilizar para recibir y mostrar entradas de entrada
manuscrita. Normalmente esta operación se lleva a cabo mediante el uso de un lápiz o un mouse que
interactúan con un digitalizador para generar trazos de entrada manuscrita. Los trazos creados se
representan como objetos Stroke y se pueden manipular mediante programación o a través de los
datos proporcionados por el usuario. InkCanvas permite al usuario modificar o eliminar un objeto
Stroke existente.
InkCanvas se puede enlazar a un origen de datos. Por ejemplo, puede enlazar la propiedad Strokes a
una cadena codificada en base 64 que contenga los datos de entrada manuscrita en el Formato
serializado de tinta (ISF) o incluso puede enlazarla a la propiedad Strokes de otra clase InkCanvas.
También puede enlazar propiedades, como DefaultDrawingAttributes y EditingMode, a otros orígenes
de datos.
Ejemplos
C# Copiar código
root.Children.Add(inkCanvas1);
inkCanvas1.DefaultDrawingAttributes = inkDA;
}
if (useHighlighter)
{
switchHighlighter.Content = "Use Pen";
inkCanvas1.DefaultDrawingAttributes = highlighterDA;
}
else
{
switchHighlighter.Content = "Use Highlighter";
inkCanvas1.DefaultDrawingAttributes = inkDA;
}
}
inkCanvas1.Background = Brushes.DarkSlateBlue
inkCanvas1.DefaultDrawingAttributes.Color = Colors.SpringGreen
inkCanvas1.DefaultDrawingAttributes = inkDA
If useHighlighter Then
switchHighlighter.Content = "Use Pen"
inkCanvas1.DefaultDrawingAttributes = highlighterDA
Else
<Canvas>
<Canvas.Resources>
<!--Define an array containing the InkEditingMode Values.-->
<x:Array x:Key="MyEditingModes" x:Type="{x:Type InkCanvasEditingMode}">
<x:Static Member="InkCanvasEditingMode.Ink"/>
<x:Static Member="InkCanvasEditingMode.Select"/>
<x:Static Member="InkCanvasEditingMode.EraseByPoint"/>
<x:Static Member="InkCanvasEditingMode.EraseByStroke"/>
</x:Array>
<InkCanvas.LayoutTransform>
<ScaleTransform ScaleX="-1" ScaleY="1" />
</InkCanvas.LayoutTransform>
</InkCanvas>
</Canvas>
Jerarquía de herencia
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
System.Windows.Controls.InkCanvas
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para
obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Conceptos
Ejemplo WPF Controls Gallery
Enlace de datos
Referencia
InkCanvas (Miembros)
System.Windows.Controls (Espacio de nombres)
Sintaxis
C#
public class InkPresenter : Decorator
Visual C++
public ref class InkPresenter : public Decorator
J#
public class InkPresenter extends Decorator
JScript
public class InkPresenter extends Decorator
Comentarios
Ejemplos
C# Copiar código
public Window1()
{
InitializeComponent();
this.Content = inkPresenter1;
strokePoints.Add(segment1Start);
strokePoints.Add(segment1End);
strokePoints.Add(segment2Start);
strokePoints.Add(segment2End);
strokePoints.Add(segment3Start);
strokePoints.Add(segment3End);
strokePoints.Add(segment4Start);
strokePoints.Add(segment4End);
strokePoints.Add(segment5Start);
strokePoints.Add(segment5End);
strokePoints.Add(segment6Start);
strokePoints.Add(segment6End);
strokePoints.Add(segment7Start);
strokePoints.Add(segment7End);
strokePoints.Add(segment8Start);
strokePoints.Add(segment8End);
strokePoints.Add(segment9Start);
strokePoints.Add(segment9End);
strokePoints.Add(segment10Start);
strokePoints.Add(segment10End);
Class Window1
Inherits Window '
Private inkPresenter1 As InkPresenter
strokePoints.Add(segment1Start)
strokePoints.Add(segment1End)
strokePoints.Add(segment2Start)
strokePoints.Add(segment2End)
strokePoints.Add(segment3Start)
strokePoints.Add(segment3End)
strokePoints.Add(segment4Start)
strokePoints.Add(segment4End)
strokePoints.Add(segment5Start)
strokePoints.Add(segment5End)
strokePoints.Add(segment6Start)
strokePoints.Add(segment6End)
strokePoints.Add(segment7Start)
strokePoints.Add(segment7End)
strokePoints.Add(segment8Start)
strokePoints.Add(segment8End)
strokePoints.Add(segment9Start)
strokePoints.Add(segment9End)
strokePoints.Add(segment10Start)
strokePoints.Add(segment10End)
Jerarquía de herencia
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
System.Windows.Controls.Decorator
System.Windows.Controls.InkPresenter
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para
obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Referencia
InkPresenter (Miembros)
System.Windows.Controls (Espacio de nombres)
Representa un control de visualización de documentos que puede hospedar contenido FixedDocument paginado como
XpsDocument.
Sintaxis
C#
[TemplatePartAttribute(Name = "PART_FindToolBarHost", Type = typeof(ContentControl))]
[TemplatePartAttribute(Name = "PART_ContentHost", Type = typeof(ScrollViewer))]
public class DocumentViewer : DocumentViewerBase
Visual C++
[TemplatePartAttribute(Name = L"PART_FindToolBarHost", Type = typeof(ContentControl))]
[TemplatePartAttribute(Name = L"PART_ContentHost", Type = typeof(ScrollViewer))]
public ref class DocumentViewer : public DocumentViewerBase
J#
/** @attribute TemplatePartAttribute(Name = "PART_FindToolBarHost", Type = ContentControl) */
/** @attribute TemplatePartAttribute(Name = "PART_ContentHost", Type = ScrollViewer) */
public class DocumentViewer extends DocumentViewerBase
JScript
public class DocumentViewer extends DocumentViewerBase
Jerarquía de herencia
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
System.Windows.Controls.Control
System.Windows.Controls.Primitives.DocumentViewerBase
System.Windows.Controls.DocumentViewer
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una
lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Conceptos
Ejemplo WPF Controls Gallery
Referencia
DocumentViewer (Miembros)
System.Windows.Controls (Espacio de nombres)
DocumentPaginator
Representa un control para ver el contenido de flujo en un modo de vista fijo que muestra una página de contenido a la vez.
Sintaxis
C#
[TemplatePartAttribute(Name = "PART_FindToolBarHost", Type = typeof(Decorator))]
public class FlowDocumentPageViewer : DocumentViewerBase
Visual C++
[TemplatePartAttribute(Name = L"PART_FindToolBarHost", Type = typeof(Decorator))]
public ref class FlowDocumentPageViewer : public DocumentViewerBase
J#
/** @attribute TemplatePartAttribute(Name = "PART_FindToolBarHost", Type = Decorator) */
public class FlowDocumentPageViewer extends DocumentViewerBase
JScript
public class FlowDocumentPageViewer extends DocumentViewerBase
Comentarios
FlowDocumentPageViewer muestra el contenido en el modo de vista de una página a la vez. Un control similar,
FlowDocumentScrollViewer, muestra el contenido en modo de desplazamiento continuo. Tanto
FlowDocumentPageViewer como FlowDocumentScrollViewer son fijos para un modo de vista concreto. Por otro
lado, FlowDocumentReader incluye características que permiten al usuario elegir dinámicamente entre varios modos
de vista (suministrados por la enumeración FlowDocumentReaderViewingMode), a costa de que el rendimiento sea
más pobre que el de FlowDocumentPageViewer o FlowDocumentScrollViewer.
Ejemplos
<Floater
Background="GhostWhite"
Width="285" HorizontalAlignment="Left"
>
<Table CellSpacing="5">
<Table.Columns>
<TableColumn Width="155"/>
<TableColumn Width="130"/>
</Table.Columns>
<TableRowGroup>
<TableRow>
<TableCell ColumnSpan="3">
<Paragraph>Neptune Stats</Paragraph>
</TableCell>
</TableRow>
Jerarquía de herencia
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
System.Windows.Controls.Control
System.Windows.Controls.Primitives.DocumentViewerBase
System.Windows.Controls.FlowDocumentPageViewer
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una
lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Conceptos
Información general sobre documentos dinámicos
Referencia
FlowDocumentPageViewer (Miembros)
System.Windows.Controls (Espacio de nombres)
Proporciona un control para ver el contenido dinámico, con compatibilidad integrada para varios modos de vista.
Sintaxis
C#
[ContentPropertyAttribute("Document")]
[TemplatePartAttribute(Name = "PART_ContentHost", Type = typeof(Decorator))]
[TemplatePartAttribute(Name = "PART_FindToolBarHost", Type = typeof(Decorator))]
public class FlowDocumentReader : Control, IAddChild
Visual C++
[ContentPropertyAttribute(L"Document")]
[TemplatePartAttribute(Name = L"PART_ContentHost", Type = typeof(Decorator))]
[TemplatePartAttribute(Name = L"PART_FindToolBarHost", Type = typeof(Decorator))]
public ref class FlowDocumentReader : public Control,
IAddChild
J#
/** @attribute ContentPropertyAttribute("Document") */
/** @attribute TemplatePartAttribute(Name = "PART_ContentHost", Type = Decorator) */
/** @attribute TemplatePartAttribute(Name = "PART_FindToolBarHost", Type = Decorator) */
public class FlowDocumentReader extends Control implements IAddChild
JScript
public class FlowDocumentReader extends Control implements IAddChild
Comentarios
FlowDocumentReader dispone de características que permiten al usuario elegir dinámicamente entre distintos
modos de vista, incluido el modo de vista de página única (una página cada vez), dos páginas a la vez (formato de
lectura de libro) y desplazamiento continuo (sin límite). Si no necesita cambiar dinámicamente entre diferentes modos
de vista, hay visores de contenido dinámico más ligeros que disponen de un modo de vista determinado.
FlowDocumentPageViewer muestra el contenido dinámico en una sola página, mientras que FlowDocumentScrollViewer
muestra el contenido dinámico en modo de desplazamiento continuo. Para obtener más información sobre los modos
de presentación disponibles, vea FlowDocumentReaderViewingMode.
Ejemplos
<!-- This Figure uses relative measurements for width and height. -->
<Figure
Width="0.25" Height="0.1" Background="GhostWhite"
HorizontalAnchor="PageLeft"
HorizontalOffset="100" VerticalOffset="20"
>
<Paragraph
FontStyle="Italic" TextAlignment="Left"
Background="Beige" Foreground="DarkGreen"
>
Neptune has 72 times Earth's volume...
</Paragraph>
</Figure>
<TableRowGroup>
<TableRow>
<TableCell ColumnSpan="3">
<Paragraph>Neptune Stats</Paragraph>
</TableCell>
</TableRow>
Jerarquía de herencia
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
System.Windows.Controls.Control
System.Windows.Controls.FlowDocumentReader
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una
lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Conceptos
Información general sobre documentos dinámicos
Ejemplos de FlowDocumentReader
Referencia
FlowDocumentReader (Miembros)
System.Windows.Controls (Espacio de nombres)
Sintaxis
C#
[TemplatePartAttribute(Name = "PART_FindToolBarHost", Type = typeof(Decorator))]
[ContentPropertyAttribute("Document")]
[TemplatePartAttribute(Name = "PART_ContentHost", Type = typeof(ScrollViewer))]
[TemplatePartAttribute(Name = "PART_ToolBarHost", Type = typeof(Decorator))]
public class FlowDocumentScrollViewer : Control, IAddChild,
IServiceProvider
Visual C++
[TemplatePartAttribute(Name = L"PART_FindToolBarHost", Type = typeof(Decorator))]
[ContentPropertyAttribute(L"Document")]
[TemplatePartAttribute(Name = L"PART_ContentHost", Type = typeof(ScrollViewer))]
[TemplatePartAttribute(Name = L"PART_ToolBarHost", Type = typeof(Decorator))]
public ref class FlowDocumentScrollViewer : public Control,
IAddChild, IServiceProvider
J#
/** @attribute TemplatePartAttribute(Name = "PART_FindToolBarHost", Type = Decorator) */
/** @attribute ContentPropertyAttribute("Document") */
/** @attribute TemplatePartAttribute(Name = "PART_ContentHost", Type = ScrollViewer) */
/** @attribute TemplatePartAttribute(Name = "PART_ToolBarHost", Type = Decorator) */
public class FlowDocumentScrollViewer extends Control implements IAddChild,
IServiceProvider
JScript
public class FlowDocumentScrollViewer extends Control implements IAddChild, IServiceProvider
Comentarios
Ejemplos
<TableRowGroup>
<TableRow>
<TableCell ColumnSpan="3">
<Paragraph>Neptune Stats</Paragraph>
</TableCell>
</TableRow>
Jerarquía de herencia
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
System.Windows.Controls.Control
System.Windows.Controls.FlowDocumentScrollViewer
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una
lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Conceptos
Información general sobre documentos dinámicos
Referencia
FlowDocumentScrollViewer (Miembros)
System.Windows.Controls (Espacio de nombres)
Representa un control que permite que los usuarios asocien a los documentos anotaciones escritas a mano o texto
escrito a máquina.
Sintaxis
C#
[TemplatePartAttribute(Name = "PART_EraseMenuItem", Type = typeof(MenuItem))]
[TemplatePartAttribute(Name = "PART_SelectMenuItem", Type = typeof(MenuItem))]
[TemplatePartAttribute(Name = "PART_CloseButton", Type = typeof(Button))]
[TemplatePartAttribute(Name = "PART_TitleThumb", Type = typeof(Thumb))]
[TemplatePartAttribute(Name = "PART_ResizeBottomRightThumb", Type = typeof(Thumb))]
[TemplatePartAttribute(Name = "PART_ContentControl", Type = typeof(ContentControl))]
[TemplatePartAttribute(Name = "PART_IconButton", Type = typeof(Button))]
[TemplatePartAttribute(Name = "PART_CopyMenuItem", Type = typeof(MenuItem))]
[TemplatePartAttribute(Name = "PART_PasteMenuItem", Type = typeof(MenuItem))]
[TemplatePartAttribute(Name = "PART_InkMenuItem", Type = typeof(MenuItem))]
public sealed class StickyNoteControl : Control
Visual C++
[TemplatePartAttribute(Name = L"PART_EraseMenuItem", Type = typeof(MenuItem))]
[TemplatePartAttribute(Name = L"PART_SelectMenuItem", Type = typeof(MenuItem))]
[TemplatePartAttribute(Name = L"PART_CloseButton", Type = typeof(Button))]
[TemplatePartAttribute(Name = L"PART_TitleThumb", Type = typeof(Thumb))]
[TemplatePartAttribute(Name = L"PART_ResizeBottomRightThumb", Type = typeof(Thumb))]
[TemplatePartAttribute(Name = L"PART_ContentControl", Type = typeof(ContentControl))]
[TemplatePartAttribute(Name = L"PART_IconButton", Type = typeof(Button))]
[TemplatePartAttribute(Name = L"PART_CopyMenuItem", Type = typeof(MenuItem))]
[TemplatePartAttribute(Name = L"PART_PasteMenuItem", Type = typeof(MenuItem))]
[TemplatePartAttribute(Name = L"PART_InkMenuItem", Type = typeof(MenuItem))]
public ref class StickyNoteControl sealed : public Control
J#
/** @attribute TemplatePartAttribute(Name = "PART_EraseMenuItem", Type = MenuItem) */
/** @attribute TemplatePartAttribute(Name = "PART_SelectMenuItem", Type = MenuItem) */
/** @attribute TemplatePartAttribute(Name = "PART_CloseButton", Type = Button) */
/** @attribute TemplatePartAttribute(Name = "PART_TitleThumb", Type = Thumb) */
/** @attribute TemplatePartAttribute(Name = "PART_ResizeBottomRightThumb", Type = Thumb) */
/** @attribute TemplatePartAttribute(Name = "PART_ContentControl", Type = ContentControl) */
/** @attribute TemplatePartAttribute(Name = "PART_IconButton", Type = Button) */
/** @attribute TemplatePartAttribute(Name = "PART_CopyMenuItem", Type = MenuItem) */
/** @attribute TemplatePartAttribute(Name = "PART_PasteMenuItem", Type = MenuItem) */
/** @attribute TemplatePartAttribute(Name = "PART_InkMenuItem", Type = MenuItem) */
public final class StickyNoteControl extends Control
JScript
public final class StickyNoteControl extends Control
XAML
No se puede crear una instancia de esta clase directamente en XAML.
Comentarios
Una nota rápida proporciona una área rectangular cuyo contenido es independiente del texto, imagen u otro
material donde se encuentre delimitada la nota.
La clase StickyNoteControl y sus miembros son públicos, de modo que se le puede asignar un estilo, pero no se
trata de un constructor público. Las instancias se crean con CreateTextStickyNoteCommand y
CreateInkStickyNoteCommand de la clase AnnotationService.
Cuando se crea una nota rápida, se designa como uno de estos dos tipos:
Las notas rápidas de texto tienen una área de contenido RichTextBox en la que se puede escribir y que se
puede editar como cualquier otra área de texto enriquecido. Los usuarios pueden escribir en ella, así como
cortar, copiar y pegar tanto dentro de la nota como entre la nota y otras aplicaciones. También pueden pegarse
imágenes en la nota. Los métodos abreviados de teclado de texto enriquecido normales también se encuentran
disponibles.
Las notas rápidas manuscritas tienen una área de contenido InkCanvas que puede editarse como cualquier
otro lienzo de entrada manuscrita. Por ejemplo, pueden borrarse trazos. Con un Tablet PC u otro hardware
adecuado, los usuarios pueden escribir notas a mano.
La interfaz de usuario (UI) de StickyNoteControl hace que se convierta en una forma más eficaz de anotar
material que añadir marcas a una impresión o utilizar notas físicas escritas a mano. También resulta más flexible
que simplemente agregar o tachar el texto de un documento.
Es posible cambiar el tamaño de las notas rápidas.
Las notas rápidas pueden minimizarse en un icono y expandirse.
Una nota rápida, cuando se maximiza, puede arrastrarse hasta una nueva posición en una ventana sin
necesidad de cambiar la ubicación de su delimitador.
El contenido exacto al que se aplica una nota rápida se resalta y incluye entre corchetes.
Es posible aplicar dos o más notas rápidas al mismo contenido o a contenido superpuesto.
Si se produce algún cambio en el contenido del documento en el que está delimitada nota rápida, la nota rápida
pasa a una posición relativa al contenido al que estaba enlazada.
En el caso de las notas rápidas de texto, las líneas ajustarán automáticamente. Si se modifica el tamaño de la
nota, las líneas volverán a ajustarse en función de las necesidades. Si el contenido se extiende por debajo de la
parte inferior de la nota, aparecerá una barra de desplazamiento vertical.
En el caso de las notas rápidas manuscritas, aparecerán barras de desplazamiento verticales y horizontales
siempre que el contenido se extienda más allá de los límites de la nota.
Ejemplos
En el ejemplo siguiente se muestra cómo pueden configurarse los comandos de menú de DocumentViewer para
ejecutar CreateTextStickyNoteCommand y CreateInkStickyNoteCommand de la clase AnnotationService. Encontrará
el ejemplo completo en Ejemplo DocumentViewer with Annotations XPS-Store. En el ejemplo se muestra cómo leer
un documento de XML Paper Specification (XPS) en un control DocumentViewer y, a continuación, cómo habilitar la
compatibilidad necesaria para agregar notas rápidas creadas por usuario.
<DocumentViewer.ContextMenu>
<ContextMenu>
<MenuItem Command="ApplicationCommands.Copy" />
<Separator />
<!-- Add a Highlight annotation to a user selection. -->
<MenuItem Command="ann:AnnotationService.CreateHighlightCommand"
Header="Add Highlight" />
<!-- Add a Text Note annotation to a user selection. -->
<MenuItem Command="ann:AnnotationService.CreateTextStickyNoteCommand"
Header="Add Text Note" />
<!-- Add an Ink Note annotation to a user selection. -->
<MenuItem Command="ann:AnnotationService.CreateInkStickyNoteCommand"
Header="Add Ink Note" />
<Separator />
<!-- Remove Highlights from a user selection. -->
<MenuItem Command="ann:AnnotationService.ClearHighlightsCommand"
Header="Remove Highlights" />
<!-- Remove Text Notes and Ink Notes from a user selection. -->
<MenuItem Command="ann:AnnotationService.DeleteStickyNotesCommand"
Header="Remove Notes" />
<!-- Remove Highlights, Text Notes, Ink Notes from a selection. -->
<MenuItem Command="ann:AnnotationService.DeleteAnnotationsCommand"
Header="Remove Highlights & Notes" />
</ContextMenu>
</DocumentViewer.ContextMenu>
Jerarquía de herencia
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
System.Windows.Controls.Control
System.Windows.Controls.StickyNoteControl
Plataformas
Windows Vista
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una
lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Información de versión
.NET Framework
Compatible con: 3.5, 3.0 SP1, 3.0
Vea también
Conceptos
Información general sobre anotaciones
Referencia
StickyNoteControl (Miembros)
System.Windows.Controls (Espacio de nombres)
AnnotationService
En esta introducción se describe el uso de los recursos de WPF como una manera simple de reutilizar los objetos y valores que se definen de
forma común. Esta introducción se centra en cómo utilizar los recursos en XAML. También se pueden crear y obtener acceso a los recursos
utilizando código o, de forma intercambiable, código y Lenguaje de marcado de aplicaciones extensible (XAML). Para obtener más
información, vea Recursos y código.
Este tema contiene las secciones siguientes.
Utilizar recursos en XAML
Recursos estáticos y recursos dinámicos
Estilos, plantillas de datos y claves implícitas
Temas relacionados
Cada elemento del marco de trabajo (FrameworkElement o FrameworkContentElement) tiene una propiedad Resources, que es la que
contiene los recursos (como un objeto ResourceDictionary) definidos por un recurso. Los recursos se pueden definir en cualquier
elemento. Sin embargo, normalmente se definen en el elemento raíz que, en el ejemplo, es Page.
Cada recurso incluido en un diccionario de recursos debe tener una clave única. Al definir los recursos en el marcado, se asigna la clave
única a través de x:Key (atributo). Normalmente, la clave es una cadena; sin embargo, también se puede establecer en objetos de otros
tipos utilizando las extensiones de marcado adecuadas. Las claves de recursos que no son de cadena se utilizan en ciertas áreas de
características en WPF, principalmente en los estilos, los recursos de componentes y los estilos de datos.
Una vez definido un recurso, se puede hacer referencia al recurso que se debe utilizar para un valor de propiedad utilizando una sintaxis
de extensión de marcado de recursos que especifique el nombre de la clave, como por ejemplo:
XAML Copiar código
<Button Background="{StaticResource MyBrush}"/>
<Ellipse Fill="{StaticResource MyBrush}"/>
En el ejemplo anterior, cuando el cargador XAML procesa el valor {StaticResource MyBrush} para la propiedad Background de
Button, la lógica de búsqueda de recursos comprueba primero la existencia del elemento Button en el diccionario de recursos. Si Button
no tiene una definición de la clave de recurso MyBrush (no la tiene; su colección de recursos está vacía), la búsqueda comprueba a
continuación el elemento primario de Button, que es Page. Así, cuando se define un recurso en el elemento raíz Page, todos los
elementos del árbol lógico del objeto Page pueden tener acceso a él y se puede reutilizar el mismo recurso para establecer el valor de
cualquier propiedad que acepte el objeto Type que representa el recurso. En el ejemplo anterior, el mismo recurso MyBrush establece
dos propiedades diferentes: la propiedad Background de un objeto Button y la propiedad Fill de un objeto Rectangle.
Recursos estáticos
Las referencias de recursos estáticos funcionan mejor en las circunstancias siguientes:
No tiene ninguna intención de cambiar el valor del recurso una vez que ha hecho referencia a él por primera vez.
El diseño de la aplicación concentra la mayoría de sus recursos en diccionarios de recursos en el nivel de aplicación o de página. Las
referencias de recursos estáticos no se vuelven a evaluar basándose en los comportamientos en tiempo de ejecución, como recargar
una página, por lo que puede haber cierta mejora en el rendimiento si se evita el uso de grandes cantidades de referencias de
recursos dinámicos cuando no son necesarias para el diseño de los recursos y de la aplicación.
Está estableciendo el valor de una propiedad que no está en un objeto DependencyObject o Freezable.
Está creando un diccionario de recursos que se compilará en una DLL y que se empaquetará como parte de la aplicación o se
compartirá entre distintas aplicaciones.
Está creando un tema para un control personalizado y está definiendo recursos que se utilizan dentro de los temas. En este caso, no
es conveniente utilizar el comportamiento de búsqueda de referencia de recursos dinámicos, sino el comportamiento de referencia de
recursos estáticos con objeto de que la búsqueda sea predecible y se circunscriba al tema. Con una referencia de recursos dinámicos,
incluso una referencia dentro de un tema permanecerá sin evaluar hasta el tiempo de ejecución, y existe la posibilidad de que cuando
se aplique el tema, algún elemento local redefina una clave a la que el tema está intentando hacer referencia, con lo que dicho
elemento se encontrará antes que el propio tema durante la búsqueda. Si este es el caso, el tema no se comportará de la manera
esperada.
Está utilizando los recursos para establecer un gran número de propiedades de dependencia. Las propiedades de dependencia
permiten el almacenamiento en caché del valor efectivo tal y como ha sido habilitado por el sistema de propiedades, por lo que si se
proporciona un valor para una propiedad de dependencia que se puede evaluar en el momento de la carga, dicha propiedad no tendrá
que comprobar la existencia de una expresión que se ha vuelto a evaluar y podrá devolver el último valor efectivo. Esta técnica puede
suponer una mejora en el rendimiento.
Recursos dinámicos
Los recursos dinámicos funcionan mejor en las circunstancias siguientes:
El valor del recurso depende de condiciones que no se conocen hasta el tiempo de ejecución. Esto incluye los recursos del sistema, o
los recursos que de otra forma serían establecidos por el usuario. Por ejemplo, puede crear valores de establecedor que hacen
referencia a las propiedades del sistema, de la forma expuesta por SystemColors, SystemFonts o SystemParameters. Estos valores
son auténticamente dinámicos porque proceden del entorno en tiempo de ejecución del usuario y del sistema operativo. También es
posible tener temas de nivel de aplicación que pueden cambiar, en los que el acceso a recursos de nivel de página también debe
capturar los cambios.
Está creando o haciendo referencia a los estilos del tema para un control personalizado.
Desea ajustar el contenido de un objeto ResourceDictionary durante la duración de una aplicación.
Dispone de una estructura de recursos compleja que tiene interdependencias, y en la que es posible que se necesite una referencia
adelantada. A diferencia de las referencias de recursos estáticos, las referencias de recursos dinámicos admiten las referencias
adelantadas, ya que no es necesario evaluar el recurso hasta el tiempo de ejecución y, por consiguiente, las referencias adelantadas
no son un concepto pertinente.
Está haciendo referencia a un recurso que es de gran tamaño desde la perspectiva de un espacio de compilación o de trabajo, y es
posible que dicho recurso no se utilice inmediatamente al cargar la página. Las referencias de recursos estáticos siempre se cargan
desde XAML al cargar la página; sin embargo, una referencia de un recurso dinámico no lo hace hasta que se utiliza realmente.
Está creando un estilo cuyos valores de establecedor podrían proceder de otros valores influenciados por los temas o por otras
configuraciones del usuario.
Está aplicando recursos a elementos que podrían haber cambiado de elemento primario en el árbol lógico durante la duración de la
aplicación. Al cambiar el elemento primario, también se cambia potencialmente el ámbito de búsqueda de recursos, por lo que si
desea que el recurso para un elemento que ha cambiado de elemento primario se vuelva a evaluar dependiendo del nuevo ámbito,
siempre debe utilizar una referencia de recurso dinámico.
Restricciones
Las referencias de recursos dinámicos tienen algunas restricciones importantes. Al menos debe cumplirse una de las condiciones
siguientes:
La propiedad que se establece debe ser una propiedad en un objeto FrameworkElement o FrameworkContentElement. Dicha
propiedad debe estar respaldada por un objeto DependencyProperty.
La referencia es para un valor dentro de un objeto Style Setter.
La propiedad que se establece debe ser una propiedad en un objeto Freezable que se proporciona como un valor para una propiedad
de FrameworkElement o FrameworkContentElement, o un valor Setter.
Dado que la propiedad que se establece debe ser una propiedad de DependencyProperty o Freezable, la mayoría de los cambios en la
propiedad se pueden propagar a la interfaz de usuario debido a que dichos cambios (el valor de recurso dinámico modificado) están
confirmados por el sistema de propiedades. La mayoría de los controles incluyen lógica que forzará otro diseño del control si cambia un
objeto DependencyProperty y esa propiedad podría afectar al diseño. Sin embargo, no está garantizado que todas las propiedades que
tengan una Extensión de marcado DynamicResource como valor proporcionen éste de manera que se actualicen en tiempo real en la
interfaz de usuario. Esa funcionalidad podría variar dependiendo de la propiedad, así como del tipo que posea ésta o incluso de la
estructura lógica de la aplicación.
En realidad, el estilo tiene una clave: la clave implícita typeof(Button). En el marcado, puede especificar directamente una propiedad
TargetType como nombre del tipo (o también puede utilizar {x:Type...} para devolver un objeto Type.
A través de los mecanismos de estilo del tema predeterminado utilizados por WPF, ese estilo se aplica como el estilo en tiempo de
ejecución de un objeto Button en la página, aunque el propio objeto Button no intenta especificar su propiedad Style o una referencia de
recurso concreta al estilo. El estilo definido en la página se encontrará antes que el estilo de diccionario de tema en la secuencia de
búsqueda, utilizando la misma clave que este último estilo. También podría especificar <Button>Hello</Button> en cualquier lugar de
la página, y el estilo definido con la propiedad TargetType de Button se aplicaría a ese botón. Si lo desea, también puede asignar
explícitamente al estilo el mismo valor de tipo que TargetType, por motivos de claridad en el marcado, pero eso es opcional.
Las claves implícitas para los estilos no se aplican en un control si OverridesDefaultStyle es true (observe también que
OverridesDefaultStyle se podría establecer como parte del comportamiento nativo para la clase de control, en lugar de establecerse
explícitamente en una instancia del control). Asimismo, para poder admitir las claves implícitas para los escenarios de clase derivada, el
control debe invalidar DefaultStyleKey (todos los controles existentes proporcionados como parte de WPF hacen esto). Para obtener más
información sobre el diseño de estilos, temas y controles, vea Instrucciones para el diseño de controles con estilos.
DataTemplate también tiene una clave implícita. La clave implícita para un objeto DataTemplate es el valor de la propiedad DataType.
DataType también se puede especificar como el nombre del tipo en lugar de hacerlo explícitamente utilizando {x:Type...}. Para obtener
información detallada, vea Información general sobre plantillas de datos.
Vea también
Conceptos
Optimizar el rendimiento: Recursos de aplicación
Recursos y código
Cómo: Definir y hacer referencia a un recurso
Información general sobre la administración de aplicaciones
Extensión de marcado x:Type
Extensión de marcado StaticResource
Extensión de marcado DynamicResource
Referencia
ResourceDictionary
Windows Presentation Foundation (WPF) proporciona un conjunto eficaz de características de gráficos y diseño que permite crear interfaces
de usuario y documentos atractivos. Las animaciones pueden hacer que una interfaz de usuario sea más vistosa y práctica. Simplemente con
animar un color de fondo o con aplicar un elemento Transform animado, puede crear transiciones de pantalla espectaculares o proporcionar
indicaciones visuales útiles.
Aquí se ofrece una introducción al sistema de animación y temporización de WPF. Se centra en la animación de objetos WPF mediante
guiones gráficos.
Este tema contiene las secciones siguientes.
<Rectangle
Name="MyRectangle"
Width="100"
Height="100"
Fill="Blue">
</Rectangle>
</StackPanel>
</Page>
Copiar código
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace Microsoft.SDK.Animation
{
public class RectangleOpacityFadeExample : Page
{
public RectangleOpacityFadeExample()
{
NameScope.SetNameScope(this, new NameScope());
this.WindowTitle = "Fading Rectangle Example";
StackPanel myPanel = new StackPanel();
myPanel.Margin = new Thickness(10);
Copiar código
Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(Rectangle.OpacityProperty));
Para obtener más información acerca de la sintaxis de TargetProperty y más ejemplos, vea Información general sobre objetos
Storyboard.
Cree un EventTrigger y agregue BeginStoryboard a su colección Actions. Establezca la propiedad RoutedEvent de EventTrigger en el
evento enrutado que desee para iniciar Storyboard. Para obtener más información acerca de los eventos enrutados, vea Información
general sobre eventos enrutados.
XAML Copiar código
<!-- Animates the rectangle's opacity. -->
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:5"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
Ejemplo completo
En el ejemplo siguiente se muestra el código completo que es necesario para crear un rectángulo que se intensifica y se atenúa hasta
desaparecer.
XAML Copiar código
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="Fading Rectangle Example">
<StackPanel Margin="10">
<Rectangle
Name="MyRectangle"
Width="100"
Height="100"
Fill="Blue">
<Rectangle.Triggers>
<!-- Animates the rectangle's opacity. -->
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:5"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</StackPanel>
</Page>
C# Copiar código
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace SDKSample
{
public RectangleOpacityFadeExample()
{
NameScope.SetNameScope(this, new NameScope());
myPanel.Children.Add(myRectangle);
this.Content = myPanel;
}
}
}
Tipos de animación
Dado que las animaciones generan valores de propiedad, existen distintos tipos de animaciones para los diversos tipos de propiedades.
Para animar una propiedad que acepta una estructura Double, como la propiedad Width de un elemento, se usa una animación que
genera valores Double. Para animar una propiedad que acepta una estructura Point, se usa una animación que genera valores Point; y
así sucesivamente. Dado que existen tipos de propiedades diferentes, hay varias clases de animación en el espacio de nombres
System.Windows.Media.Animation. Afortunadamente se rigen por una convención de nomenclatura estricta que hace que sea fácil
diferenciarlas:
<Tipo>Animation
Conocidas como animaciones "From/To/By" o "basic", generan una animación entre un valor inicial y de destino o agregan un valor de
desplazamiento al valor inicial.
Para especificar un valor inicial, establezca la propiedad From de la animación.
Para especificar un valor final, establezca la propiedad To de la animación.
Para especificar un valor de desplazamiento, establezca la propiedad By de la animación.
En los ejemplos de este tema se incluyen estas animaciones porque son las más fáciles de usar. Las animaciones From/To/By se
describen en detalle en Información general sobre animaciones From/To/By.
<<Tipo>AnimationUsingKeyFrames
Las animaciones de fotogramas clave son más eficaces que las animaciones From/To/By porque se puede especificar cualquier
número de valores de destino e incluso controlar su método de interpolación. Algunos tipos solo se pueden animar con animaciones
de fotogramas clave. Las animaciones de fotogramas clave se describen con detalle en Información general sobre animaciones de
fotogramas clave.
<<Tipo>AnimationUsingPath
Las animaciones de trazado permiten usar un trazado geométrico para generar valores animados.
<<Tipo>AnimationBase
Clase abstracta que, cuando se implementa, anima un valor de <Tipo>. Esta clase actúa como clase base para las clases
<Tipo>Animation y <Tipo>AnimationUsingKeyFrames. Tiene que tratar directamente con estas clases solo si desea crear sus propias
animaciones personalizadas. En caso contrario, use <Tipo>Animation o KeyFrame<Tipo>Animation.
En la mayoría de los casos, deseará usar las clases <Tipo>Animation, como DoubleAnimation y ColorAnimation.
La tabla siguiente muestra varios tipos de animación comunes y algunas propiedades con las que se usan.
Tipo de Animación básica Animación de fotogramas clave Animación de trazado Ejemplo de uso
propiedad correspondiente correspondiente correspondiente
(From/To/By)
Propiedad Duration
Como se ha mencionado previamente, una escala de tiempo representa un segmento de tiempo. La propiedad Duration de la escala de
tiempo, que normalmente se especifica mediante un valor TimeSpan, determina la longitud de ese segmento. Cuando una escala de
tiempo llega al final de su duración, ha completado una iteración.
Una animación usa su propiedad Duration para determinar su valor actual. Si no especifica un valor Duration para una animación, se usa
1 segundo, que es el valor predeterminado.
La sintaxis siguiente muestra una versión simplificada de la sintaxis de atributo de Lenguaje de marcado de aplicaciones extensible
(XAML) para la propiedad Duration.
Una manera de especificar Duration en el código es usar el método FromSeconds para crear un elemento TimeSpan y después declarar
una nueva estructura Duration mediante TimeSpan.
Para obtener más información acerca de los valores de Duration y la sintaxis de Lenguaje de marcado de aplicaciones extensible (XAML)
completa, vea la página del tipo Duration.
AutoReverse
La propiedad AutoReverse especifica si una escala de tiempo se vuelve a reproducir hacia atrás al llegar al final de Duration. Si establece
esta propiedad de animación en true, la animación se invierte después de llegar al fin de Duration y se reproduce desde su valor final
hasta su valor inicial. De forma predeterminada, esta propiedad es false.
RepeatBehavior
La propiedad RepeatBehavior especifica cuántas veces se reproduce una escala de tiempo. De forma predeterminada, las escalas de
tiempo tienen una iteración de 1.0, lo que significa que se reproducen una vez y no se repiten en absoluto.
Para obtener más información acerca de estas propiedades y otras, vea Información general sobre comportamientos de control de
tiempo.
C# Copiar código
DoubleAnimation myDoubleAnimation = new DoubleAnimation();
myDoubleAnimation.From = 1.0;
myDoubleAnimation.To = 0.0;
myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
Dado que no se modificó el valor predeterminado de su FillBehavior, que es HoldEnd, la animación mantiene su valor final, 0, cuando
finaliza. Por tanto, la propiedad Opacity del rectángulo se mantiene en 0 después de que finaliza la animación. Si establece la propiedad
Opacity del rectángulo en otro valor, aparentemente su código no tiene ningún efecto, porque la animación todavía influye en la
propiedad Opacity.
Una manera de recobrar el control de una propiedad animada en el código es usar el método BeginAnimation y especificar null para el
parámetro AnimationTimeline. Para obtener más información y un ejemplo, vea Cómo: Establecer una propiedad después de animarla
con un guión gráfico.
Tenga en cuenta que, aunque parece que no tiene ningún efecto establecer un valor de una propiedad que tiene una animación Active o
Filling, el valor de la propiedad realmente cambia. Para obtener más información, vea Información general sobre sistemas de
temporización y animación.
Ejemplos de animaciones
Los ejemplos siguientes pueden ayudarle a familiarizarse con la forma de agregar animaciones a sus aplicaciones.
Ejemplo Property Animation
Muestra cómo aplicar animaciones a elementos de marco y a objetos inmovilizables.
Ejemplo From, To, and By Animation Target Values
Muestra distintas configuraciones From/To/By.
Ejemplo Animation Timing Behavior
Muestra las distintas maneras de controlar el comportamiento de temporización de una animación. Este ejemplo también muestra
cómo enlazar a datos el valor de destino de una animación.
Vea también
Conceptos
Información general sobre animaciones From/To/By
Información general sobre animaciones de fotogramas clave
Información general sobre objetos Storyboard
Información general sobre comportamientos de control de tiempo
Información general sobre sistemas de temporización y animación
Información general sobre eventos de control de tiempo
Información general sobre Windows Presentation Foundation
Referencia
Timeline
Storyboard
El objetivo de este tutorial es aprender a crear un botón animado para usarlo en una aplicación Windows Presentation Foundation (WPF).
Este tutorial utiliza estilos y una plantilla para crear un recurso de botón personalizado que permite la reutilización de código y la separación
de la lógica del botón de la declaración del botón. Este tutorial está escrito completamente en Lenguaje de marcado de aplicaciones
extensible (XAML).
Nota importante:
Este tutorial sirve como guía en los pasos necesarios para crear la aplicación escribiendo, o copiando y pegando Lenguaje de marcado
de aplicaciones extensible (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.
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 de marcado de aplicaciones extensible
(XAML) escribiendo o copiando y pegando el siguiente código resaltado en Window1.xaml:
Copiar código
<Window x:Class="AnimatedButton.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="AnimatedButton" Height="300" Width="300"
Background="Black">
</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.
</Application.Resources>
</Application>
El ámbito del recurso lo determina dónde se defina el recurso. Definir recursos en Application.Resoureses en el archivo app.xaml
permite utilizar el recurso en cualquier parte de la aplicación. Para obtener más información sobre cómo definir el ámbito de los
recursos, vea Información general sobre recursos.
2. Cree un estilo y defina los valores de las propiedades básicas con él: agregue el marcado siguiente al bloque
Application.Resources. Este marcado crea un objeto Style que se aplica a todos los botones de la aplicación, estableciendo la
propiedad Width de los botones en 90 y Margin en 10:
Copiar código
<Application.Resources>
<Style TargetType="Button">
<Setter Property="Width" Value="90" />
<Setter Property="Margin" Value="10" />
</Style>
</Application.Resources>
La propiedad TargetType especifica que el estilo se aplica a todos los objetos de tipo Button. Cada Setter establece un valor de la
propiedad diferente para el objeto Style. Por consiguiente, en este punto cada botón de la aplicación tiene un ancho de 90 y un
margen de 10. Si presiona F5 para ejecutar la aplicación, verá la ventana siguiente.
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,
vea Styling and Templating Overview.
3. 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.
Copiar código
<Application.Resources>
<LinearGradientBrush x:Key="GrayBlueGradientBrush"
StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="DarkGray" Offset="0" />
<GradientStop Color="#CCCCFF" Offset="0.5" />
<GradientStop Color="DarkGray" Offset="1" />
</LinearGradientBrush>
</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:
<LinearGradientBrush x:Key="GrayBlueGradientBrush"
StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="DarkGray" Offset="0" />
<GradientStop Color="#CCCCFF" Offset="0.5" />
<GradientStop Color="DarkGray" Offset="1" />
</LinearGradientBrush>
</Application.Resources>
2. Modifique la presentación del botón: en este punto, debe definir la plantilla. Agregue el siguiente marcado resaltado: Este
marcado especifica dos elementos Rectangle 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 en el interior de un control Grid.
Copiar código
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}" ClipToBounds="True">
<LinearGradientBrush x:Key="MyGlassBrushResource"
StartPoint="0,0" EndPoint="1,1" Opacity="0.75"
GradientStops="{StaticResource MyGlassGradientStopsResource}" />
<!-- Styles and other resources below here. -->
Estos recursos se utilizan como propiedad Fill para un rectángulo que insertamos en el control Grid de la plantilla de botón. Agregue
el siguiente marcado resaltado a la plantilla.
Copiar código
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"
ClipToBounds="True">
<ControlTemplate.Triggers>
<!-- Set action triggers for the buttons and define
what the button does in response to those triggers. -->
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
2. Agregue desencadenadores de propiedad: agregue el marcado resaltado al bloque ControlTemplate.Triggers:
Copiar código
<ControlTemplate.Triggers>
<!-- Set properties when mouse pointer is over the button. -->
<Trigger Property="IsMouseOver" Value="True">
<!-- Below are three property settings that occur when the
condition is met (user mouses over button). -->
<!-- Change the color of the outer rectangle when user
mouses over it. -->
<Setter Property ="Rectangle.Stroke" TargetName="outerRectangle"
Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
<ControlTemplate.Triggers/>
Presione F5 para ejecutar la aplicación y ver el efecto al pasar el puntero del mouse sobre los botones.
3. Agregue un desencadenador de foco: a continuación, agregaremos algunos establecedores similares para administrar el caso en
el que el botón tenga el foco (por ejemplo, después de que el usuario haga clic en él).
Copiar código
<ControlTemplate.Triggers>
<!-- Set properties when mouse pointer is over the button. -->
<Trigger Property="IsMouseOver" Value="True">
<!-- Below are three property settings that occur when the
condition is met (user mouses over button). -->
<!-- Change the color of the outer rectangle when user mouses over it. -->
<Setter Property ="Rectangle.Stroke" TargetName="outerRectangle"
Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
<!-- Sets the glass opacity to 1, therefore, the glass "appears" when user mouses over it. -->
<Setter Property="Rectangle.Opacity" Value="1" TargetName="glassCube" />
<!-- Makes the text slightly blurry as though you were looking at it through blurry glass. -->
<Setter Property="ContentPresenter.BitmapEffect" TargetName="myContentPresenter">
<Setter.Value>
<BlurBitmapEffect Radius="1" />
</Setter.Value>
</Setter>
</Trigger>
<!-- Set properties when button has focus. -->
<Trigger Property="IsFocused" Value="true">
<Setter Property="Rectangle.Opacity" Value="1" TargetName="glassCube" />
<Setter Property="Rectangle.Stroke" TargetName="outerRectangle"
Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
<Setter Property="Rectangle.Opacity" Value="1" TargetName="glassCube" />
</Trigger>
</ControlTemplate.Triggers>
Presione F5 para ejecutar la aplicación y haga clic en uno de los botones. Observa que el botón permanece resaltado después de
hacer clic en él, porque todavía tiene el foco. Si hace clic en otro botón, el nuevo botón obtendrá el foco mientras el último lo pierde.
4. Agregue animaciones para MouseEnter yMouseLeave: a continuación agregamos algunas animaciones a los desencadenadores.
Agregue el marcado siguiente en cualquier punto del bloque ControlTemplate.Triggers.
Copiar código
<!-- Animations that start when mouse enters and leaves button. -->
<EventTrigger RoutedEvent="Mouse.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard Name="mouseEnterBeginStoryboard">
<Storyboard>
<!-- This animation makes the glass rectangle shrink in the X direction. -->
<DoubleAnimation Storyboard.TargetName="glassCube"
Storyboard.TargetProperty=
"(Rectangle.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"
By="-0.1" Duration="0:0:0.5" />
<!-- This animation makes the glass rectangle shrink in the Y direction. -->
<DoubleAnimation
Storyboard.TargetName="glassCube"
Storyboard.TargetProperty=
"(Rectangle.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"
By="-0.1" Duration="0:0:0.5" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseLeave">
<EventTrigger.Actions>
<!-- Stopping the storyboard sets all animated properties back to default. -->
<StopStoryboard BeginStoryboardName="mouseEnterBeginStoryboard" />
</EventTrigger.Actions>
</EventTrigger>
El rectángulo de vidrio se reduce cuando el puntero del mouse pasa sobre el botón y vuelve al tamaño normal cuando el puntero
sale.
Hay dos animaciones que se desencadenan cuando el puntero pasa sobre el botón (cuando se provoca el evento MouseEnter). Estas
animaciones reducen el rectángulo de vidrio a lo largo de los ejes X e Y. Observe las propiedades de los elementos DoubleAnimation,
Duration y By. La propiedad Duration especifica que la animación se produce durante medio segundo, y By especifica que el vidrio
se reduce un 10%.
El segundo desencadenador de eventos (MouseLeave) detiene simplemente el primero. Al detener un objeto Storyboard, todas las
propiedades animadas vuelven a sus valores predeterminados. Por consiguiente, cuando el usuario saca el puntero del botón, el
botón vuelve a ser como era antes de que el puntero del mouse pasara sobre el botón. Para obtener más información acerca de las
animaciones, vea Información general sobre animaciones.
5. Agregue una animación para cuando se haga clic en el botón: el paso final es agregar un desencadenador para cuando el
usuario haga clic en el botón. Agregue el marcado siguiente en cualquier punto del bloque ControlTemplate.Triggers.
Copiar código
<!-- Animation fires when button is clicked, causing glass to spin. -->
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="glassCube"
Storyboard.TargetProperty=
"(Rectangle.RenderTransform).(TransformGroup.Children)[1].(RotateTransform.Angle)"
By="360" Duration="0:0:0.5" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
Presione F5 para ejecutar la aplicación y haga clic en uno de los botones. Al hacer clic en un botón, el rectángulo de vidrio gira sobre
sí mismo.
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.
Vea también
Conceptos
Tutorial: Crear un botón mediante Microsoft Expression Blend
Styling and Templating Overview
Información general sobre animaciones
Información general sobre el dibujo con colores sólidos y degradados
Información general sobre efectos de mapa de bits