WPF
WPF
Gráficos y multimedia
Información general sobre la representación de gráficos en WPF
Gráficos
Efectos de imagen
Información general sobre efectos de imagen
Pinceles
Información general sobre pinceles de WPF
Información general sobre la transformación de pinceles
Información general sobre las máscaras de opacidad
Información general sobre el dibujo con colores sólidos y degradados
Pintar con imágenes, dibujos y elementos visuales
Información general sobre objetos TileBrush
Temas "Cómo..."
Animar el color o la opacidad de un objeto SolidColorBrush
Animar la posición o color de un delimitador de degradado
Crear una reflexión
Crear patrones de mosaico diferentes con un objeto TileBrush
Definir un lápiz
Pintar un área con un dibujo
Pintar un área con una imagen
Pintar un área con un degradado lineal
Pintar un área con un degradado radial
Pintar un área con un color sólido
Pintar un área con un pincel del sistema
Pintar un área con un vídeo
Pintar un área con un objeto visual
Conservar la relación de aspecto de una imagen usada como fondo
Establecer la alineación horizontal y vertical de un TileBrush
Establecer el tamaño del mosaico de un TileBrush
Transformar un pincel
Usar colores del sistema en un degradado
Dibujos
Información general sobre objetos Drawing
Temas "Cómo..."
Aplicar un objeto GuidelineSet a un dibujo
Crear un dibujo compuesto
Crear un objeto GeometryDrawing
Dibujar una imagen mediante un objeto ImageDrawing
Reproducir elementos multimedia con un objeto VideoDrawing
Usar un dibujo como el origen de una imagen
Geometrías
Sintaxis de marcado de trazados
Información general sobre geometría
Temas "Cómo..."
Animar un objeto EllipseGeometry
Animar el tamaño de un objeto ArcSegment
Controlar el relleno de una forma compuesta
Crear una geometría combinada
Crear una forma compuesta
Crear una curva Bézier cúbica
Crear una línea mediante la clase LineGeometry
Crear un LineSegment en una clase PathGeometry
Crear una forma mediante una clase PathGeometry
Crear una forma mediante un objeto StreamGeometry
Crear una curva Bézier cuadrática
Crear un arco elíptico
Crear varios subtrazados en un objeto PathGeometry
Definir un rectángulo mediante una clase RectangleGeometry
Redondear las esquinas de un RectangleGeometry
Imágenes
Información general sobre imágenes
Temas "Cómo..."
Usar BitmapImage en XAML
Cargar una imagen como una miniatura
Aplicar una transformación a una imagen de mapa de bits
Crear un mapa de bits desde un objeto visual
Codificar un objeto visual en un archivo de imagen
Crear un objeto BitmapSource
Encadenar objetos BitmapSource
Convertir un elemento BitmapSource a un formato de píxeles diferente
Convertir un elemento BitmapSource a un formato de píxeles indexado
Codificar y descodificar una imagen JPEG
Codificar y descodificar una imagen BMP
Codificar y descodificar una imagen PNG
Codificar y descodificar una imagen WDP
Codificar y descodificar una imagen GIF
Codificar y descodificar una imagen TIFF
Escribir metadatos en un mapa de bits
Leer metadatos de un mapa de bits
Formas
Información general sobre formas y dibujo básico en WPF
Temas "Cómo..."
Dibujar una forma cerrada mediante el elemento Polygon
Dibujar una elipse o un círculo
Dibujar una línea
Dibujar una Polilínea mediante el uso del elemento Polyline
Dibujar un rectángulo
Modificar el extremo en el final de una línea o segmento
Transformaciones
Información general sobre transformaciones
Temas "Cómo..."
Aplicar una transformación a un elemento cuando se produce un evento
Aplicar varias transformaciones a un objeto
Hacer que un elemento gire en su posición
Girar un objeto
Ajustar la escala de un elemento
Sesgar un elemento
Especificar el origen de una transformación mediante valores relativos
Trasladar un elemento
Usar un objeto MatrixTransform para crear transformaciones personalizadas
Configuración del Registro en la representación de gráficos
Temas "Cómo..."
Animar un rectángulo
Animar la posición de un objeto mediante PointAnimation
Transformar puntos y vectores
Ampliar el marco de vidrio en una aplicación de WPF
Procedimiento para mejorar el rendimiento de la representación mediante el
almacenamiento en caché de un elemento
Procedimiento para usar un elemento almacenado en caché como pincel
Información general sobre gráficos 3D
Información general sobre transformaciones de modelos 3D
Maximizar el rendimiento de representación 3D en WPF
Temas "Cómo..."
Crear una escena 3D
Aplicar un dibujo a un modelo 3D
Aplicar material a la parte anterior y posterior de un objeto 3D
Aplicar material emisor a un objeto 3D
Transformar la escala de un modelo 3D
Aplicar varias transformaciones a un modelo 3D
Animar traslaciones 3D
Animar un giro 3D mediante Storyboards
Animar un giro 3D mediante Rotation3DAnimation
Animar un giro 3D mediante cuaterniones
Animar un giro 3D mediante fotogramas clave
(Rotation3DAnimationUsingKeyFrames)
Animar un giro 3D mediante fotogramas clave
(QuaternionAnimationUsingKeyFrames)
Animar la posición y la dirección de una cámara en una escena 3D
Animar la posición y la dirección de una cámara mediante fotogramas clave
Animar propiedades de material en una escena 3D
Hacer una prueba de posicionamiento en Viewport3D
Comprobar la igualdad y la desigualdad de estructuras Point4D
Información general sobre animaciones
Información general sobre sistemas de temporización y animación
Sugerencias y trucos para animaciones
Información general sobre animaciones personalizadas
Información general sobre animaciones From/To/By
Información general sobre animaciones de fotogramas clave
Funciones de aceleración
Información general sobre animaciones en trazados
Información general sobre técnicas de animación de propiedades
Información general sobre objetos Storyboard
Información general sobre comportamientos de control de tiempo
Información general sobre eventos de control de tiempo
Temas "Cómo..."
Aumentar o reducir la velocidad de una animación
Acumular valores de animaciones durante la repetición de ciclos
Agregar un valor de salida de animación a un valor inicial de animación
Animar una propiedad mediante un guión gráfico
Animar una propiedad sin usar un guión gráfico
Animar en un ControlTemplate
Animar en un estilo
Animar la opacidad de un elemento o pincel
Cambiar la velocidad de un reloj sin cambiar la velocidad de su escala de tiempo
Controlar un guión gráfico una vez iniciado mediante métodos interactivos
Controlar una animación mediante From, To y By
Definir un ámbito de nombres
Recibir una notificación cuando cambia el estado de un reloj
Repetir una animación
Buscar un guión gráfico
Buscar guiones gráficos de forma sincrónica
Definir una duración para una animación
Establecer una propiedad después de animarla con un guión gráfico
Simplificar las animaciones mediante escalas de tiempo secundarias
Especificar HandoffBehavior entre animaciones de guión gráfico
Especificar el comportamiento de relleno de una escala de tiempo que ha llegado
al final de su período de actividad
Especificar si una escala de tiempo se invierte automáticamente
Activar una animación al cambiar el valor de una propiedad
Usar desencadenadores de eventos para controlar un guión gráfico después de su
inicio
Temas "Cómo..." de relojes
Animar una propiedad mediante un objeto AnimationClock
Controlar interactivamente un reloj
Buscar un reloj de forma sincrónica
Temas de procedimientos de fotogramas clave
Animar un objeto mediante fotogramas clave
Animar un objeto Boolean mediante fotogramas clave
Animar un objeto Double mediante fotogramas clave
Animar un objeto Matrix mediante fotogramas clave
Animar un punto mediante fotogramas clave
Animar la geometría de un rectángulo mediante fotogramas clave
Animar un objeto String mediante fotogramas clave
Animar un color mediante fotogramas clave
Animar los cambios de tamaño mediante fotogramas clave
Animar el grosor de un borde mediante fotogramas clave
Controlar la temporización de animaciones de fotogramas clave
Temas "Cómo..." de animación de trazado
Animación de un objeto a lo largo de un trazado (animación doble)
Animación de un objeto a lo largo de un trazado (animación en punto)
Animación de un objeto a lo largo de un trazado (animación de matriz)
Animar un objeto a lo largo de un trazado (animación en matriz con acumulación
de desplazamiento)
Girar un objeto mediante un trazado geométrico (animación en matriz)
Girar un objeto mediante un trazado geométrico
Información general sobre multimedia
Temas "Cómo..."
Controlar un control MediaElement (Reproducir, Pausar, Detener, Volumen y
Velocidad)
Controlar un control MediaElement mediante un guión gráfico
Desencadenar la reproducción de medios con un evento de usuario
Repetir la reproducción de elementos multimedia
Reproducir elementos multimedia con animaciones
Usar transformaciones en un control MediaElement
Programación de capas visuales
Realizar pruebas de posicionamiento en la capa visual
Usar objetos DrawingVisual
Tutorial: Hospedar objetos visuales en una aplicación Win32
Temas "Cómo..."
Obtener el desplazamiento de un objeto visual
Enumerar el contenido de un dibujo de un objeto visual
Geometría de una prueba de posicionamiento en un objeto visual
Realizar una prueba de posicionamiento mediante el uso de Geometry como
parámetro
Realizar pruebas de posicionamiento mediante un contenedor host Win32
Representar un intervalo para cada fotograma mediante CompositionTarget
Gráficos y multimedia
08/01/2020 • 10 minutes to read • Edit Online
Windows Presentation Foundation (WPF ) proporciona compatibilidad con multimedia, gráficos vectoriales,
animación y composición de contenido, lo que facilita a los desarrolladores la creación de interfaces de usuario
y contenido interesantes. Con Visual Studio, puede crear gráficos vectoriales o animaciones complejas e
integrar los elementos multimedia en las aplicaciones.
En este tema se presentan las características de gráficos, animaciones y elementos multimedia de WPF, que le
permiten agregar gráficos, efectos de transición, sonido y vídeo a las aplicaciones.
NOTE
Se recomienda encarecidamente no usar los tipos WPF en un servicio de Windows. Si intenta usar tipos WPF en un
servicio de Windows, puede que el servicio no funcione como se espera.
Gráficos y representación
WPF incluye compatibilidad con gráficos 2D de alta calidad. La funcionalidad incluye pinceles, geometrías,
imágenes, formas y transformaciones. Para más información, consulte Graphics (Gráficos). La representación
de elementos gráficos se basa en la clase Visual. La estructura de objetos visuales en la pantalla se describe en
el árbol visual. Para más información, consulte Información general sobre la representación de gráficos en
WPF.
Formas 2D
WPF proporciona una biblioteca de formas bidimensionales de uso frecuente, como rectángulos y elipses, que
se muestra en la siguiente ilustración.
Estas formas intrínsecas de WPF no son solo formas: son elementos programables que implementan muchas
de las características que se esperan de los controles más comunes, entre los que se incluyen la entrada del
mouse y del teclado. En el ejemplo siguiente se muestra cómo controlar el evento de MouseUp que se produce
al hacer clic en un elemento Ellipse.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Window1" >
<Ellipse Fill="LightBlue" MouseUp="ellipseButton_MouseUp" />
</Window>
En la ilustración siguiente se muestra el resultado del anterior marcado y código XAML subyacente.
Para obtener más información, consulte Información general sobre formas y dibujo básico en WPF. Para
obtener un ejemplo introductorio, vea Shape Elements Sample (Ejemplo de elementos de forma).
Geometrías 2D
Cuando las formas 2D que proporciona WPF no son suficientes, puede usar la compatibilidad de WPF con las
geometrías y las rutas de acceso para crear las suyas propias. En la ilustración siguiente se muestra cómo
puede utilizar las geometrías para crear formas, como un pincel de dibujo, y para recortar otros elementos de
WPF.
Para más información, consulte Información general sobre geometría. Para obtener un ejemplo introductorio,
vea Ejemplo de geometrías.
Efectos 2D
WPF proporciona una biblioteca de clases 2D que puede usar para crear una variedad de efectos. La capacidad
de representación en 2D de WPF proporciona la capacidad de pintar IU elementos que tienen degradados,
mapas de bits, dibujos y vídeos; y para manipularlos mediante la rotación, el escalado y el sesgo. En la
ilustración siguiente se proporciona un ejemplo de los muchos efectos que puede lograr mediante el uso de
pinceles de WPF.
Para obtener más información, consulte Información general sobre pinceles de WPF. Para obtener un ejemplo
introductorio, vea Ejemplo de pinceles.
Representación 3D
WPF proporciona un conjunto de capacidades de representación 3D que se integran con la compatibilidad con
gráficos 2D en WPF para que pueda crear un diseño, un IUy una visualización de datos más interesantes. En un
extremo del espectro, WPF permite representar imágenes 2D en las superficies de las formas 3D, que se
muestran en la siguiente ilustración.
Para obtener más información, consulte Información general sobre gráficos 3D. Para obtener un ejemplo
introductorio, vea 3-D Solids Sample (Ejemplo de sólidos 3D ).
Animación
Use la animación para hacer que los controles y elementos crezcan, vibren, giren o se desvanezcan, crear
atractivas transiciones de página y mucho más. Dado que WPF permite animar la mayoría de las propiedades,
no solo puede animar la mayoría de los objetos de WPF, sino que también puede usar WPF para animar
objetos personalizados que cree.
Para obtener más información, consulte Información general sobre animaciones. Para obtener un ejemplo
introductorio, vea Animation Example Gallery (Galería de ejemplos de animación).
Medios
Las imágenes, el vídeo y el audio son maneras de ofrecer experiencias de usuario e información con mucho
contenido multimedia.
Imágenes
Las imágenes, que incluyen iconos, fondos e incluso partes de animaciones, constituyen una pieza esencial de la
mayoría de las aplicaciones. Como a menudo necesita usar imágenes, WPF expone la capacidad de trabajar con
ellas de varias maneras. En la ilustración siguiente se muestra tan solo una de esas maneras.
MediaElement es capaz de reproducir vídeo y audio, y es lo suficientemente extensible como para permitir la
creación sencilla de interfaces de IU personalizadas.
Para más información, consulte Información general sobre multimedia.
Vea también
System.Windows.Media
System.Windows.Media.Animation
System.Windows.Media.Media3D
Imágenes y gráficos 2D
Información general sobre formas y dibujo básico en WPF
Información general sobre el dibujo con colores sólidos y degradados
Pintar con imágenes, dibujos y elementos visuales
Temas de procedimientos de animación y control de tiempo
Información general sobre gráficos 3D
Información general sobre multimedia
Información general sobre la representación de
gráficos en WPF
03/02/2020 • 36 minutes to read • Edit Online
En este tema se ofrece información de la capa de objeto visual de WPF. Se centra en el rol de la clase Visual
para la compatibilidad de representación en el modelo de WPF.
Clase DrawingVisual
El DrawingVisual es una clase de dibujo ligera que se utiliza para representar formas, imágenes o texto. Esta
clase se considera ligera porque no proporciona control de diseño ni control de eventos, lo que mejora su
rendimiento en tiempo de ejecución. Por esta razón, los dibujos son ideales para fondos e imágenes
prediseñadas. El DrawingVisual se puede usar para crear un objeto visual personalizado. Para obtener más
información, consulte Usar objetos DrawingVisual.
Clase Viewport3DVisual
El Viewport3DVisual proporciona un puente entre los objetos 2D Visual y Visual3D. La clase Visual3D es la
clase base para todos los elementos visuales 3D. El Viewport3DVisual requiere que defina un valor Camera y
un valor Viewport. La cámara permite ver la escena. La ventanilla establece el lugar en que se asigna la
proyección a la superficie 2D. Para más información acerca de 3D en WPF, consulte Información general sobre
gráficos 3D.
Clase ContainerVisual
La clase ContainerVisual se utiliza como contenedor para una colección de objetos Visual. La clase
DrawingVisual se deriva de la clase ContainerVisual, lo que permite que contenga una colección de objetos
visuales.
Dibujo de contenido en objetos visuales
Un objeto Visual almacena sus datos de representación como una lista de instrucciones de gráficos
vectoriales. Cada elemento de la lista de instrucciones representa un conjunto de bajo nivel de datos gráficos y
recursos asociados en un formato serializado. Hay cuatro tipos diferentes de datos de representación que
pueden incluir contenido de dibujo.
El DrawingContext le permite rellenar un Visual con contenido visual. Cuando se usa el comando Draw de un
objeto DrawingContext, en realidad se almacena un conjunto de datos de representación que se usará más
adelante en el sistema de gráficos. no está dibujando en la pantalla en tiempo real.
Cuando se crea un control de WPF, como un Button, el control genera implícitamente los datos de
representación para dibujarse. Por ejemplo, al establecer la propiedad Content de la Button, el control almacena
una representación de representación de un glifo.
Un Visual describe su contenido como uno o varios objetos Drawing incluidos dentro de un DrawingGroup.
Una DrawingGroup también describe las máscaras de opacidad, las transformaciones, los efectos de imagen y
otras operaciones que se aplican a su contenido. DrawingGroup operaciones se aplican en el siguiente orden
cuando se representa el contenido: OpacityMask, Opacity, BitmapEffect, ClipGeometry, GuidelineSety, a
continuación, Transform.
En la ilustración siguiente se muestra el orden en que se aplican las operaciones de DrawingGroup durante la
secuencia de representación.
Orden de operaciones de DrawingGroup
Para más información, consulte Información general sobre objetos Drawing.
Contenido de dibujo en la capa de Visual
Nunca se crean instancias de un DrawingContextdirectamente; sin embargo, puede adquirir un contexto de
dibujo de determinados métodos, como DrawingGroup.Open y DrawingVisual.RenderOpen. En el ejemplo
siguiente se recupera una DrawingContext de un DrawingVisual y se usa para dibujar un rectángulo.
return drawingVisual;
}
' Create a DrawingVisual that contains a rectangle.
Private Function CreateDrawingVisualRectangle() As DrawingVisual
Dim drawingVisual As New DrawingVisual()
Return drawingVisual
End Function
NOTE
Cuando se enumera el contenido del objeto visual, se recuperan Drawing objetos y no la representación subyacente de
los datos de representación como una lista de instrucciones de gráficos vectoriales.
En el ejemplo siguiente se usa el método GetDrawing para recuperar el valor DrawingGroup de un Visual y
enumerarlo.
public void RetrieveDrawing(Visual v)
{
DrawingGroup drawingGroup = VisualTreeHelper.GetDrawing(v);
EnumDrawingGroup(drawingGroup);
}
<Button Click="OnClick">OK</Button>
Si tuviera que enumerar los objetos visuales que componen el control Button predeterminado, encontraría la
jerarquía de objetos visuales que se ilustra a continuación:
El control Button contiene un elemento ClassicBorderDecorator que, a su vez, contiene un elemento
ContentPresenter. El elemento ClassicBorderDecorator es responsable de dibujar un borde y un fondo para la
Button. El elemento ContentPresenter es responsable de mostrar el contenido de la Button. En este caso, puesto
que se muestra texto, el elemento ContentPresenter contiene un elemento TextBlock. El hecho de que el control
Button use un ContentPresenter significa que el contenido podría estar representado por otros elementos,
como un Image o una geometría, como un EllipseGeometry.
Plantillas de control
La clave para la expansión de un control en una jerarquía de controles es la ControlTemplate. Una plantilla de
control especifica la jerarquía visual predeterminada de un control. Al hacer referencia explícitamente a un
control, implícitamente también se hace referencia a su jerarquía visual. Puede reemplazar los valores
predeterminados de una plantilla de control para crear una apariencia visual personalizada para un control. Por
ejemplo, puede modificar el valor de color de fondo del control Button para que use un valor de color de
degradado lineal en lugar de un valor de color sólido. Para más información, consulte Button ControlTemplate
Example (Ejemplo de ControlTemplate de Button).
Un elemento de la interfaz de usuario, como un control Button, contiene varias listas de instrucciones de
gráficos vectoriales que describen toda la definición de representación de un control. En el código siguiente se
muestra un control de Button definido en el marcado.
<Button Click="OnClick">
<Image Source="images\greenlight.jpg"></Image>
</Button>
Si tuviera que enumerar los objetos visuales y las listas de instrucciones de gráficos vectoriales que componen
el control Button, encontraría la jerarquía de objetos que se ilustra a continuación:
Árbol visual
El árbol visual contiene todos los elementos visuales que se usan en la interfaz de usuario de una aplicación.
Puesto que un elemento visual contiene información guardada del dibujo, el árbol visual se puede considerar
un gráfico de la escena, que contiene toda la información de representación necesaria para componer la salida
de la pantalla. Este árbol es la acumulación de todos los elementos visuales creados directamente por la
aplicación, ya sea a través de código o de marcación. El árbol visual también contiene todos los elementos
visuales que ha creado la expansión de la plantilla de elementos, como controles y objetos de datos.
En el código siguiente se muestra un elemento StackPanel definido en el marcado.
<StackPanel>
<Label>User name:</Label>
<TextBox />
<Button Click="OnClick">OK</Button>
</StackPanel>
Si tuviera que enumerar los objetos visuales que componen el elemento StackPanel en el ejemplo de
marcación, encontraría la jerarquía de objetos visuales que se ilustra a continuación:
Orden de representación
El árbol visual determina el orden de representación de objetos visuales y de dibujo de WPF. El orden del
recorrido comienza con el objeto visual raíz, que es el nodo de nivel superior del árbol visual. A continuación, se
atraviesan los elementos secundarios del objeto visual raíz, de izquierda a derecha. Si un objeto visual tiene
elementos secundarios, estos se atraviesan antes que los elementos del mismo nivel del objeto visual. Esto
significa que el contenido de un objeto visual secundario se representa delante del contenido propio del objeto
visual.
<DockPanel>
<ListBox>
<ListBoxItem>Dog</ListBoxItem>
<ListBoxItem>Cat</ListBoxItem>
<ListBoxItem>Fish</ListBoxItem>
</ListBox>
<Button Click="OnClick">OK</Button>
</DockPanel>
Si tuviera que enumerar los objetos lógicos que componen el elemento DockPanel en el ejemplo de marcación,
encontraría la jerarquía de objetos lógicos que se ilustra a continuación:
Diagrama de árbol lógico
El árbol visual y el árbol lógico se sincronizan con el conjunto actual de elementos de la aplicación, que refleja
cualquier adición, eliminación o modificación de elementos. Sin embargo, los árboles presentan distintas vistas
de la aplicación. A diferencia del árbol visual, el árbol lógico no expande el elemento ContentPresenter de un
control. Esto significa que no hay una correspondencia uno a uno directa entre un árbol lógico y un árbol visual
del mismo conjunto de objetos. De hecho, al invocar el método GetChildren del objeto LogicalTreeHelper y el
método GetChild del objeto VisualTreeHelper con el mismo elemento que un parámetro, se generan
resultados diferentes.
Para más información acerca del árbol lógico, consulte Árboles en WPF.
Visualización del árbol visual con XamlPad
La herramienta de WPF, XamlPad, proporciona una opción para ver y explorar el árbol visual que corresponde
al contenido XAML definido actualmente. Haga clic en el botón Show Visual Tree (Mostrar árbol visual) de la
barra de menús para mostrar el árbol visual. A continuación se muestra la expansión de contenido XAML en
nodos de árbol visual en el panel del Explorador de árbol visual de XamlPad:
Observe cómo los controles Label, TextBoxy Button muestran una jerarquía de objetos visuales independiente
en el panel del Explorador de árbol visual de XamlPad. Esto se debe a que los controles WPF tienen un
ControlTemplate que contiene el árbol visual de ese control. Al hacer referencia explícitamente a un control,
implícitamente también se hace referencia a su jerarquía visual.
Generación de perfiles de rendimiento visual
WPF ofrece un conjunto de herramientas de generación de perfiles de rendimiento que le permiten analizar el
comportamiento en tiempo de ejecución de la aplicación y determinar los tipos de optimizaciones de
rendimiento que puede aplicar. La herramienta Generador de perfiles visuales proporciona una vista gráfica
completa de los datos de rendimiento mediante la asignación al árbol visual de la aplicación. En esta captura de
pantalla, la sección Uso de CPU del generador de perfiles visuales proporciona un desglose preciso del uso
que un objeto realiza de los servicios de WPF, como la representación y el diseño.
En cambio, WPF utiliza un sistema de modo retenido. Esto significa que los objetos de la aplicación que tienen
una apariencia visual definen un conjunto de datos de dibujo serializados. Una vez que se definen los datos de
dibujo, el sistema es responsable de responder a todas las solicitudes de repetición del dibujo para representar
los objetos de la aplicación. Incluso en tiempo de ejecución, puede modificar o crear objetos de la aplicación y
seguir confiando en que el sistema responderá a las solicitudes de dibujo. La eficacia de un sistema de gráficos
en modo retenido es que la aplicación guarda siempre la información de dibujo en un estado serializado, pero
la responsabilidad de la representación se deja al sistema. El siguiente diagrama muestra la forma en que la
aplicación usa WPF para responder a las solicitudes de dibujo.
Volver a dibujar de forma inteligente
Una de las mayores ventajas de utilizar gráficos en modo retenido es que WPF puede optimizar eficazmente lo
que hay que volver a dibujar en la aplicación. Aunque tenga una escena compleja con diferentes niveles de
opacidad, por lo general no es preciso escribir código especial para optimizar el redibujado. Compárelo esto
con la programación de Win32, en la que se puede dedicar mucho esfuerzo a optimizar la aplicación mediante
la minimización de la cantidad de redibujado que se realiza en la región de actualización. Consulte Redrawing in
the Update Region (Redibujado en la región de actualización) para obtener un ejemplo del tipo de complejidad
implicado en la optimización del redibujado en las aplicaciones de Win32.
Gráficos vectoriales
WPF usa gráficos vectoriales como formato de los datos de representación. Los gráficos vectoriales, que
incluyen Scalable Vector Graphics (SVG ), metarchivos de Windows (.wmf) y fuentes TrueType, almacenan datos
de representación y los transmiten como una lista de instrucciones que describen cómo volver a crear una
imagen mediante primitivas de gráficos. Por ejemplo, las fuentes TrueType son fuentes de esquema que
describen un conjunto de líneas, curvas y comandos, en lugar de una matriz de píxeles. Una de las ventajas
principales de los gráficos vectoriales es su capacidad para escalar a cualquier tamaño y resolución.
A diferencia de los gráficos vectoriales, los gráficos de mapa de bits almacenan los datos de representación
como una representación píxel a píxel de una imagen, previamente representada para una resolución específica.
Una de las principales diferencias entre los formatos de gráficos vectoriales y de mapa de bits es la fidelidad
con la imagen original. Por ejemplo, cuando se modifica el tamaño de una imagen de origen, los sistemas de
gráficos de mapa de bits ajustan la imagen, mientras que los sistemas de gráficos vectoriales la escalan, lo que
mantiene su fidelidad.
La ilustración siguiente muestra una imagen de origen cuyo tamaño se ha cambiado en un 300 %. Observe las
distorsiones que aparecen cuando la imagen de origen es un gráfico de mapa de bits y se ajusta, en lugar de
escalarse como imagen de gráfico vectorial.
El marcado siguiente muestra dos elementos Path definidos. El segundo elemento usa un ScaleTransform para
cambiar el tamaño de las instrucciones de dibujo del primer elemento en un 300%. Observe que las
instrucciones de dibujo de los elementos de la Path permanecen sin cambios.
<Path
Data="M10,100 C 60,0 100,200 150,100 z"
Fill="{StaticResource linearGradientBackground}"
Stroke="Black"
StrokeThickness="2" />
<Path
Data="M10,100 C 60,0 100,200 150,100 z"
Fill="{StaticResource linearGradientBackground}"
Stroke="Black"
StrokeThickness="2" >
<Path.RenderTransform>
<ScaleTransform ScaleX="3.0" ScaleY="3.0" />
</Path.RenderTransform>
</Path>
Clase VisualTreeHelper
La clase VisualTreeHelper es una clase auxiliar estática que proporciona funcionalidad de bajo nivel para
programar en el nivel de objeto visual, lo que resulta útil en escenarios muy concretos, como el desarrollo de
controles personalizados de alto rendimiento. En la mayoría de los casos, los objetos de marco de WPF de nivel
superior, como Canvas y TextBlock, ofrecen mayor flexibilidad y facilidad de uso.
Pruebas de posicionamiento
La clase VisualTreeHelper proporciona métodos para realizar pruebas de posicionamiento en objetos visuales
cuando la compatibilidad con la prueba de posicionamiento predeterminada no satisface sus necesidades.
Puede usar los métodos HitTest de la clase VisualTreeHelper para determinar si un valor de coordenadas de
geometría o punto está dentro del límite de un objeto determinado, como un control o un elemento gráfico. Por
ejemplo, las pruebas de posicionamiento se pueden utilizar para determinar si un clic del mouse dentro del
rectángulo delimitador de un objeto pertenece a la geometría de un círculo. También puede elegir invalidar la
implementación predeterminada de las pruebas de posicionamiento para realizar sus propios cálculos de las
pruebas de posicionamiento.
Para más información acerca de las pruebas de posicionamiento, consulte Hit Testing in the Visual Layer
(Pruebas de posicionamiento en la capa visual).
Enumeración del árbol visual
La clase VisualTreeHelper proporciona funcionalidad para enumerar los miembros de un árbol visual. Para
recuperar un elemento primario, llame al método GetParent. Para recuperar un elemento secundario o un
descendiente directo de un objeto visual, llame al método GetChild. Este método devuelve un Visual secundario
del elemento primario en el índice especificado.
En el ejemplo siguiente se muestra cómo enumerar todos los descendientes de un objeto visual, que es una
técnica que se puede utilizar si se desea serializar toda la información de representación de una jerarquía de
objetos visuales.
En la mayoría de los casos, el árbol lógico es una representación más útil de los elementos de una aplicación de
WPF. Aunque no se modifique directamente el árbol lógico, esta vista de la aplicación es útil para entender la
herencia de propiedades y el enrutamiento de eventos. A diferencia del árbol visual, el árbol lógico puede
representar objetos de datos no visuales, como ListItem. Para más información acerca del árbol lógico, consulte
Árboles en WPF.
La clase VisualTreeHelper proporciona métodos para devolver el rectángulo delimitador de objetos visuales.
Puede devolver el rectángulo delimitador de un objeto visual llamando a GetContentBounds. Puede devolver el
rectángulo delimitador de todos los descendientes de un objeto visual, incluido el propio objeto visual,
llamando a GetDescendantBounds. El código siguiente muestra cómo se calcularía el rectángulo delimitador de
un objeto visual y todos sus descendientes.
// Return the bounding rectangle of the parent visual object and all of its descendants.
Rect rectBounds = VisualTreeHelper.GetDescendantBounds(parentVisual);
' Return the bounding rectangle of the parent visual object and all of its descendants.
Dim rectBounds As Rect = VisualTreeHelper.GetDescendantBounds(parentVisual)
Consulte también
Visual
VisualTreeHelper
DrawingVisual
Imágenes y gráficos 2D
Realizar pruebas de posicionamiento en la capa visual
Usar objetos DrawingVisual
Tutorial: Hospedar objetos visuales en una aplicación Win32
Optimizar el rendimiento de la aplicación WPF
Gráficos
23/10/2019 • 2 minutes to read • Edit Online
Windows Presentation Foundation (WPF ) ofrece compatibilidad integrada para multimedia, gráficos vectoriales,
animaciones y creación de contenido, lo que facilita a los desarrolladores crear interfaces de usuario y el contenido
interesante.
En esta sección
Efectos de imagen
Pinceles
Dibujos
Geometrías
Imágenes
Formas
Transformaciones
Configuración del Registro en la representación de gráficos
Temas "Cómo..."
Vea también
Shape
Transform
BitmapImage
Geometry
Drawing
Brush
BitmapEffect
Imágenes y gráficos 2D
Gráficos y multimedia
Información general sobre la representación de gráficos en WPF
Efectos de imagen
23/10/2019 • 2 minutes to read • Edit Online
En los temas de esta sección se describe cómo aplicar efectos visuales a las imágenes Windows Presentation
Foundation (WPF )de mapa de bits mediante.
IMPORTANT
En el .NET Framework 4 o posterior, la BitmapEffect clase está obsoleta. Si intenta utilizar la BitmapEffect clase, obtendrá una
excepción obsoleta. La alternativa no obsoleta a la BitmapEffect clase es la Effect clase. En la mayoría de los Effect casos, la
clase es significativamente más rápida.
En esta sección
Información general sobre efectos de imagen
Referencia
BitmapEffect
System.Windows.Media.Effects
Secciones relacionadas
Gráficos y multimedia
Información general sobre imágenes
Información general sobre efectos de imagen
08/01/2020 • 6 minutes to read • Edit Online
Los efectos de imagen permiten a los diseñadores y desarrolladores aplicar efectos visuales a contenido
representado Windows Presentation Foundation (WPF ). Por ejemplo, los efectos de imagen permiten aplicar
fácilmente un efecto de DropShadowBitmapEffect o un efecto de desenfoque a una imagen o un botón.
IMPORTANT
En el .NET Framework 4 o posterior, la clase BitmapEffect está obsoleta. Si intenta utilizar la clase BitmapEffect, obtendrá una
excepción obsoleta. La alternativa no obsoleta a la clase BitmapEffect es la clase Effect. En la mayoría de los casos, la clase
Effect es significativamente más rápida.
NOTE
Los efectos de imagen de WPF se representan en modo de software. Cualquier objeto que aplique un efecto también se
representará en software. El rendimiento disminuye al máximo al usar los efectos de imagen en objetos visuales grandes o al
animar las propiedades de un efecto de imagen. Esto no quiere decir que no se deben usar efectos de imagen de esta
manera en absoluto, pero hay que tener cuidado y probarlos exhaustivamente para asegurarse de que los usuarios obtengan
la experiencia esperada.
NOTE
Los efectos de imagen de WPF no admiten la ejecución de confianza parcial. Una aplicación debe tener permisos de plena
confianza para usar efectos de imagen.
<!-- The larger the Radius, the more blurring. The default range is 20.
In addition, the KernelType is set to a box kernel. A box kernel
creates less disruption (less blur) then the default Gaussian kernel. -->
<BlurBitmapEffect Radius="10" KernelType="Box" />
</Button.BitmapEffect>
</Button>
NOTE
Cuando se aplica un BitmapEffect a un contenedor de diseño, como DockPanel o Canvas, el efecto se aplica al árbol visual del
elemento u objetos visuales, incluidos todos sus elementos secundarios.
Vea también
BitmapEffectGroup
BitmapEffectInput
BitmapEffectCollection
Efecto de imagen de WPF no administrado
Información general sobre imágenes
Seguridad
Información general sobre la representación de gráficos en WPF
Imágenes y gráficos 2D
Pinceles
23/10/2019 • 2 minutes to read • Edit Online
Los temas siguientes describen cómo usar Windows Presentation Foundation (WPF ) pinceles que "pintar"
contenido en la pantalla
En esta sección
Información general sobre pinceles de WPF
Información general sobre la transformación de pinceles
Información general sobre las máscaras de opacidad
Información general sobre el dibujo con colores sólidos y degradados
Pintar con imágenes, dibujos y elementos visuales
Información general sobre objetos TileBrush
Temas "Cómo..."
Referencia
Brush
SolidColorBrush
LinearGradientBrush
RadialGradientBrush
DrawingBrush
VisualBrush
Secciones relacionadas
Gráficos y multimedia
Información general sobre la representación de gráficos en WPF
Información general sobre pinceles de WPF
03/02/2020 • 14 minutes to read • Edit Online
Todo lo que está visible en la pantalla es visible porque lo ha pintado un pincel. Por ejemplo, se usa un pincel para
describir el fondo de un botón, el primer plano del texto y el relleno de una forma. En este tema se presentan los
conceptos del dibujo con pinceles de Windows Presentation Foundation (WPF ) y se proporcionan ejemplos. Los
pinceles permiten pintar objetos interfaz de usuario (UI) con cualquier cosa, desde colores simples y sólidos hasta
conjuntos complejos de patrones e imágenes.
Ejemplos de pincel
La mayoría de los objetos visuales le permiten especificar cómo se dibujan. En la tabla siguiente se enumeran
algunos objetos y propiedades comunes con los que puede usar un Brush.
Panel Background
Pen Brush
TextBlock Background
En las secciones siguientes se describen los distintos tipos de Brush y se proporciona un ejemplo de cada uno.
Pintar con un color sólido
Un SolidColorBrush pinta un área con un Colorsólido. Hay varias maneras de especificar el Color de un
SolidColorBrush: por ejemplo, puede especificar sus canales alfa, rojo, azul y verde, o bien usar uno de los colores
predefinidos proporcionados por la clase Colors.
En el ejemplo siguiente se utiliza un SolidColorBrush para pintar el Fill de una Rectangle. En la ilustración
siguiente se muestra el rectángulo pintado.
Para obtener más información sobre la clase SolidColorBrush, consulte la información general sobre el dibujo
con colores sólidos y degradados.
exampleRectangle.Fill = myBrush;
exampleRectangle.Fill = myBrush
Para obtener más información sobre la clase LinearGradientBrush, consulte la información general sobre el
dibujo con colores sólidos y degradados.
exampleRectangle.Fill = myBrush;
exampleRectangle.Fill = myBrush
Para obtener más información sobre la clase RadialGradientBrush, consulte la información general sobre el
dibujo con colores sólidos y degradados.
exampleRectangle.Fill = myBrush;
exampleRectangle.Fill = myBrush
Para obtener más información sobre la clase ImageBrush, vea pintar con imágenes, dibujos y objetos visuales.
GeometryDrawing backgroundSquare =
new GeometryDrawing(
Brushes.White,
null,
new RectangleGeometry(new Rect(0, 0, 100, 100)));
myBrush.Drawing = checkersDrawingGroup;
myBrush.Viewport = new Rect(0, 0, 0.25, 0.25);
myBrush.TileMode = TileMode.Tile;
exampleRectangle.Fill = myBrush;
myBrush.Drawing = checkersDrawingGroup
myBrush.Viewport = New Rect(0, 0, 0.25, 0.25)
myBrush.TileMode = TileMode.Tile
exampleRectangle.Fill = myBrush
<Rectangle Width="75" Height="75">
<Rectangle.Fill>
<DrawingBrush Viewport="0,0,0.25,0.25" TileMode="Tile">
<DrawingBrush.Drawing>
<DrawingGroup>
<GeometryDrawing Brush="White">
<GeometryDrawing.Geometry>
<RectangleGeometry Rect="0,0,100,100" />
</GeometryDrawing.Geometry>
</GeometryDrawing>
<GeometryDrawing>
<GeometryDrawing.Geometry>
<GeometryGroup>
<RectangleGeometry Rect="0,0,50,50" />
<RectangleGeometry Rect="50,50,50,50" />
</GeometryGroup>
</GeometryDrawing.Geometry>
<GeometryDrawing.Brush>
<LinearGradientBrush>
<GradientStop Offset="0.0" Color="Black" />
<GradientStop Offset="1.0" Color="Gray" />
</LinearGradientBrush>
</GeometryDrawing.Brush>
</GeometryDrawing>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</Rectangle.Fill>
</Rectangle>
Para obtener más información sobre la clase DrawingBrush, vea pintar con imágenes, dibujos y objetos visuales.
//
// Create the brush's contents.
//
StackPanel aPanel = new StackPanel();
aPanel.Children.Add(someText);
myBrush.Visual = aPanel;
exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle()
exampleRectangle.Width = 75
exampleRectangle.Height = 75
'
' Create the brush's contents.
'
Dim aPanel As New StackPanel()
aPanel.Children.Add(someText)
myBrush.Visual = aPanel
exampleRectangle.Fill = myBrush
<Rectangle Width="75" Height="75">
<Rectangle.Fill>
<VisualBrush TileMode="Tile">
<VisualBrush.Visual>
<StackPanel>
<StackPanel.Background>
<DrawingBrush>
<DrawingBrush.Drawing>
<GeometryDrawing>
<GeometryDrawing.Brush>
<RadialGradientBrush>
<GradientStop Color="MediumBlue" Offset="0.0" />
<GradientStop Color="White" Offset="1.0" />
</RadialGradientBrush>
</GeometryDrawing.Brush>
<GeometryDrawing.Geometry>
<GeometryGroup>
<RectangleGeometry Rect="0,0,50,50" />
<RectangleGeometry Rect="50,50,50,50" />
</GeometryGroup>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingBrush.Drawing>
</DrawingBrush>
</StackPanel.Background>
<TextBlock FontSize="10pt" Margin="10">Hello, World!</TextBlock>
</StackPanel>
</VisualBrush.Visual>
</VisualBrush>
</Rectangle.Fill>
</Rectangle>
Para obtener más información sobre la clase VisualBrush, vea pintar con imágenes, dibujos y objetos visuales.
Si el pincel contiene colores que son parcialmente transparentes, el valor de opacidad del color se combina a
través de la multiplicación con el valor de opacidad del pincel. Por ejemplo, si un pincel tiene un valor de opacidad
de 0,5 y un color usado en el pincel también tiene un valor de opacidad de 0,5, el color de salida tiene un valor de
opacidad de 0,25.
NOTE
Es más eficaz cambiar el valor de opacidad de un pincel que cambiar la opacidad de un elemento completo mediante su
UIElement.Opacity propiedad.
Puede girar, escalar, sesgar y trasladar el contenido de un pincel mediante sus propiedades Transform o
RelativeTransform. Para obtener más información, vea información general sobre la transformación Brush.
Dado que se Animatable objetos, se pueden animar Brush objetos. Para obtener más información, consulte
Información general sobre animaciones.
Características de los objetos Freezable
Dado que hereda de la clase Freezable, la clase Brush proporciona varias características especiales: los objetos
Brush se pueden declarar como recursos, compartirse entre varios objetos y clonados. Además, todos los tipos de
Brush excepto VisualBrush se pueden convertir en de solo lectura para mejorar el rendimiento y hacerlos seguros
para subprocesos.
Para obtener más información sobre las distintas características proporcionadas por Freezable objetos, vea
información general sobre objetos Freezable.
Para obtener más información sobre por qué no se pueden inmovilizar VisualBrush objetos, vea la página tipo de
VisualBrush.
Consulte también
Brush
Brushes
Información general sobre el dibujo con colores sólidos y degradados
Pintar con imágenes, dibujos y elementos visuales
Información general sobre objetos Freezable
Ejemplo de pinceles
Ejemplo de ImageBrush
Ejemplo de VisualBrush
Temas "Cómo..."
Otras recomendaciones de rendimiento
Información general sobre la transformación de
pinceles
20/02/2020 • 8 minutes to read • Edit Online
La clase Brush proporciona dos propiedades de transformación: Transform y RelativeTransform. Las propiedades
permiten girar, escalar, sesgar y trasladar el contenido de un pincel. En este tema se describen las diferencias entre
estas dos propiedades y proporciona ejemplos de su uso.
Prerequisites
Para entender este tema, debe entender las características del pincel que se va a transformar. Para obtener
LinearGradientBrush y RadialGradientBrush, consulte la información general sobre el dibujo con colores sólidos y
degradados. Por ImageBrush, DrawingBrusho VisualBrush, vea pintar con imágenes, dibujos y objetos visuales.
También debe estar familiarizado con las transformaciones 2D descritas en Información general sobre
transformaciones.
En el ejemplo siguiente se usa un ImageBrush para pintar un área rectangular con la imagen anterior. Aplica un
RotateTransform a la propiedad RelativeTransform del objeto ImageBrush y establece su propiedad Stretch en
UniformToFill, que debe conservar la relación de aspecto de la imagen cuando se ajusta para rellenar
completamente el rectángulo.
Observe que la imagen está distorsionada, aunque el Stretch del pincel se haya establecido en UniformToFill. Esto
se debe a que la transformación relativa se aplica después de que la Viewbox del pincel se asigna a su Viewport.
La lista siguiente describe cada paso del proceso:
1. Proyectar el contenido del pincel (Viewbox) en su mosaico base (Viewport) mediante el valor Stretch del
pincel.
2. Proyecte el icono base del rectángulo de transformación de 1 x 1.
3. Aplique el RotateTransform.
//
// Create an ImageBrush with a relative transform and
// use it to paint a rectangle.
//
ImageBrush relativeTransformImageBrush = new ImageBrush();
relativeTransformImageBrush.ImageSource =
new BitmapImage(new Uri(@"sampleImages\pinkcherries.jpg", UriKind.Relative));
//
// Create an ImageBrush with a transform and
// use it to paint a rectangle.
//
ImageBrush transformImageBrush = new ImageBrush();
transformImageBrush.ImageSource =
new BitmapImage(new Uri(@"sampleImages\pinkcherries.jpg", UriKind.Relative));
En la ilustración siguiente se muestra el pincel sin una transformación, con la transformación aplicada a la
propiedad RelativeTransform y con la transformación aplicada a la propiedad Transform.
Este ejemplo forma parte de un ejemplo mayor. Para ver el ejemplo completo, consulte el ejemplo de pinceles.
Para más información, consulte Información general sobre pinceles de WPF.
Consulte también
Transform
RelativeTransform
Transform
Brush
Información general sobre el dibujo con colores sólidos y degradados
Pintar con imágenes, dibujos y elementos visuales
Información general sobre transformaciones
Información general sobre las máscaras de opacidad
23/10/2019 • 12 minutes to read • Edit Online
Las máscaras de opacidad permiten hacer que partes de un elemento o un objeto visual sea total o parcialmente
transparentes. Para crear una máscara de opacidad, aplique Brush a la OpacityMask propiedad de un elemento o
Visual. El pincel se asigna al elemento o al objeto visual, y el valor de opacidad de cada píxel del pincel se usa para
determinar la opacidad resultante de cada píxel correspondiente del elemento o objeto visual.
Requisitos previos
En esta información general se supone que está Brush familiarizado con los objetos. Para una introducción sobre
el uso de los pinceles, consulte Información general sobre el dibujo con colores sólidos y degradados. Para obtener
información ImageBrush sobre DrawingBrushy, vea pintar con imágenes, dibujos y objetos visuales.
NOTE
Aunque en los ejemplos de esta información general se muestra el uso de las máscaras de opacidad en los elementos de
imagen, una máscara de Visualopacidad se puede aplicar a cualquier elemento o, incluidos los paneles y controles.
Las máscaras de opacidad se usan para crear efectos visuales interesantes, como crear imágenes o botones que se
desvanecen mediante un fundido, agregar texturas a los elementos o combinar degradados para generar
superficies cristalinas. En la ilustración siguiente se muestra el uso de una máscara de opacidad. Se usa un fondo
de cuadros para mostrar los elementos transparentes de la máscara.
Ejemplo de máscara de opacidad
<Image.OpacityMask>
<ImageBrush
Viewport="0,0,50,50"
ViewportUnits="Absolute"
TileMode="Tile"
ImageSource="sampleImages/tornedges.png"/>
</Image.OpacityMask>
</Image>
Vea también
Pintar con imágenes, dibujos y elementos visuales
Información general sobre el dibujo con colores sólidos y degradados
Información general sobre el dibujo con colores
sólidos y degradados
23/10/2019 • 22 minutes to read • Edit Online
Elija un color en la paleta de colores de 32 bits; para ello, especifique las cantidades de rojo, verde y
azul que se combinarán en un color sólido. El formato para especificar un color de la paleta de 32 bits
es " #rrggbb", donde rr es un número hexadecimal de dos dígitos que especifica la cantidad relativa de
rojo, gg especifica la cantidad de verde y bb especifica la cantidad de azul. Además, el color se puede
especificar como "#aarrggbb", donde aa especifica el valor alfa, o la transparencia, del color. Este
enfoque le permite crear colores que sean parcialmente transparentes. En el ejemplo siguiente, el
Background Button de se establece en rojo totalmente opaco mediante la notación hexadecimal.
Use la sintaxis de etiquetas de propiedad SolidColorBrushpara describir un. Esta sintaxis es más
detallada y le permite especificar una configuración adicional, como la opacidad del pincel. En el
ejemplo siguiente, las Background propiedades de dos Button elementos se establecen en rojo
completamente opaco. El color del primer pincel se describe con un nombre de color predefinido. El
color del segundo pincel se describe con una notación hexadecimal.
<!-- Both of these buttons' backgrounds are painted with red
SolidColorBrush objects, described using object element
syntax. -->
<Button>A Button
<Button.Background>
<SolidColorBrush Color="Red" />
</Button.Background>
</Button>
<Button>A Button
<Button.Background>
<SolidColorBrush Color="#FFFF0000" />
</Button.Background>
</Button>
Cree un SolidColorBrush y establezca su Color propiedad mediante una Color estructura. Puede usar
un color predefinido de la Colors clase o puede Color crear con el método estático FromArgb .
En el ejemplo siguiente se muestra cómo establecer Color la propiedad SolidColorBrush de con un
color predefinido.
El estático FromArgb permite especificar los valores alfa, rojo, verde y azul del color. El intervalo habitual de
cada uno de estos valores es 0 a 255. Por ejemplo, un valor alfa de 0 indica que un color es completamente
transparente, mientras que un valor de 255 indica que es completamente opaco. Del mismo modo, un valor
rojo de 0 indica que un color no tiene rojo, mientras que un valor de 255 indica que un color tiene la
cantidad máxima posible de rojo. En el ejemplo siguiente, el color de un pincel se describe al especificar los
valores alfa, rojo, verde y azul.
Button myButton = new Button();
myButton.Content = "A Button";
myButton.Background = mySolidColorBrush;
Degradados lineales
Dibuja un área con un degradado definido a lo largo de una línea, el eje de degradado. LinearGradientBrush
Los colores del degradado y su ubicación se especifican a lo largo GradientStop del eje de degradado
mediante objetos. También puede modificar el eje de degradado, lo que le permite crear degradados
horizontales y verticales e invertir la dirección de degradado. El eje de degradado se describe en la sección
siguiente. De manera predeterminada, se crea un degradado diagonal.
En el ejemplo siguiente se muestra el código que crea un degradado lineal con cuatro colores.
NOTE
En los ejemplos de degradado de este tema se usa el sistema de coordenadas predeterminado para establecer puntos
de inicio y extremos. El sistema de coordenadas predeterminado es relativo a un cuadro de límite: 0 indica 0 por ciento
del rectángulo de selección y 1 indica el 100 por ciento del cuadro de límite. Puede cambiar este sistema de
coordenadas estableciendo la MappingMode propiedad en el valor. Absolute Un sistema de coordenadas absoluto no
está relacionado con un rectángulo de selección. Los valores se interpretan directamente en el espacio local.
En la ilustración siguiente se muestra el degradado que se creó. El eje de degradado está marcado con una
línea discontinua, mientras que los delimitadores de degradado están marcados con círculos.
En la ilustración siguiente se muestra el degradado que se creó. El eje de degradado está marcado con una
línea discontinua, mientras que los delimitadores de degradado están marcados con círculos.
Degradados radiales
LinearGradientBrush ComoRadialGradientBrush , pinta un área con colores que se combinan a lo largo de
un eje. En los ejemplos anteriores se mostró que el eje de un pincel de degradado lineal es una línea recta. El
eje de un pincel de degradado radial está definido con un círculo; sus colores "se irradian" hacia afuera desde
su origen.
En el ejemplo siguiente, se usa un pincel de degradado radial para pintar el interior de un rectángulo.
En la ilustración siguiente se muestra el degradado que se creó en el ejemplo anterior. Se resaltan los
delimitadores de degradado del pincel. Tenga en cuenta que, a pesar de que los resultados son distintos, los
delimitadores de degradado de este ejemplo son idénticos a los de los ejemplos de pincel de degradado
lineal anteriores.
GradientOrigin Especifica el punto inicial del eje de degradado de un pincel de degradado radial. El eje de
degradado irradia desde el origen del degradado al círculo del degradado. El círculo de degradado de un
pincel se Centerdefine RadiusXmediante sus RadiusY propiedades, y.
En la ilustración siguiente se muestran varios degradados radiales Centercon RadiusXvalores diferentes
RadiusY GradientOrigin,, y.
Como alternativa, puede utilizar el FromScRgb método, que le permite usar valores ScRGB para crear un
color.
Vea también
Brush
SolidColorBrush
LinearGradientBrush
RadialGradientBrush
Pintar con imágenes, dibujos y elementos visuales
Información general sobre la transformación de pinceles
Niveles de representación de gráficos
Pintar con imágenes, dibujos y elementos
visuales
23/10/2019 • 20 minutes to read • Edit Online
En este tema se describe cómo ImageBrushutilizar DrawingBrushlos objetos VisualBrush , y para pintar
un área con una imagen, Drawingun o un Visual.
Requisitos previos
Para entender este tema, debe estar familiarizado con los distintos tipos de pinceles que Windows
Presentation Foundation (WPF ) proporciona y sus características básicas. Para una introducción, consulte
Información general sobre pinceles de WPF.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Microsoft.Samples.BrushExamples.ImageBrushExample"
WindowTitle="ImageBrush Example"
Background="White">
<StackPanel>
<Canvas
Height="200" Width="300">
<Canvas.Background>
<ImageBrush ImageSource="sampleImages\Waterlilies.jpg" />
</Canvas.Background>
</Canvas>
</StackPanel>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Microsoft.Samples.BrushExamples
{
public ImageBrushExample()
{
mainPanel.Children.Add(myCanvas);
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Imaging
Namespace Microsoft.Samples.BrushExamples
End Sub
mainPanel.Children.Add(myCanvas)
End Sub
End Class
End Namespace
// Create a drawing.
GeometryDrawing myGeometryDrawing = new GeometryDrawing();
myGeometryDrawing.Brush = Brushes.LightBlue;
myGeometryDrawing.Pen = new Pen(Brushes.Gray, 1);
GeometryGroup ellipses = new GeometryGroup();
ellipses.Children.Add(new EllipseGeometry(new Point(25,50), 12.5, 25));
ellipses.Children.Add(new EllipseGeometry(new Point(50,50), 12.5, 25));
ellipses.Children.Add(new EllipseGeometry(new Point(75,50), 12.5, 25));
myGeometryDrawing.Geometry = ellipses;
myDrawingBrush.Drawing = myGeometryDrawing;
myGeometryDrawing.Geometry = ellipses
myDrawingBrush.Drawing = myGeometryDrawing
NOTE
Aunque VisualBrush es un tipo de Freezable objeto, no se puede inmovilizar (hacer de solo lectura) Visual cuando su
propiedad se establece en un valor null distinto de.
using System;
using System.Windows;
using System.Windows.Data;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.IO;
using System.Collections.ObjectModel;
using System.Windows.Shapes;
namespace SDKSample
{
public partial class ReflectionExample : Page
{
public ReflectionExample()
{
// Create a name scope for the page.
NameScope.SetNameScope(this, new NameScope());
this.Background = Brushes.Black;
StackPanel myStackPanel = new StackPanel();
myStackPanel.Margin = new Thickness(50);
myReflectedBorder.Background = myLinearGradientBrush;
myReflectedBorder.Child = borderStackPanel;
myVisualBrush.RelativeTransform = myTransformGroup;
reflectionRectangle.Fill = myVisualBrush;
reflectionRectangle.OpacityMask = myLinearGradientBrush2;
reflectionRectangle.BitmapEffect = myBlurBitmapEffect;
myStackPanel.Children.Add(myReflectedBorder);
myStackPanel.Children.Add(dividerRectangle);
myStackPanel.Children.Add(reflectionRectangle);
this.Content = myStackPanel;
}
/*
<Rectangle
Height="{Binding Path=ActualHeight, ElementName=ReflectedVisual}"
Width="{Binding Path=ActualWidth, ElementName=ReflectedVisual}">
<Rectangle.OpacityMask>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#FF000000" Offset="0.0" />
<GradientStop Color="#33000000" Offset="0.5" />
<GradientStop Color="#00000000" Offset="0.75" />
</LinearGradientBrush>
</Rectangle.OpacityMask>
<Rectangle.BitmapEffect>
<BlurBitmapEffect Radius="1.5" />
</Rectangle.BitmapEffect>
</Rectangle>
</StackPanel>
</StackPanel>
</Page>
*/
}
}
Imports System.Windows
Imports System.Windows.Data
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Effects
Imports System.Windows.Media.Imaging
Imports System.IO
Imports System.Collections.ObjectModel
Imports System.Windows.Shapes
Namespace SDKSample
Partial Public Class ReflectionExample
Inherits Page
Public Sub New()
' Create a name scope for the page.
NameScope.SetNameScope(Me, New NameScope())
Me.Background = Brushes.Black
Dim myStackPanel As New StackPanel()
myStackPanel.Margin = New Thickness(50)
myReflectedBorder.Background = myLinearGradientBrush
myReflectedBorder.Child = borderStackPanel
myVisualBrush.RelativeTransform = myTransformGroup
reflectionRectangle.Fill = myVisualBrush
' Create a gradient background for the border.
Dim firstStop2 As New GradientStop()
firstStop2.Offset = 0.0
Dim c1 As New Color()
c1.R = 0
c1.G = 0
c1.B = 0
c1.A = 255
firstStop2.Color = c1
Dim secondStop2 As New GradientStop()
secondStop2.Offset = 0.5
Dim c2 As New Color()
c2.R = 0
c2.G = 0
c2.B = 0
c2.A = 51
firstStop2.Color = c2
Dim thirdStop As New GradientStop()
thirdStop.Offset = 0.75
Dim c3 As New Color()
c3.R = 0
c3.G = 0
c3.B = 0
c3.A = 0
thirdStop.Color = c3
reflectionRectangle.OpacityMask = myLinearGradientBrush2
reflectionRectangle.BitmapEffect = myBlurBitmapEffect
myStackPanel.Children.Add(myReflectedBorder)
myStackPanel.Children.Add(dividerRectangle)
myStackPanel.Children.Add(reflectionRectangle)
Me.Content = myStackPanel
End Sub
End Class
End Namespace
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Black">
<StackPanel Margin="50">
<Rectangle.OpacityMask>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#FF000000" Offset="0.0" />
<GradientStop Color="#33000000" Offset="0.5" />
<GradientStop Color="#00000000" Offset="0.75" />
</LinearGradientBrush>
</Rectangle.OpacityMask>
<Rectangle.BitmapEffect>
<BlurBitmapEffect Radius="1.5" />
</Rectangle.BitmapEffect>
</Rectangle>
</StackPanel>
</Page>
Si quiere ver ejemplos adicionales que muestren cómo aumentar partes de la pantalla y cómo crear
reflejos, consulte Ejemplo de VisualBrush.
Características de TileBrush
ImageBrush, DrawingBrush TileBrush y VisualBrush son tipos de objetos. TileBrushlos objetos
proporcionan un gran control sobre cómo se pinta un área con una imagen, un dibujo o un objeto visual.
Por ejemplo, en lugar de limitarse a dibujar un área con una sola imagen ajustada, puede dibujar un área
con una serie de mosaicos de imagen que crean un patrón.
Un TileBrush tiene tres componentes principales: contenido, mosaicos y el área de salida.
Vea también
ImageBrush
DrawingBrush
VisualBrush
TileBrush
Información general sobre objetos TileBrush
Información general sobre pinceles de WPF
Información general sobre imágenes
Información general sobre objetos Drawing
Información general sobre las máscaras de opacidad
Información general sobre la representación de gráficos en WPF
Ejemplo de ImageBrush
Ejemplo de VisualBrush
Información general sobre objetos TileBrush
23/10/2019 • 12 minutes to read • Edit Online
TileBrush los objetos que proporcionan un gran control sobre cómo se pinta un área con una imagen, Drawing, o
Visual. Este tema describe cómo usar TileBrush características para obtener más control sobre cómo un
ImageBrush, DrawingBrush, o VisualBrush pinta un área.
Requisitos previos
Para entender este tema, es útil entender cómo usar las características básicas de la ImageBrush, DrawingBrush,
o VisualBrush clase. Para obtener una introducción a estos tipos, vea la pintar con imágenes, dibujos y elementos
visuales.
Mosaico base
Un TileBrush proyecta su contenido en un mosaico base. El Stretch propiedad controla cómo TileBrush contenido
se ajusta para rellenar el mosaico base. El Stretch propiedad acepta los valores siguientes, definidos por el Stretch
enumeración:
None: El contenido del pincel no se ajusta para rellenar el mosaico.
Fill: El contenido del pincel se ajusta para rellenar el mosaico. Como el alto y el ancho del contenido se
ajustan de forma independiente, podría no conservarse la relación de aspecto original del contenido. En
otras palabras, el contenido del pincel podría distorsionarse para rellenar por completo el mosaico de
salida.
Uniform: El contenido del pincel se escala para que quepa completamente dentro del mosaico. Se
conserva la relación de aspecto del contenido.
UniformToFill: El contenido del pincel se escala para que rellene completamente el área de salida
conservando la relación de aspecto original del contenido.
La siguiente imagen ilustra los diferentes Stretch configuración.
En el ejemplo siguiente, el contenido de un ImageBrush está establecida para que no se ajusta para rellenar el
área de salida.
<Rectangle
Width="125" Height="175"
Stroke="Black"
StrokeThickness="1"
Margin="0,0,5,0">
<Rectangle.Fill>
<ImageBrush
Stretch="None"
ImageSource="sampleImages\testImage.gif"/>
</Rectangle.Fill>
</Rectangle>
// Create a rectangle.
Rectangle myRectangle = new Rectangle();
myRectangle.Width = 125;
myRectangle.Height = 175;
myRectangle.Stroke = Brushes.Black;
myRectangle.StrokeThickness = 1;
myRectangle.Margin = new Thickness(0,5,0,0);
De forma predeterminada, un TileBrush genera un único mosaico (el mosaico base) y ajusta ese mosaico hasta
rellenar completamente el área de salida. Puede cambiar el tamaño y la posición del mosaico base estableciendo
la Viewport y ViewportUnits propiedades.
Tamaño del mosaico base
El Viewport propiedad determina el tamaño y la posición del mosaico base y el ViewportUnits propiedad
determina si el Viewport se especifica mediante coordenadas absolutas o relativas. Si las coordenadas son
relativas, lo son con respecto al tamaño del área de salida. El punto (0,0) representa la parte superior izquierda
esquina del área de salida y (1,1) representa la parte inferior derecha del área de salida. Para especificar que el
Viewport propiedad usa coordenadas absolutas, establezca el ViewportUnits propiedad Absolute.
La siguiente ilustración muestra la diferencia entre un TileBrush con el valor relativo frente a absoluto
ViewportUnits. Observe que las ilustraciones muestran un patrón de mosaicos; en la siguiente sección se
describe cómo especificar el patrón de mosaicos.
En el ejemplo siguiente, se utiliza una imagen para crear un mosaico con un ancho y alto del 50%. El mosaico
base se encuentra en la posición (0,0) del área de salida.
<Rectangle
Width="50" Height="100">
<Rectangle.Fill>
El ejemplo siguiente establece los iconos de un ImageBrush a 25 por 25 píxeles independientes del dispositivo.
Dado que el ViewportUnits son absolutos, el ImageBrush los iconos son siempre de 25 por 25 píxeles,
independientemente del tamaño del área que se está pintando.
<Rectangle
Width="50" Height="100">
<Rectangle.Fill>
<Rectangle
Width="100" Height="100" >
<Rectangle.Fill>
<ImageBrush ImageSource="sampleImages\triangle.jpg"
Viewport="0,0,0.25,0.25"
TileMode="FlipXY"
/>
</Rectangle.Fill>
</Rectangle>
// Create a rectangle.
Rectangle myRectangle = new Rectangle();
myRectangle.Width = 100;
myRectangle.Height = 100;
Los temas siguientes muestran cómo usar Windows Presentation Foundation (WPF ) pinceles para pintar el
contenido en la pantalla.
En esta sección
Animar el color o la opacidad de un objeto SolidColorBrush
Animar la posición o color de un delimitador de degradado
Crear una reflexión
Crear patrones de mosaico diferentes con un objeto TileBrush
Definir una pluma
Pintar un área con un dibujo
Pintar un área con una imagen
Pintar un área con un degradado lineal
Pintar un área con un degradado radial
Pintar un área con un color sólido
Pintar un área con un pincel del sistema
Pintar un área con un vídeo
Pintar un área con un objeto visual
Conservar la relación de aspecto de una imagen utilizada como fondo
Establecer la alineación horizontal y vertical de TileBrush
Establecer el tamaño del mosaico de un TileBrush
Transformar un pincel
Usar colores del sistema en un degradado
Referencia
Brush
SolidColorBrush
LinearGradientBrush
RadialGradientBrush
DrawingBrush
VisualBrush
Secciones relacionadas
Gráficos y multimedia
Información general sobre la representación de gráficos en WPF
Cómo: Animar el color o la opacidad de un objeto
SolidColorBrush
20/02/2020 • 3 minutes to read • Edit Online
Ejemplo
En el ejemplo siguiente se usan tres animaciones para animar el Color y Opacity de una SolidColorBrush.
La primera animación, una ColorAnimation, cambia el color del pincel a Gray cuando el Mouse entra en el
rectángulo.
La siguiente animación, otra ColorAnimation, cambia el color del pincel a Orange cuando el mouse sale del
rectángulo.
La animación final, una DoubleAnimation, cambia la opacidad del pincel a 0,0 cuando se presiona el botón
primario del mouse.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Input;
namespace Microsoft.Samples.Animation
{
/// <summary>
/// This example shows how to animate the Opacity and Color
/// properties of a SolidColorBrush.
/// </summary>
public class SolidColorBrushExample : Page
{
public SolidColorBrushExample()
{
Title = "SolidColorBrush Animation Example";
Background = Brushes.White;
// Create a Rectangle.
Rectangle aRectangle = new Rectangle();
aRectangle.Width = 100;
aRectangle.Height = 100;
//
// Animate the brush's color to gray when
// the mouse enters the rectangle.
//
ColorAnimation mouseEnterColorAnimation = new ColorAnimation();
mouseEnterColorAnimation.To = Colors.Gray;
mouseEnterColorAnimation.Duration = TimeSpan.FromSeconds(1);
Storyboard.SetTargetName(mouseEnterColorAnimation, "MyAnimatedBrush");
Storyboard.SetTargetProperty(
mouseEnterColorAnimation, new PropertyPath(SolidColorBrush.ColorProperty));
Storyboard mouseEnterStoryboard = new Storyboard();
mouseEnterStoryboard.Children.Add(mouseEnterColorAnimation);
aRectangle.MouseEnter += delegate(object sender, MouseEventArgs e)
{
mouseEnterStoryboard.Begin(this);
};
//
// Animate the brush's color to orange when
// the mouse leaves the rectangle.
//
ColorAnimation mouseLeaveColorAnimation = new ColorAnimation();
mouseLeaveColorAnimation.To = Colors.Orange;
mouseLeaveColorAnimation.Duration = TimeSpan.FromSeconds(1);
Storyboard.SetTargetName(mouseLeaveColorAnimation, "MyAnimatedBrush");
Storyboard.SetTargetProperty(
mouseLeaveColorAnimation, new PropertyPath(SolidColorBrush.ColorProperty));
Storyboard mouseLeaveStoryboard = new Storyboard();
mouseLeaveStoryboard.Children.Add(mouseLeaveColorAnimation);
aRectangle.MouseLeave += delegate(object sender, MouseEventArgs e)
{
mouseLeaveStoryboard.Begin(this);
};
//
// Animate the brush's opacity to 0 and back when
// the left mouse button is pressed over the rectangle.
//
DoubleAnimation opacityAnimation = new DoubleAnimation();
opacityAnimation.To = 0.0;
opacityAnimation.Duration = TimeSpan.FromSeconds(0.5);
opacityAnimation.AutoReverse = true;
Storyboard.SetTargetName(opacityAnimation, "MyAnimatedBrush");
Storyboard.SetTargetProperty(
opacityAnimation, new PropertyPath(SolidColorBrush.OpacityProperty));
Storyboard mouseLeftButtonDownStoryboard = new Storyboard();
mouseLeftButtonDownStoryboard.Children.Add(opacityAnimation);
aRectangle.MouseLeftButtonDown += delegate(object sender, MouseButtonEventArgs e)
{
mouseLeftButtonDownStoryboard.Begin(this);
};
Para obtener un ejemplo más completo, en el que se muestra cómo animar distintos tipos de pinceles, vea el
ejemplo de pinceles. Para obtener más información acerca de la animación, consulte información general sobre
animaciones.
Para mantener la coherencia con otros ejemplos de animación, en las versiones de código de este ejemplo se usa
un objeto Storyboard para aplicar sus animaciones. Sin embargo, al aplicar una animación única en el código, es
más fácil utilizar el método BeginAnimation en lugar de usar un Storyboard. Para obtener un ejemplo, vea Animar
una propiedad sin utilizar un guión gráfico.
Consulte también
Información general sobre animaciones
Información general sobre objetos Storyboard
Ejemplo de pinceles
Cómo: Animar la posición o color de un punto de
degradado
20/02/2020 • 6 minutes to read • Edit Online
Ejemplo
En el ejemplo siguiente se animan tres delimitadores de degradado dentro de un LinearGradientBrush. En el
ejemplo se usan tres animaciones, cada una de las cuales anima un delimitador de degradado diferente:
La primera animación, una DoubleAnimation, anima el primer Offset de delimitador de degradado de 0,0 a
1,0 y después vuelve a 0,0. Como resultado, el primer color del degradado se desplaza desde el lado
izquierdo hasta el lado derecho del rectángulo y, a continuación, vuelve al lado izquierdo.
La segunda animación, una ColorAnimation, anima el Color del segundo delimitador de degradado de
Purple a Yellow y, a continuación, de nuevo a Purple. Como resultado, el color intermedio del degradado
cambia de púrpura a amarillo y de nuevo a púrpura.
La tercera animación, otra ColorAnimation, anima la opacidad del tercer delimitador de degradado Color
por-1 y, a continuación, hacia atrás. Como resultado, el tercer color del degradado se atenúa y vuelve a ser
opaco.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace BrushesIntroduction
{
public class GradientStopAnimationExample : Page
{
public GradientStopAnimationExample()
{
Title = "GradientStop Animation Example";
Background = Brushes.White;
//
// Animate the first gradient stop's offset from
// 0.0 to 1.0 and then back to 0.0.
//
DoubleAnimation offsetAnimation = new DoubleAnimation();
offsetAnimation.From = 0.0;
offsetAnimation.To = 1.0;
offsetAnimation.Duration = TimeSpan.FromSeconds(1.5);
offsetAnimation.AutoReverse = true;
Storyboard.SetTargetName(offsetAnimation, "GradientStop1");
Storyboard.SetTargetProperty(offsetAnimation,
new PropertyPath(GradientStop.OffsetProperty));
//
// Animate the second gradient stop's color from
// Purple to Yellow and then back to Purple.
//
ColorAnimation gradientStopColorAnimation = new ColorAnimation();
gradientStopColorAnimation.From = Colors.Purple;
gradientStopColorAnimation.To = Colors.Yellow;
gradientStopColorAnimation.Duration = TimeSpan.FromSeconds(1.5);
gradientStopColorAnimation.AutoReverse = true;
Storyboard.SetTargetName(gradientStopColorAnimation, "GradientStop2");
Storyboard.SetTargetProperty(gradientStopColorAnimation,
new PropertyPath(GradientStop.ColorProperty));
//
// Animate the third gradient stop's color so
// that it becomes transparent.
//
ColorAnimation opacityAnimation = new ColorAnimation();
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Input
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Namespace BrushesIntroduction
Public Class GradientStopAnimationExample
Inherits Page
Public Sub New()
Title = "GradientStop Animation Example"
Background = Brushes.White
'
' Animate the first gradient stop's offset from
' 0.0 to 1.0 and then back to 0.0.
'
Dim offsetAnimation As New DoubleAnimation()
offsetAnimation.From = 0.0
offsetAnimation.To = 1.0
offsetAnimation.Duration = TimeSpan.FromSeconds(1.5)
offsetAnimation.AutoReverse = True
Storyboard.SetTargetName(offsetAnimation, "GradientStop1")
Storyboard.SetTargetProperty(offsetAnimation, New PropertyPath(GradientStop.OffsetProperty))
'
' Animate the second gradient stop's color from
' Purple to Yellow and then back to Purple.
'
Dim gradientStopColorAnimation As New ColorAnimation()
gradientStopColorAnimation.From = Colors.Purple
gradientStopColorAnimation.To = Colors.Yellow
gradientStopColorAnimation.Duration = TimeSpan.FromSeconds(1.5)
gradientStopColorAnimation.AutoReverse = True
Storyboard.SetTargetName(gradientStopColorAnimation, "GradientStop2")
Storyboard.SetTargetProperty(gradientStopColorAnimation, New
PropertyPath(GradientStop.ColorProperty))
'
' Animate the third gradient stop's color so
' that it becomes transparent.
'
Dim opacityAnimation As New ColorAnimation()
<Rectangle
Width="200"
Height="100"
Stroke="Black" StrokeThickness="1">
<Rectangle.Fill>
<LinearGradientBrush>
<GradientStop x:Name="GradientStop1" Color="MediumBlue" Offset="0.0" />
<GradientStop x:Name="GradientStop2" Color="Purple" Offset="0.5" />
<GradientStop x:Name="GradientStop3" Color="Red" Offset="1.0" />
</LinearGradientBrush>
</Rectangle.Fill>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseLeftButtonDown">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="GradientStop1"
Storyboard.TargetProperty="Offset"
From="0.0" To="1.0" Duration="0:0:1.5"
AutoReverse="True" />
<ColorAnimation
Storyboard.TargetName="GradientStop2"
Storyboard.TargetProperty="Color"
From="Purple" To="Yellow"
Duration="0:0:1.5"
AutoReverse="True"
BeginTime="0:0:3" />
<ColorAnimation
Storyboard.TargetName="GradientStop3"
Storyboard.TargetProperty="Color"
Duration="0:0:1.5"
AutoReverse="True"
BeginTime="0:0:6">
<ColorAnimation.By>
<Color ScA="-1" ScR="0" ScB="0" ScG="0" />
</ColorAnimation.By>
</ColorAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</StackPanel>
</Page>
Aunque en este ejemplo se usa un LinearGradientBrush, el proceso es el mismo para animar objetos GradientStop
dentro de un RadialGradientBrush.
Para obtener más ejemplos, vea el ejemplo brushes.
Consulte también
GradientStop
Información general sobre animaciones
Información general sobre objetos Storyboard
Cómo: Crear una reflexión
20/02/2020 • 7 minutes to read • Edit Online
En este ejemplo se muestra cómo utilizar una VisualBrush para crear una reflexión. Dado que un VisualBrush
puede mostrar un visual existente, puede usar esta capacidad para generar efectos visuales interesantes, como
reflejos y ampliación.
Ejemplo
En el ejemplo siguiente se usa una VisualBrush para crear un reflejo de una Border que contiene varios elementos.
En la ilustración siguiente se muestra el resultado que genera el ejemplo.
using System;
using System.Windows;
using System.Windows.Data;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.IO;
using System.Collections.ObjectModel;
using System.Windows.Shapes;
namespace SDKSample
{
public partial class ReflectionExample : Page
{
public ReflectionExample()
{
// Create a name scope for the page.
NameScope.SetNameScope(this, new NameScope());
this.Background = Brushes.Black;
StackPanel myStackPanel = new StackPanel();
myStackPanel.Margin = new Thickness(50);
myReflectedBorder.Background = myLinearGradientBrush;
borderStackPanel.Children.Add(myTextBlock);
myReflectedBorder.Child = borderStackPanel;
myVisualBrush.RelativeTransform = myTransformGroup;
reflectionRectangle.Fill = myVisualBrush;
reflectionRectangle.BitmapEffect = myBlurBitmapEffect;
myStackPanel.Children.Add(myReflectedBorder);
myStackPanel.Children.Add(dividerRectangle);
myStackPanel.Children.Add(reflectionRectangle);
this.Content = myStackPanel;
}
/*
<Rectangle
Height="{Binding Path=ActualHeight, ElementName=ReflectedVisual}"
Width="{Binding Path=ActualWidth, ElementName=ReflectedVisual}">
<Rectangle.OpacityMask>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#FF000000" Offset="0.0" />
<GradientStop Color="#33000000" Offset="0.5" />
<GradientStop Color="#00000000" Offset="0.75" />
</LinearGradientBrush>
</Rectangle.OpacityMask>
<Rectangle.BitmapEffect>
<BlurBitmapEffect Radius="1.5" />
</Rectangle.BitmapEffect>
</Rectangle>
</StackPanel>
</Page>
*/
}
}
Imports System.Windows
Imports System.Windows.Data
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Effects
Imports System.Windows.Media.Imaging
Imports System.IO
Imports System.Collections.ObjectModel
Imports System.Windows.Shapes
Namespace SDKSample
Partial Public Class ReflectionExample
Inherits Page
Public Sub New()
' Create a name scope for the page.
NameScope.SetNameScope(Me, New NameScope())
Me.Background = Brushes.Black
Dim myStackPanel As New StackPanel()
myStackPanel.Margin = New Thickness(50)
myReflectedBorder.Background = myLinearGradientBrush
borderStackPanel.Children.Add(myTextBlock)
myReflectedBorder.Child = borderStackPanel
myVisualBrush.RelativeTransform = myTransformGroup
reflectionRectangle.Fill = myVisualBrush
reflectionRectangle.OpacityMask = myLinearGradientBrush2
Dim myBlurBitmapEffect As New BlurBitmapEffect()
myBlurBitmapEffect.Radius = 1.5
reflectionRectangle.BitmapEffect = myBlurBitmapEffect
myStackPanel.Children.Add(myReflectedBorder)
myStackPanel.Children.Add(dividerRectangle)
myStackPanel.Children.Add(reflectionRectangle)
Me.Content = myStackPanel
End Sub
End Class
End Namespace
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Black">
<StackPanel Margin="50">
<Rectangle.OpacityMask>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#FF000000" Offset="0.0" />
<GradientStop Color="#33000000" Offset="0.5" />
<GradientStop Color="#00000000" Offset="0.75" />
</LinearGradientBrush>
</Rectangle.OpacityMask>
<Rectangle.BitmapEffect>
<BlurBitmapEffect Radius="1.5" />
</Rectangle.BitmapEffect>
</Rectangle>
</StackPanel>
</Page>
Para obtener el ejemplo completo, que incluye ejemplos que muestran cómo ampliar partes de la pantalla y cómo
crear reflejos, vea ejemplo de VisualBrush.
Consulte también
VisualBrush
Pintar con imágenes, dibujos y elementos visuales
Procedimiento Crear patrones de mosaico diferentes
con un objeto TileBrush
23/10/2019 • 7 minutes to read • Edit Online
En este ejemplo se muestra cómo usar el TileMode propiedad de un TileBrush para crear un patrón.
El TileMode propiedad le permite especificar cómo el contenido de un TileBrush se repite, es decir, en mosaico
para rellenar un área de salida. Para crear un modelo, puede establecer el TileMode a Tile, FlipX, FlipY, o FlipXY.
También debe establecer el Viewport de la TileBrush para que sea menor que el área que se está pintando; en caso
contrario, solo un único mosaico está generado, independientemente que TileMode configuración utilizada.
Ejemplo
En el ejemplo siguiente se crea cinco DrawingBrush los objetos, proporciona a cada uno un diferentes TileMode
configuración y los usa para dibujar cinco rectángulos. Aunque este ejemplo usa el DrawingBrush clase para
demostrar TileMode comportamiento, el TileMode propiedad funciona de forma idéntica para todas la TileBrush
objetos, es decir, para ImageBrush, VisualBrush, y DrawingBrush.
En la ilustración siguiente se muestra el resultado que genera el ejemplo.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace BrushesIntroduction
{
public class TileModeExample : Page
{
public TileModeExample()
{
Background = Brushes.White;
Margin = new Thickness(20);
StackPanel mainPanel = new StackPanel();
mainPanel.HorizontalAlignment = HorizontalAlignment.Left;
//
// Create a Drawing. This will be the DrawingBrushes' content.
//
PolyLineSegment triangleLinesSegment = new PolyLineSegment();
triangleLinesSegment.Points.Add(new Point(50, 0));
triangleLinesSegment.Points.Add(new Point(0, 50));
PathFigure triangleFigure = new PathFigure();
triangleFigure.IsClosed = true;
triangleFigure.StartPoint = new Point(0, 0);
triangleFigure.Segments.Add(triangleLinesSegment);
PathGeometry triangleGeometry = new PathGeometry();
triangleGeometry.Figures.Add(triangleFigure);
GeometryDrawing triangleDrawing = new GeometryDrawing();
triangleDrawing.Geometry = triangleGeometry;
triangleDrawing.Brush = new SolidColorBrush(Color.FromArgb(255, 204, 204, 255));
Pen trianglePen = new Pen(Brushes.Black, 2);
triangleDrawing.Pen = trianglePen;
trianglePen.MiterLimit = 0;
triangleDrawing.Freeze();
//
// Create the first TileBrush. Its content is not tiled.
//
DrawingBrush tileBrushWithoutTiling = new DrawingBrush();
tileBrushWithoutTiling.Drawing = triangleDrawing;
tileBrushWithoutTiling.TileMode = TileMode.None;
//
// Create another TileBrush, this time with tiling.
//
DrawingBrush tileBrushWithTiling = new DrawingBrush();
tileBrushWithTiling.Drawing = triangleDrawing;
tileBrushWithTiling.TileMode = TileMode.Tile;
//
// Create a TileBrush with FlipX tiling.
// The brush's content is flipped horizontally as it is
// tiled in this example
//
DrawingBrush tileBrushWithFlipXTiling = new DrawingBrush();
tileBrushWithFlipXTiling.Drawing = triangleDrawing;
tileBrushWithFlipXTiling.TileMode = TileMode.FlipX;
//
// Create a TileBrush with FlipY tiling.
// The brush's content is flipped vertically as it is
// tiled in this example
//
DrawingBrush tileBrushWithFlipYTiling = new DrawingBrush();
tileBrushWithFlipYTiling.Drawing = triangleDrawing;
tileBrushWithFlipYTiling.Drawing = triangleDrawing;
tileBrushWithFlipYTiling.TileMode = TileMode.FlipY;
//
// Create a TileBrush with FlipXY tiling.
// The brush's content is flipped vertically as it is
// tiled in this example
//
DrawingBrush tileBrushWithFlipXYTiling = new DrawingBrush();
tileBrushWithFlipXYTiling.Drawing = triangleDrawing;
tileBrushWithFlipXYTiling.TileMode = TileMode.FlipXY;
Content = mainPanel;
}
//
// Helper method that creates rectangle elements.
//
private static Rectangle createExampleRectangle()
{
Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 50;
exampleRectangle.Height = 50;
exampleRectangle.Stroke = Brushes.Black;
exampleRectangle.StrokeThickness = 1;
return exampleRectangle;
}
//
// Helper method that creates headers for the examples.
//
private static TextBlock createExampleHeader(String text)
{
TextBlock header = new TextBlock();
header.Margin = new Thickness(0, 10, 0, 0);
header.Text = text;
return header;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Input
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Namespace BrushesIntroduction
Namespace BrushesIntroduction
Public Class TileModeExample
Inherits Page
'
' Create a Drawing. This will be the DrawingBrushes' content.
'
Dim triangleLinesSegment As New PolyLineSegment()
triangleLinesSegment.Points.Add(New Point(50, 0))
triangleLinesSegment.Points.Add(New Point(0, 50))
Dim triangleFigure As New PathFigure()
triangleFigure.IsClosed = True
triangleFigure.StartPoint = New Point(0, 0)
triangleFigure.Segments.Add(triangleLinesSegment)
Dim triangleGeometry As New PathGeometry()
triangleGeometry.Figures.Add(triangleFigure)
'
' Create the first TileBrush. Its content is not tiled.
'
Dim tileBrushWithoutTiling As New DrawingBrush()
tileBrushWithoutTiling.Drawing = triangleDrawing
tileBrushWithoutTiling.TileMode = TileMode.None
'
' Create another TileBrush, this time with tiling.
'
Dim tileBrushWithTiling As New DrawingBrush()
tileBrushWithTiling.Drawing = triangleDrawing
tileBrushWithTiling.TileMode = TileMode.Tile
'
' Create a TileBrush with FlipX tiling.
' The brush's content is flipped horizontally as it is
' The brush's content is flipped horizontally as it is
' tiled in this example
'
Dim tileBrushWithFlipXTiling As New DrawingBrush()
tileBrushWithFlipXTiling.Drawing = triangleDrawing
tileBrushWithFlipXTiling.TileMode = TileMode.FlipX
'
' Create a TileBrush with FlipY tiling.
' The brush's content is flipped vertically as it is
' tiled in this example
'
Dim tileBrushWithFlipYTiling As New DrawingBrush()
tileBrushWithFlipYTiling.Drawing = triangleDrawing
tileBrushWithFlipYTiling.TileMode = TileMode.FlipY
'
' Create a TileBrush with FlipXY tiling.
' The brush's content is flipped vertically as it is
' tiled in this example
'
Dim tileBrushWithFlipXYTiling As New DrawingBrush()
tileBrushWithFlipXYTiling.Drawing = triangleDrawing
tileBrushWithFlipXYTiling.TileMode = TileMode.FlipXY
Content = mainPanel
End Sub
'
' Helper method that creates rectangle elements.
'
Private Shared Function createExampleRectangle() As Rectangle
Dim exampleRectangle As New Rectangle()
exampleRectangle.Width = 50
exampleRectangle.Height = 50
exampleRectangle.Stroke = Brushes.Black
exampleRectangle.StrokeThickness = 1
Return exampleRectangle
End Function
'
' Helper method that creates headers for the examples.
'
Private Shared Function createExampleHeader(ByVal text As String) As TextBlock
Dim header As New TextBlock()
header.Margin = New Thickness(0, 10, 0, 0)
header.Text = text
Return header
End Function
End Class
End Namespace
<StackPanel HorizontalAlignment="Left">
<TextBlock Margin="0,10,0,0">None</TextBlock>
<Rectangle Width="50" Height="50" Stroke="Black" StrokeThickness="1">
<Rectangle.Fill>
<TextBlock Margin="0,10,0,0">Tile</TextBlock>
<Rectangle Width="50" Height="50" Stroke="Black" StrokeThickness="1">
<Rectangle.Fill>
<TextBlock Margin="0,10,0,0">FlipX</TextBlock>
<Rectangle Width="50" Height="50" Stroke="Black" StrokeThickness="1">
<Rectangle.Fill>
<TextBlock Margin="0,10,0,0">FlipY</TextBlock>
<Rectangle Width="50" Height="50" Stroke="Black" StrokeThickness="1">
<Rectangle.Fill>
<Rectangle.Fill>
<TextBlock Margin="0,10,0,0">FlipXY</TextBlock>
<Rectangle Width="50" Height="50" Stroke="Black" StrokeThickness="1">
<Rectangle.Fill>
</StackPanel>
</Page>
Vea también
Establecer el tamaño del mosaico de un TileBrush
Pintar con imágenes, dibujos y elementos visuales
Procedimiento Definir un lápiz
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo utilizar un Pen para esquematizar una forma. Para crear una sencilla Pen, sólo
necesita especificar su Thickness y Brush. Puede crear lápiz más complejo especificando un DashStyle, DashCap,
LineJoin, StartLineCap, y EndLineCap.
Ejemplo
En el ejemplo siguiente se usa un Pen describir una forma definida por un GeometryDrawing.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace SDKSample
{
public partial class PenExample : Page
{
public PenExample()
{
// Create several geometries.
RectangleGeometry myRectangleGeometry = new RectangleGeometry();
myRectangleGeometry.Rect = new Rect(0, 0, 50, 50);
EllipseGeometry myEllipseGeometry = new EllipseGeometry();
myEllipseGeometry.Center = new Point(75, 75);
myEllipseGeometry.RadiusX = 50;
myEllipseGeometry.RadiusY = 50;
LineGeometry myLineGeometry = new LineGeometry();
myLineGeometry.StartPoint = new Point(75, 75);
myLineGeometry.EndPoint = new Point(75, 0);
myPen.Brush = myLinearGradientBrush;
myGeometryDrawing.Pen = myPen;
// Create an Image and set its DrawingImage to the Geometry created above.
Image myImage = new Image();
myImage.Stretch = Stretch.None;
myImage.Margin = new Thickness(10);
this.Content = myImage;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Namespace SDKSample
Partial Public Class PenExample
Inherits Page
Public Sub New()
' Create several geometries.
Dim myRectangleGeometry As New RectangleGeometry()
myRectangleGeometry.Rect = New Rect(0, 0, 50, 50)
Dim myEllipseGeometry As New EllipseGeometry()
myEllipseGeometry.Center = New Point(75, 75)
myEllipseGeometry.RadiusX = 50
myEllipseGeometry.RadiusY = 50
Dim myLineGeometry As New LineGeometry()
myLineGeometry.StartPoint = New Point(75, 75)
myLineGeometry.EndPoint = New Point(75, 0)
' Create a gradient to use as a value for the Pen's Brush property.
' Create a gradient to use as a value for the Pen's Brush property.
Dim firstStop As New GradientStop()
firstStop.Offset = 0.0
Dim c1 As New Color()
c1.A = 255
c1.R = 204
c1.G = 204
c1.B = 255
firstStop.Color = c1
Dim secondStop As New GradientStop()
secondStop.Offset = 1.0
secondStop.Color = Colors.Purple
myPen.Brush = myLinearGradientBrush
myGeometryDrawing.Pen = myPen
' Create an Image and set its DrawingImage to the Geometry created above.
Dim myImage As New Image()
myImage.Stretch = Stretch.None
myImage.Margin = New Thickness(10)
Me.Content = myImage
End Sub
End Class
End Namespace
GeometryDrawing
Procedimiento Pintar un área con un dibujo
23/10/2019 • 6 minutes to read • Edit Online
En este ejemplo se muestra cómo pintar un área con un dibujo. Para pintar un área con un dibujo, usa un
DrawingBrush y uno o varios Drawing objetos. En el ejemplo siguiente se usa un DrawingBrush para pintar un
objeto con un dibujo de dos elipses.
Ejemplo
<!-- Demonstrates the use of DrawingBrush. -->
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="White">
<StackPanel Margin="20">
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace Microsoft.Samples.DrawingBrushExamples
{
/// <summary>
/// Paints a Rectangle element with a DrawingBrush.
/// </summary>
/// </summary>
public class DrawingBrushExample : Page
{
public DrawingBrushExample()
{
Background = Brushes.White;
StackPanel mainPanel = new StackPanel();
// Create a DrawingBrush
DrawingBrush myDrawingBrush = new DrawingBrush();
myDrawingBrush.Drawing = aDrawing;
mainPanel.Children.Add(aRectangle);
this.Content = mainPanel;
}
}
}
Imports System.Windows.Media.Animation
Namespace Microsoft.Samples.DrawingBrushExamples
''' <summary>
''' Paints a Rectangle element with a DrawingBrush.
''' </summary>
Public Class DrawingBrushExample
Inherits Page
Public Sub New()
Background = Brushes.White
Dim mainPanel As New StackPanel()
mainPanel.Children.Add(aRectangle)
Me.Content = mainPanel
End Sub
End Class
End Namespace
En la siguiente ilustración se muestra el resultado del ejemplo.
(El centro de la forma es blanco por las razones descritas en controlar el relleno de una forma compuesta.)
Estableciendo un DrawingBrush del objeto Viewport y TileMode propiedades, puede crear un patrón de repetición.
En el ejemplo siguiente se pinta un objeto con un patrón creado a partir de un dibujo de dos elipses.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace Microsoft.Samples.DrawingBrushExamples
{
/// <summary>
/// <summary>
/// Paints a Rectangle element with a tiled DrawingBrush.
/// </summary>
public class TiledDrawingBrushExample : Page
{
public TiledDrawingBrushExample()
{
Background = Brushes.White;
StackPanel mainPanel = new StackPanel();
// Create a DrawingBrush
DrawingBrush myDrawingBrush = new DrawingBrush();
myDrawingBrush.Drawing = aDrawing;
mainPanel.Children.Add(aRectangle);
this.Content = mainPanel;
}
}
}
Imports System.Windows.Media.Animation
Namespace Microsoft.Samples.DrawingBrushExamples
''' <summary>
''' Paints a Rectangle element with a tiled DrawingBrush.
''' </summary>
Public Class TiledDrawingBrushExample
Inherits Page
mainPanel.Children.Add(aRectangle)
Me.Content = mainPanel
End Sub
End Sub
End Class
End Namespace
Para obtener más información acerca de los pinceles de dibujo, consulte pintar con imágenes, dibujos y elementos
visuales. Para obtener más información acerca de Drawing objetos, vea el información general sobre objetos de
dibujo.
Procedimiento Pintar un área con una imagen
23/10/2019 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo usar el ImageBrush clase para pintar un área con una imagen. Un ImageBrush
muestra una sola imagen, que se especifica mediante su ImageSource propiedad.
Ejemplo
Las operaciones de pintura de ejemplo siguiente la Background de un botón mediante el uso de un ImageBrush.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Windows.Media;
namespace Microsoft.Samples.Graphics.UsingImageBrush
{
public PaintingWithImagesExample()
{
Background = Brushes.White;
StackPanel mainPanel = new StackPanel();
mainPanel.Margin = new Thickness(20.0);
// Create a button.
Button berriesButton = new Button();
berriesButton.Foreground = Brushes.White;
berriesButton.FontWeight = FontWeights.Bold;
FontSizeConverter sizeConverter = new FontSizeConverter();
berriesButton.FontSize = (Double)sizeConverter.ConvertFromString("16pt");
berriesButton.FontFamily = new FontFamily("Verdana");
berriesButton.Content = "Berries";
berriesButton.Padding = new Thickness(20.0);
berriesButton.HorizontalAlignment = HorizontalAlignment.Left;
// Create an ImageBrush.
ImageBrush berriesBrush = new ImageBrush();
berriesBrush.ImageSource =
new BitmapImage(
new Uri(@"sampleImages\berries.jpg", UriKind.Relative)
);
mainPanel.Children.Add(berriesButton);
this.Content = mainPanel;
}
}
}
De forma predeterminada, un ImageBrush ajusta su imagen hasta rellenar completamente el área que se está
pintando. En el ejemplo anterior, la imagen se ajusta para rellenar el botón, lo que puede distorsionar la imagen.
Puede controlar este comportamiento estableciendo el Stretch propiedad de TileBrush a Uniform o UniformToFill,
lo que hace que el pincel conserve la relación de aspecto de la imagen.
Si establece la Viewport y TileMode las propiedades de un ImageBrush, puede crear un patrón de repetición. En el
ejemplo siguiente se pinta un botón mediante un patrón creado a partir de una imagen.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Windows.Media;
namespace Microsoft.Samples.Graphics.UsingImageBrush
{
public TiledImageBrushExample()
{
Background = Brushes.White;
StackPanel mainPanel = new StackPanel();
mainPanel.Margin = new Thickness(20.0);
// Create a button.
Button berriesButton = new Button();
berriesButton.Foreground = Brushes.White;
berriesButton.FontWeight = FontWeights.Bold;
FontSizeConverter sizeConverter = new FontSizeConverter();
berriesButton.FontSize = (Double)sizeConverter.ConvertFromString("16pt");
berriesButton.FontFamily = new FontFamily("Verdana");
berriesButton.Content = "Berries";
berriesButton.Padding = new Thickness(20.0);
berriesButton.HorizontalAlignment = HorizontalAlignment.Left;
// Create an ImageBrush.
ImageBrush berriesBrush = new ImageBrush();
berriesBrush.ImageSource =
new BitmapImage(
new Uri(@"sampleImages\berries.jpg", UriKind.Relative)
);
mainPanel.Children.Add(berriesButton);
this.Content = mainPanel;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media.Imaging
Imports System.Windows.Media
Namespace Microsoft.Samples.Graphics.UsingImageBrush
mainPanel.Children.Add(berriesButton)
Me.Content = mainPanel
End Sub
End Class
End Namespace
Para obtener más información sobre la ImageBrush de clases, vea pintar con imágenes, dibujos y elementos
visuales.
Este ejemplo de código forma parte de un ejemplo más extenso proporcionado para el ImageBrush clase. Para
obtener un ejemplo completo, vea ejemplo de ImageBrush.
Vea también
Pintar con imágenes, dibujos y elementos visuales
Cómo: Pintar un área con un degradado lineal
20/02/2020 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo usar la clase LinearGradientBrush para pintar un área con un degradado lineal.
En el ejemplo siguiente, el Fill de una Rectangle se pinta con un degradado lineal diagonal que realiza la transición
de amarillo a rojo a azul a verde lima.
Ejemplo
<!-- This rectangle is painted with a diagonal linear gradient. -->
<Rectangle Width="200" Height="100">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1.0" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
Para crear un degradado lineal horizontal, cambie el StartPoint y EndPoint de la LinearGradientBrush a (0, 0.5) y (1,
0.5). En el ejemplo siguiente, se pinta un Rectangle con un degradado lineal horizontal.
<!-- This rectangle is painted with a horizontal linear gradient. -->
<Rectangle Width="200" Height="100">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1.0" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
Para crear un degradado lineal vertical, cambie los StartPoint y EndPoint de la LinearGradientBrush a (0.5, 0) y (0.5,
1). En el ejemplo siguiente, se pinta un Rectangle con un degradado lineal vertical.
NOTE
En los ejemplos de este tema se usa el sistema de coordenadas predeterminado para establecer puntos de inicio y extremos.
El sistema de coordenadas predeterminado es relativo a un rectángulo de selección: 0 indica 0 por ciento del rectángulo de
selección y 1 indica el 100 por ciento del cuadro de límite. Puede cambiar este sistema de coordenadas estableciendo la
propiedad MappingMode en el valor BrushMappingMode.Absolute. Un sistema de coordenadas absoluto no está
relacionado con un rectángulo de selección. Los valores se interpretan directamente en el espacio local.
Para obtener más ejemplos, vea ejemplo de pinceles. Para obtener más información sobre los degradados y otros
tipos de pinceles, consulte información general sobre el dibujo con colores sólidos y degradados.
Cómo: Pintar un área con un degradado radial
20/02/2020 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo usar la clase RadialGradientBrush para pintar un área con un degradado radial.
Ejemplo
En el ejemplo siguiente se usa un RadialGradientBrush para pintar un rectángulo con un degradado radial que
realiza la transición de amarillo a rojo a azul a verde lima.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace BrushesIntroduction
{
public class RadialGradientBrushSnippet : Page
{
public RadialGradientBrushSnippet()
{
Title = "RadialGradientBrush Example";
Background = Brushes.White;
Margin = new Thickness(20);
//
// Create a RadialGradientBrush with four gradient stops.
//
RadialGradientBrush radialGradient = new RadialGradientBrush();
// Set the gradient center to the center of the area being painted.
radialGradient.Center = new Point(0.5, 0.5);
Namespace BrushesIntroduction
Public Class RadialGradientBrushSnippet
Inherits Page
Public Sub New()
Title = "RadialGradientBrush Example"
Background = Brushes.White
Margin = New Thickness(20)
'
' Create a RadialGradientBrush with four gradient stops.
'
Dim radialGradient As New RadialGradientBrush()
' Set the GradientOrigin to the center of the area being painted.
radialGradient.GradientOrigin = New Point(0.5, 0.5)
' Set the gradient center to the center of the area being painted.
radialGradient.Center = New Point(0.5, 0.5)
End Sub
End Class
End Namespace
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="RadialGradientBrush Example"
Background="White" Margin="20">
<StackPanel>
En la ilustración siguiente se muestra el degradado del ejemplo anterior. Los topes del degradado se han resaltado.
NOTE
En los ejemplos de este tema se usa el sistema de coordenadas predeterminado para establecer los puntos de control. El
sistema de coordenadas predeterminado es relativo a un rectángulo de selección: 0 indica 0 por ciento del rectángulo de
selección y 1 indica el 100 por ciento del cuadro de límite. Puede cambiar este sistema de coordenadas estableciendo la
propiedad MappingMode en el valor Absolute. Un sistema de coordenadas absoluto no está relacionado con un rectángulo
de selección. Los valores se interpretan directamente en el espacio local.
Para obtener más ejemplos de RadialGradientBrush, vea el ejemplo de pinceles. Para obtener más información
sobre los degradados y otros tipos de pinceles, consulte información general sobre el dibujo con colores sólidos y
degradados.
Procedimiento Pintar un área con un color sólido
23/10/2019 • 2 minutes to read • Edit Online
Para pintar un área con un color sólido, puede usar un pincel del sistema predefinidos, como Red o Blue, o bien
puede crear un nuevo SolidColorBrush y describir su Color mediante valores alfabéticos, rojos, verde y azules. En
XAML, también puede pintar un área con un color sólido utilizando la notación hexadecimal.
Los ejemplos siguientes se usa cada una de estas técnicas para pintar un Rectangle azul.
Ejemplo
Utilizar un pincel predefinido
En el ejemplo siguiente se usa el pincel predefinido Blue para pintar un rectángulo azul.
<!-- Note that the first two characters "FF" of the 8-digit
value is the alpha which controls the transparency of
the color. Therefore, to make a completely transparent
color (invisible), use "00" for those digits (e.g. #000000FF). -->
<Rectangle Width="50" Height="50" Fill="#FF0000FF" />
Vea también
Brushes
Procedimiento Pintar un área con un pincel del
sistema
23/10/2019 • 3 minutes to read • Edit Online
El SystemColors clase proporciona acceso a los pinceles del sistema y los colores, como ControlBrush,
ControlBrushKey, y DesktopBrush. Un pincel del sistema es un SolidColorBrush objeto que pinta un área con el
color del sistema especificado. Un pincel del sistema siempre produce un relleno sólido; no puede usarse para
crear un degradado.
Puede utilizar los pinceles del sistema como un recurso estático o dinámico. Utilice un recurso dinámico si desea
que el pincel se actualice automáticamente si el usuario cambia el pincel del sistema mientras se ejecuta la
aplicación; de lo contrario, utilice un recurso estático. La clase SystemColors contiene varias propiedades estáticas
que siguen una convención de nomenclatura estricta:
<SystemColor> Brush
Obtiene una referencia estática a un SolidColorBrush del color del sistema especificado.
<SystemColor> BrushKey
Obtiene una referencia dinámica a un SolidColorBrush del color del sistema especificado.
<SystemColor> Color
Obtiene una referencia estática a una Color estructura de color del sistema especificado.
<SystemColor> ColorKey
Obtiene una referencia dinámica a la Color estructura de color del sistema especificado.
Un color del sistema es un Color estructura que se puede usar para configurar un pincel. Por ejemplo, puede crear
un degradado con los colores del sistema estableciendo el Color las propiedades de un LinearGradientBrush
delimitadores de degradado del objeto con los colores del sistema. Para obtener un ejemplo, vea usar colores del
sistema en un degradado.
Ejemplo
En el ejemplo siguiente se utiliza una referencia dinámica de pincel del sistema para establecer el fondo de un
botón.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="SystemColors Example" Background="White">
<StackPanel Margin="20">
</StackPanel>
</Page>
En el ejemplo siguiente se utiliza una referencia estática de pincel del sistema para establecer el fondo de un
botón.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="SystemColors Example" Background="White">
<StackPanel Margin="20">
</StackPanel>
</Page>
Para obtener un ejemplo que muestra cómo utilizar un color del sistema en un degradado, vea usar colores del
sistema en un degradado.
Vea también
Usar colores del sistema en un degradado
Información general sobre el dibujo con colores sólidos y degradados
Procedimiento Pintar un área con un vídeo
23/10/2019 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo pintar un área con medios. Una manera de pintar un área con medios es usar un
MediaElement junto con un VisualBrush. Utilice la MediaElement para cargar y reproducir el archivo multimedia y,
a continuación, usarla para establecer el Visual propiedad de la VisualBrush. A continuación, puede usar el
VisualBrush para pintar un área con el elemento multimedia cargado.
Ejemplo
En el ejemplo siguiente se usa un MediaElement y un VisualBrush para pintar el Foreground de un TextBlock
control con vídeo. Este ejemplo se establece la IsMuted propiedad de la MediaElement a true para que no genere
ningún sonido.
myTextBlock.Foreground = myVisualBrush;
myTextBlock.Foreground = myVisualBrush
Ejemplo
Dado que VisualBrush hereda el TileBrush (clase), proporciona varios modos de mosaico. Estableciendo el
TileMode propiedad de un VisualBrush a Tile y estableciendo su Viewport propiedad en un valor menor que el
área que se está pintando, puede crear un patrón de mosaicos.
El ejemplo siguiente es idéntico al ejemplo anterior, salvo que el VisualBrush genera un modelo a partir del vídeo.
myTextBlock.Foreground = myVisualBrush;
myTextBlock.Foreground = myVisualBrush
Para obtener información acerca de cómo agregar un archivo de contenido, como un archivo multimedia, a la
aplicación, consulte WPF Application Resource, contenido y los archivos de datos. Cuando se agrega un archivo
multimedia, debe agregarlo como un archivo de contenido, no como un archivo de recursos.
Vea también
VisualBrush
Pintar con imágenes, dibujos y elementos visuales
Información general sobre objetos TileBrush
Información general sobre multimedia
Procedimiento Pintar un área con un objeto visual
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo usar el VisualBrush clase para pintar un área con un Visual.
En el ejemplo siguiente, se utilizan varios controles y un panel como el fondo de un rectángulo.
Ejemplo
<Rectangle Width="150" Height="150" Stroke="Black" Margin="5,0,5,0">
<Rectangle.Fill>
<VisualBrush>
<VisualBrush.Visual>
<StackPanel Background="White">
<Rectangle Width="25" Height="25" Fill="Red" Margin="2" />
<TextBlock FontSize="10pt" Margin="2">Hello, World!</TextBlock>
<Button Margin="2">A Button</Button>
</StackPanel>
</VisualBrush.Visual>
</VisualBrush>
</Rectangle.Fill>
</Rectangle>
VisualBrush myVisualBrush = new VisualBrush();
Para obtener más información acerca de VisualBrush y ejemplos adicionales, vea el pintar con imágenes, dibujos y
elementos visuales información general.
Este ejemplo de código forma parte de un ejemplo más extenso proporcionado para el VisualBrush clase. Para
obtener un ejemplo completo, vea el ejemplo de VisualBrush.
Vea también
Pintar con imágenes, dibujos y elementos visuales
Procedimiento Conservar la relación de aspecto de
una imagen usada como fondo
23/10/2019 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo usar el Stretch propiedad de un ImageBrush con el fin de conservar la relación
de aspecto de la imagen.
De forma predeterminada, cuando se usa un ImageBrush para pintar un área, el contenido se expande para
rellenar completamente el área de salida. Cuando el área de salida y la imagen tienen relaciones de aspecto
diferentes, la imagen queda distorsionada al ajustarse.
Para realizar una ImageBrush conservar la relación de aspecto de su imagen, establezca la Stretch propiedad
Uniform o UniformToFill.
Ejemplo
El ejemplo siguiente utiliza dos ImageBrush objetos para pintar dos rectángulos. Cada rectángulo tiene 300 por
150 píxeles y cada uno contiene una imagen de 300 por 300 píxeles. El Stretch propiedad del primer pincel se
establece en Uniformy el Stretch propiedad del segundo pincel se establece en UniformToFill.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Windows.Shapes;
namespace Microsoft.Samples.Graphics.UsingImageBrush
{
/// <summary>
/// Demonstrates different ImageBrush Stretch settings.
/// </summary>
public class StretchModes : Page
{
public StretchModes()
{
Content = mainPanel;
Background = Brushes.White;
Margin = new Thickness(20);
Title = "ImageBrush Stretch Modes";
}
}
}
La siguiente ilustración muestra la salida del primer pincel, que tiene un Stretch de Uniform.
La siguiente ilustración muestra el resultado del segundo pincel, que tiene un Stretch de UniformToFill.
Tenga en cuenta que el Stretch propiedad se comporta exactamente igual para los demás TileBrush objetos, es
decir, para DrawingBrush y VisualBrush. Para obtener más información acerca de ImageBrush y el otro TileBrush
objetos, vea pintar con imágenes, dibujos y elementos visuales.
Tenga en cuenta también que, aunque el Stretch propiedad aparece para especificar cómo el TileBrush contenido
se estira para ajustarse a su área de salida, en realidad especifica cómo el TileBrush contenido se expande para
rellenar su mosaico base. Para obtener más información, consulta TileBrush.
Este ejemplo de código forma parte de un ejemplo más extenso proporcionado para el ImageBrush clase. Para
obtener un ejemplo completo, vea ejemplo de ImageBrush.
Vea también
TileBrush
Pintar con imágenes, dibujos y elementos visuales
Procedimiento Establecer la alineación horizontal y
vertical de un TileBrush
23/10/2019 • 8 minutes to read • Edit Online
En este ejemplo se muestra cómo controlar la alineación horizontal y vertical del contenido en un mosaico. Para
controlar la alineación horizontal y vertical de un TileBrush, use su AlignmentX y AlignmentY propiedades.
El AlignmentX y AlignmentY las propiedades de un TileBrush se usan cuando cualquiera de las siguientes
condiciones es verdadera:
El Stretch propiedad es Uniform o UniformToFill y Viewbox y Viewport tienen relaciones de aspecto
diferentes.
El Stretch propiedad es None y Viewbox y Viewport tienen tamaños diferentes.
Ejemplo
El ejemplo siguiente alinea el contenido de un DrawingBrush, que es un tipo de TileBrush, a la esquina superior
izquierda de su mosaico. Para alinear el contenido, el ejemplo establece la AlignmentX propiedad de la
DrawingBrush a Left y el AlignmentY propiedad Top. Este ejemplo produce el siguiente resultado:
'
' Create a TileBrush and align its
' content to the top-left of its tile.
'
Dim topLeftAlignedTileBrush As New DrawingBrush()
topLeftAlignedTileBrush.AlignmentX = AlignmentX.Left
topLeftAlignedTileBrush.AlignmentY = AlignmentY.Top
Ejemplo
En el ejemplo siguiente se alinea el contenido de un DrawingBrush a la esquina inferior derecha de su mosaico
estableciendo la AlignmentX propiedad Right y el AlignmentY propiedad Bottom. El ejemplo genera el siguiente
resultado.
'
' Create a TileBrush and align its
' content to the bottom-right of its tile.
'
Dim bottomRightAlignedTileBrush As New DrawingBrush()
With bottomRightAlignedTileBrush
.AlignmentX = AlignmentX.Right
.AlignmentY = AlignmentY.Bottom
.Stretch = Stretch.None
Ejemplo
En el ejemplo siguiente se alinea el contenido de un DrawingBrush a la esquina superior izquierda de su mosaico
estableciendo la AlignmentX propiedad Left y el AlignmentY propiedad Top. También establece la Viewport y
TileMode de la DrawingBrush para generar un modelo de mosaico. El ejemplo genera el siguiente resultado.
Patrón de mosaico con el contenido alineado en la parte superior izquierda en el mosaico base
La ilustración destaca el mosaico base, por lo que puede ver cómo se alinea el contenido. Tenga en cuenta que el
AlignmentX configuración no tiene ningún efecto porque el contenido de la DrawingBrush rellena al completo el
mosaico base horizontalmente.
//
// Create a TileBrush that generates a
// tiled pattern and align its
// content to the top-left of its tile.
//
DrawingBrush tiledTopLeftAlignedTileBrush = new DrawingBrush();
tiledTopLeftAlignedTileBrush.AlignmentX = AlignmentX.Left;
tiledTopLeftAlignedTileBrush.AlignmentY = AlignmentY.Top;
tiledTopLeftAlignedTileBrush.Stretch = Stretch.Uniform;
'
' Create a TileBrush that generates a
' tiled pattern and align its
' content to the top-left of its tile.
'
Dim tiledTopLeftAlignedTileBrush As New DrawingBrush()
With tiledTopLeftAlignedTileBrush
.AlignmentX = AlignmentX.Left
.AlignmentY = AlignmentY.Top
.Stretch = Stretch.Uniform
Ejemplo
En el ejemplo final se alinea el contenido de un mosaico DrawingBrush a la esquina inferior derecha de su mosaico
base estableciendo la AlignmentX propiedad Right y el AlignmentY propiedad Bottom. El ejemplo genera el
siguiente resultado.
Patrón de mosaico con el contenido alineado en la parte inferior derecha en el mosaico base
Nuevamente, el AlignmentX configuración no tiene ningún efecto porque el contenido de la DrawingBrush rellena
al completo el mosaico base horizontalmente.
//
// Create a TileBrush and align its
// content to the bottom-right of its tile.
//
DrawingBrush bottomRightAlignedTileBrush = new DrawingBrush();
bottomRightAlignedTileBrush.AlignmentX = AlignmentX.Right;
bottomRightAlignedTileBrush.AlignmentY = AlignmentY.Bottom;
bottomRightAlignedTileBrush.Stretch = Stretch.None;
'
' Create a TileBrush and align its
' content to the bottom-right of its tile.
'
Dim bottomRightAlignedTileBrush As New DrawingBrush()
With bottomRightAlignedTileBrush
.AlignmentX = AlignmentX.Right
.AlignmentY = AlignmentY.Bottom
.Stretch = Stretch.None
Los ejemplos usan DrawingBrush objetos para demostrar cómo el AlignmentX y AlignmentY se usan las
propiedades. Estas propiedades se comportan exactamente igual para todos los pinceles en mosaicos:
DrawingBrush, ImageBrush, y VisualBrush. Para más información sobre los pinceles en mosaicos, vea Pintar con
imágenes, dibujos y elementos visuales.
Vea también
DrawingBrush
ImageBrush
VisualBrush
Pintar con imágenes, dibujos y elementos visuales
Procedimiento Establecer el tamaño del mosaico de
un TileBrush
23/10/2019 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo establecer el tamaño del mosaico para un TileBrush. De forma predeterminada,
un TileBrush genera un mosaico único que rellena completamente el área que se está pintando. Puede invalidar
este comportamiento estableciendo el Viewport y ViewportUnits propiedades.
El Viewport propiedad especifica el tamaño del mosaico para un TileBrush. De forma predeterminada, el valor de
la Viewport propiedad es relativo al tamaño del área que se está pintando. Para realizar la Viewport propiedad
especificar un tamaño de mosaico absoluto, establezca el ViewportUnits propiedad Absolute.
Ejemplo
En el ejemplo siguiente se usa un ImageBrush, un tipo de TileBrush, para pintar un rectángulo con mosaicos. El
ejemplo establece cada mosaico al 50 por ciento al 50 por ciento del área de salida (rectángulo). Como resultado,
el rectángulo se pinta con cuatro proyecciones de la imagen.
La siguiente ilustración muestra la salida que genera el ejemplo:
//
// Create an ImageBrush and set the size of each
// tile to 50% by 50% of the area being painted.
//
ImageBrush relativeTileSizeImageBrush = new ImageBrush();
relativeTileSizeImageBrush.ImageSource =
new BitmapImage(new Uri(@"sampleImages\cherries_larger.jpg", UriKind.Relative));
relativeTileSizeImageBrush.TileMode = TileMode.Tile;
//
// Create an ImageBrush and set the size of each
// tile to 25 by 25 pixels.
//
ImageBrush absoluteTileSizeImageBrush = new ImageBrush();
absoluteTileSizeImageBrush.ImageSource =
new BitmapImage(new Uri(@"sampleImages\cherries_larger.jpg", UriKind.Relative));
absoluteTileSizeImageBrush.TileMode = TileMode.Tile;
// Set the size of the base tile. Had we left ViewportUnits set
// to RelativeToBoundingBox (the default value),
// each tile would be 25 times the size of the area being
// painted. Because ViewportUnits is set to Absolute,
// the following line creates tiles that are 25 by 25 pixels.
absoluteTileSizeImageBrush.Viewport = new Rect(0, 0, 25, 25);
Los ejemplos anteriores forman parte de un ejemplo mayor. Para obtener un ejemplo completo, vea ejemplo de
ImageBrush.
Aunque este ejemplo usa el ImageBrush (clase), el Viewport y ViewportUnits propiedades se comportan
exactamente igual para los demás TileBrush objetos, es decir, para DrawingBrush y VisualBrush. Para obtener más
información acerca de ImageBrush y el otro TileBrush objetos, vea pintar con imágenes, dibujos y elementos
visuales.
Vea también
TileBrush
Pintar con imágenes, dibujos y elementos visuales
Crear patrones de mosaico diferentes con un objeto TileBrush
Procedimiento Transformar un pincel
23/10/2019 • 4 minutes to read • Edit Online
En este ejemplo se muestra cómo transformar Brush objetos mediante el uso de sus dos propiedades de
transformación: RelativeTransform y Transform.
Los ejemplos siguientes usan una RotateTransform para girar el contenido de un ImageBrush 45 grados.
La siguiente ilustración muestra el ImageBrush sin un RotateTransform, con el RotateTransform aplicado a la
RelativeTransform propiedad y con el RotateTransform aplicado a la Transform propiedad.
Ejemplo
El primer ejemplo se aplica un RotateTransform a la RelativeTransform propiedad de un ImageBrush. El CenterX y
CenterY las propiedades de un RotateTransform objeto se establecen en 0,5, que es la coordenada relativa del
punto central de este contenido. Como resultado, el ImageBrush contenido gira sobre su centro.
//
// Create an ImageBrush with a relative transform and
// use it to paint a rectangle.
//
ImageBrush relativeTransformImageBrush = new ImageBrush();
relativeTransformImageBrush.ImageSource =
new BitmapImage(new Uri(@"sampleImages\pinkcherries.jpg", UriKind.Relative));
'
' Create an ImageBrush with a relative transform and
' use it to paint a rectangle.
'
Dim relativeTransformImageBrush As New ImageBrush()
relativeTransformImageBrush.ImageSource = New BitmapImage(New Uri("sampleImages\pinkcherries.jpg",
UriKind.Relative))
El segundo ejemplo también se aplica un RotateTransform a un ImageBrush; sin embargo, este ejemplo se usa el
Transform propiedad en lugar de la RelativeTransform propiedad.
Para girar el pincel sobre su centro, el ejemplo establece la CenterX y CenterY propiedades de la RotateTransform
objeto en coordenadas absolutas. Como el pincel pinta un rectángulo de 175 x 90 píxeles, el punto central del
rectángulo es (87,5, 45).
//
// Create an ImageBrush with a transform and
// use it to paint a rectangle.
//
ImageBrush transformImageBrush = new ImageBrush();
transformImageBrush.ImageSource =
new BitmapImage(new Uri(@"sampleImages\pinkcherries.jpg", UriKind.Relative));
'
' Create an ImageBrush with a transform and
' use it to paint a rectangle.
'
Dim transformImageBrush As New ImageBrush()
transformImageBrush.ImageSource = New BitmapImage(New Uri("sampleImages\pinkcherries.jpg", UriKind.Relative))
Para obtener una descripción de cómo el RelativeTransform y Transform propiedades de trabajo, consulte el
información general sobre la transformación de pinceles.
Para ver el ejemplo completo, consulte Brushes Sample (Ejemplo de pinceles). Para más información sobre los
pinceles, consulte Información general sobre el dibujo con colores sólidos y degradados.
Vea también
Información general sobre la transformación de pinceles
Información general sobre el dibujo con colores sólidos y degradados
Información general sobre transformaciones
Procedimiento Usar colores del sistema en un
degradado
23/10/2019 • 2 minutes to read • Edit Online
Para utilizar un color del sistema en un degradado, se utiliza el <SystemColor > Color y <SystemColor >
ColorKey propiedades estáticas de la SystemColors clase para obtener una referencia al color, donde
<SystemColor > es el nombre del color del sistema deseado. Use la <SystemColor > propiedades de ColorKey
cuando desee crear una referencia dinámica que se actualiza automáticamente a medida que cambia el tema del
sistema. En caso contrario, use el <SystemColor > propiedades de Color.
Ejemplo
En el siguiente ejemplo se usan recursos de color del sistema dinámico para crear un degradado.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="Dynamic System Colors Example" Background="White">
<StackPanel Margin="20">
</StackPanel>
</Page>
En el siguiente ejemplo se usan recursos de color del sistema estático para crear un degradado.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="Static System Colors Example" Background="White">
<StackPanel Margin="20">
</StackPanel>
</Page>
Vea también
SystemColors
Pintar un área con un pincel del sistema
Información general sobre el dibujo con colores sólidos y degradados
Dibujos
23/10/2019 • 2 minutes to read • Edit Online
Drawing los objetos se usan para dibujar con eficacia formas, imágenes o texto. Dibujos se utilizan al pintar con un
DrawingBrush o programación con Visual objetos.
En esta sección
Información general sobre objetos Drawing
Temas "Cómo..."
Vea también
Drawing
Imágenes y gráficos 2D
Información general sobre la representación de gráficos en WPF
Información general sobre formas y dibujo básico en WPF
Gráficos y multimedia
Información general sobre objetos Drawing
04/11/2019 • 22 minutes to read • Edit Online
En este tema se presentan Drawing objetos y se describe cómo usarlos para dibujar eficazmente formas,
mapas de bits, texto y elementos multimedia. Utilice Drawing objetos al crear imágenes prediseñadas, pintar
con un DrawingBrusho usar Visual objetos.
GeometryDrawing
//
// Create the Geometry to draw.
//
GeometryGroup ellipses = new GeometryGroup();
ellipses.Children.Add(
new EllipseGeometry(new Point(50,50), 45, 20)
);
ellipses.Children.Add(
new EllipseGeometry(new Point(50, 50), 20, 45)
);
//
// Create a GeometryDrawing.
//
GeometryDrawing aGeometryDrawing = new GeometryDrawing();
aGeometryDrawing.Geometry = ellipses;
Para obtener el ejemplo completo, vea Create a GeometryDrawing (Cómo: Crear un objeto
GeometryDrawing).
Otras clases de Geometry, como PathGeometry permiten crear formas más complejas creando curvas y arcos.
Para obtener más información sobre los objetos de Geometry, consulte la información general sobre
geometría.
Para obtener más información sobre otras formas de dibujar formas que no usan Drawing objetos, vea
información general sobre formas y dibujo básico en WPF.
Para más información sobre las imágenes, Información general sobre imágenes.
Para reproducir un archivo de audio o vídeo, se usa un VideoDrawing y un MediaPlayer. Hay dos maneras de
cargar y reproducir elementos multimedia. La primera es usar una MediaPlayer y una VideoDrawing por sí
misma, y la segunda consiste en crear su propio MediaTimeline para usarlo con los MediaPlayer y
VideoDrawing.
NOTE
Al distribuir elementos multimedia con la aplicación, no puede utilizar un archivo multimedia como recurso del proyecto,
como haría con una imagen. En el archivo de proyecto, debe establecer en su lugar el tipo de elemento multimedia en
Content y establecer CopyToOutputDirectory en PreserveNewest o Always .
Para reproducir archivos multimedia sin crear su propio MediaTimeline, realice los pasos siguientes.
1. Crear un objeto MediaPlayer.
aVideoDrawing.Player = player;
En el ejemplo siguiente se usa un VideoDrawing y un MediaPlayer para reproducir un archivo de vídeo una
vez.
//
// Create a VideoDrawing.
//
MediaPlayer player = new MediaPlayer();
aVideoDrawing.Player = player;
Para obtener un control de tiempo adicional sobre los medios, utilice un MediaTimeline con los objetos
MediaPlayer y VideoDrawing. El MediaTimeline le permite especificar si el vídeo debe repetirse. Para usar un
MediaTimeline con un VideoDrawing, realice los pasos siguientes:
1. Declare el MediaTimeline y establezca sus comportamientos de control de tiempo.
// Create a MediaTimeline.
MediaTimeline mTimeline =
new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
// Create a MediaTimeline.
MediaTimeline mTimeline =
new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
Tenga en cuenta que, cuando se usa un MediaTimeline, se usa la ClockController interactiva devuelta desde la
propiedad Controller del MediaClock para controlar la reproducción multimedia en lugar de los métodos
interactivos de MediaPlayer.
Dibujar texto
Para dibujar texto, se usa un GlyphRunDrawing y un GlyphRun. En el ejemplo siguiente se usa un
GlyphRunDrawing para dibujar el texto "Hola mundo".
);
Un GlyphRun es un objeto de bajo nivel diseñado para su uso con escenarios de impresión y presentación de
documentos de formato fijo. Una manera más sencilla de dibujar texto en la pantalla es usar un Label o un
TextBlock. Para obtener más información acerca de GlyphRun, vea la Introducción al objeto GlyphRun y al
elemento glyphs .
Dibujos compuestos
Un DrawingGroup permite combinar varios dibujos en un solo dibujo compuesto. Mediante el uso de un
DrawingGroup, puede combinar formas, imágenes y texto en un solo Drawing objeto.
En el ejemplo siguiente se usa un DrawingGroup para combinar dos objetos GeometryDrawing y un objeto
ImageDrawing. Este ejemplo produce el siguiente resultado:
Un dibujo compuesto
//
// Create three drawings.
//
GeometryDrawing ellipseDrawing =
new GeometryDrawing(
new SolidColorBrush(Color.FromArgb(102, 181, 243, 20)),
new Pen(Brushes.Black, 4),
new EllipseGeometry(new Point(50,50), 50, 50)
);
ImageDrawing kiwiPictureDrawing =
new ImageDrawing(
new BitmapImage(new Uri(@"sampleImages\kiwi.png", UriKind.Relative)),
new Rect(50,50,100,100));
GeometryDrawing ellipseDrawing2 =
new GeometryDrawing(
new SolidColorBrush(Color.FromArgb(102,181,243,20)),
new Pen(Brushes.Black, 4),
new EllipseGeometry(new Point(150, 150), 50, 50)
);
<DrawingGroup>
<GeometryDrawing Brush="#66B5F314">
<GeometryDrawing.Geometry>
<EllipseGeometry Center="50,50" RadiusX="50" RadiusY="50"/>
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="4" />
</GeometryDrawing.Pen>
</GeometryDrawing>
<ImageDrawing ImageSource="sampleImages\kiwi.png" Rect="50,50,100,100"/>
<GeometryDrawing Brush="#66B5F314">
<GeometryDrawing.Geometry>
<EllipseGeometry Center="150,150" RadiusX="50" RadiusY="50"/>
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="4" />
</GeometryDrawing.Pen>
</GeometryDrawing>
</DrawingGroup>
DrawingImage
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SDKSample
{
public class DrawingImageExample : Page
{
public DrawingImageExample()
{
//
// Create the Geometry to draw.
//
GeometryGroup ellipses = new GeometryGroup();
ellipses.Children.Add(
new EllipseGeometry(new Point(50,50), 45, 20)
);
ellipses.Children.Add(
new EllipseGeometry(new Point(50, 50), 20, 45)
);
//
// Create a GeometryDrawing.
//
GeometryDrawing aGeometryDrawing = new GeometryDrawing();
aGeometryDrawing.Geometry = ellipses;
//
// Use a DrawingImage and an Image control
// to display the drawing.
//
DrawingImage geometryImage = new DrawingImage(aGeometryDrawing);
//
// Place the image inside a border and
// add it to the page.
//
Border exampleBorder = new Border();
exampleBorder.Child = anImage;
exampleBorder.BorderBrush = Brushes.Gray;
exampleBorder.BorderThickness = new Thickness(1);
exampleBorder.HorizontalAlignment = HorizontalAlignment.Left;
exampleBorder.VerticalAlignment = VerticalAlignment.Top;
exampleBorder.Margin = new Thickness(10);
<!-- This image uses a Drawing object for its source. -->
<Image>
<Image.Source>
<DrawingImage PresentationOptions:Freeze="True">
<DrawingImage.Drawing>
<GeometryDrawing>
<GeometryDrawing.Geometry>
<GeometryGroup>
<EllipseGeometry Center="50,50" RadiusX="45" RadiusY="20" />
<EllipseGeometry Center="50,50" RadiusX="20" RadiusY="45" />
</GeometryGroup>
</GeometryDrawing.Geometry>
<GeometryDrawing.Brush>
<LinearGradientBrush>
<GradientStop Offset="0.0" Color="Blue" />
<GradientStop Offset="1.0" Color="#CCCCFF" />
</LinearGradientBrush>
</GeometryDrawing.Brush>
<GeometryDrawing.Pen>
<Pen Thickness="10" Brush="Black" />
</GeometryDrawing.Pen>
</GeometryDrawing>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>
</Border>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SDKSample
{
public class DrawingBrushExample : Page
{
public DrawingBrushExample()
{
//
// Create the Geometry to draw.
//
GeometryGroup ellipses = new GeometryGroup();
ellipses.Children.Add(
new EllipseGeometry(new Point(50,50), 45, 20)
);
ellipses.Children.Add(
new EllipseGeometry(new Point(50, 50), 20, 45)
);
//
// Create a GeometryDrawing.
//
GeometryDrawing aGeometryDrawing = new GeometryDrawing();
aGeometryDrawing.Geometry = ellipses;
//
// Create an object to paint.
//
Rectangle paintedRectangle = new Rectangle();
paintedRectangle.Width = 100;
paintedRectangle.Height = 100;
paintedRectangle.Fill = patternBrush;
//
// Place the image inside a border and
// add it to the page.
//
Border exampleBorder = new Border();
exampleBorder.Child = paintedRectangle;
exampleBorder.BorderBrush = Brushes.Gray;
exampleBorder.BorderThickness = new Thickness(1);
exampleBorder.HorizontalAlignment = HorizontalAlignment.Left;
exampleBorder.VerticalAlignment = VerticalAlignment.Top;
exampleBorder.Margin = new Thickness(10);
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions"
Margin="20" Background="White">
</Rectangle>
</Border>
</Page>
La clase DrawingBrush proporciona una variedad de opciones para ajustar y segmentar su contenido. Para
obtener más información sobre DrawingBrush, consulte la información general sobre el dibujo con imágenes,
dibujos y objetos visuales .
Objetos DrawingContext
La clase DrawingContext le permite rellenar un Visual o un Drawing con contenido visual. Muchos objetos
gráficos de nivel inferior usan una DrawingContext porque describe el contenido gráfico de forma muy eficaz.
Aunque los métodos de DrawingContext Draw parecen similares a los métodos de dibujo del tipo
System.Drawing.Graphics, son realmente diferentes. DrawingContext se usa con un sistema de gráficos de
modo retenido, mientras que el tipo de System.Drawing.Graphics se usa con un sistema de gráficos de modo
inmediato. Cuando se usa el comando Draw de un objeto DrawingContext, en realidad se almacena un
conjunto de instrucciones de representación (aunque el mecanismo de almacenamiento exacto depende del
tipo de objeto que proporciona el DrawingContext) que se utilizará posteriormente en el sistema de gráficos.
no está dibujando en la pantalla en tiempo real. Para obtener más información sobre cómo funciona el sistema
de gráficos de Windows Presentation Foundation (WPF ), consulte información general sobre la representación
de gráficos en WPF.
Nunca se crean instancias de un DrawingContextdirectamente; sin embargo, puede adquirir un contexto de
dibujo de determinados métodos, como DrawingGroup.Open y DrawingVisual.RenderOpen.
Los temas de esta sección describen cómo usar Drawing objetos que se va a dibujar formas, imágenes o texto.
En esta sección
Aplicar un objeto GuidelineSet a un dibujo
Crear un dibujo compuesto
Crear un objeto GeometryDrawing
Dibujar una imagen usando un objeto ImageDrawing
Reproducir elementos multimedia con un objeto VideoDrawing
Usar un dibujo como el origen de una imagen
Vea también
Drawing
Información general sobre la representación de gráficos en WPF
Información general sobre formas y dibujo básico en WPF
Gráficos y multimedia
Procedimiento Aplicar un objeto GuidelineSet a un
dibujo
23/10/2019 • 3 minutes to read • Edit Online
Ejemplo
En el ejemplo siguiente se crean dos DrawingGroup objetos que son casi idénticos; la única diferencia es: el
segundo DrawingGroup tiene un GuidelineSet y no el primero.
En la siguiente ilustración se muestra el resultado del ejemplo. Dado que la representación de las diferencias entre
los dos DrawingGroup objetos es muy sutil, se amplían partes de los dibujos.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SDKSample
{
/// <summary>
/// This example shows how to apply a GuidelineSet to
/// a drawing.
/// </summary>
public class DrawingGroupGuidelineSetExample : Page
{
public DrawingGroupGuidelineSetExample()
{
//
// Create a DrawingGroup
// that has no guideline set
//
//
GeometryDrawing drawing1 = new GeometryDrawing(
Brushes.Black,
null,
new RectangleGeometry(new Rect(0,20,30,80))
);
// Create a DrawingGroup
DrawingGroup drawingGroupWithoutGuidelines = new DrawingGroup();
drawingGroupWithoutGuidelines.Children.Add(drawing1);
drawingGroupWithoutGuidelines.Children.Add(drawing2);
//
// Create another DrawingGroup and apply
// a blur effect to it.
//
//
// Use a DrawingBrush to create a grid background.
//
GeometryDrawing backgroundRectangleDrawing =
new GeometryDrawing(
Brushes.White,
null,
new RectangleGeometry(new Rect(0,0,1,1))
);
PolyLineSegment backgroundLine1 = new PolyLineSegment();
backgroundLine1.Points.Add(new Point(1, 0));
backgroundLine1.Points.Add(new Point(1, 0.1));
backgroundLine1.Points.Add(new Point(0, 0.1));
PathFigure line1Figure = new PathFigure();
line1Figure.Segments.Add(backgroundLine1);
PathGeometry backgroundLine1Geometry = new PathGeometry();
backgroundLine1Geometry.Figures.Add(line1Figure);
GeometryDrawing backgroundLineDrawing1 = new GeometryDrawing(
new SolidColorBrush(Color.FromArgb(255,204,204,255)),
null,
backgroundLine1Geometry
);
PolyLineSegment backgroundLine2 = new PolyLineSegment();
backgroundLine2.Points.Add(new Point(0, 1));
backgroundLine2.Points.Add(new Point(0.1, 1));
backgroundLine2.Points.Add(new Point(0.1, 0));
PathFigure line2Figure = new PathFigure();
line2Figure.Segments.Add(backgroundLine2);
PathGeometry backgroundLine2Geometry = new PathGeometry();
backgroundLine2Geometry.Figures.Add(line2Figure);
GeometryDrawing backgroundLineDrawing2 = new GeometryDrawing(
new SolidColorBrush(Color.FromArgb(255, 204, 204, 255)),
null,
backgroundLine2Geometry
);
//
// Add the items to the page.
//
this.Content = mainBorder;
this.Background = Brushes.White;
}
}
}
}
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions">
<Border BorderThickness="1" BorderBrush="Gray"
HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="20">
<StackPanel Margin="20" Orientation="Horizontal">
<Border.Background>
<DrawingBrush Viewport="0,0,10,10" ViewportUnits="Absolute" TileMode="Tile"
PresentationOptions:Freeze="True">
<DrawingBrush.Drawing>
<DrawingGroup>
<GeometryDrawing Brush="White">
<GeometryDrawing.Geometry>
<RectangleGeometry Rect="0,0,1,1" />
</GeometryDrawing.Geometry>
</GeometryDrawing>
<GeometryDrawing Geometry="M0,0 L1,0 1,0.1, 0,0.1Z " Brush="#CCCCFF" />
<GeometryDrawing Geometry="M0,0 L0,1 0.1,1, 0.1,0Z" Brush="#CCCCFF" />
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</Border.Background>
</Border>
</Page>
Vea también
DrawingGroup
GuidelineSet
Información general sobre objetos Drawing
Procedimiento Crear un dibujo compuesto
23/10/2019 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un DrawingGroup para crear dibujos complejos combinando varias
Drawing objetos en un solo dibujo compuesto.
Ejemplo
En el ejemplo siguiente se usa un DrawingGroup para crear un dibujo compuesto a partir del GeometryDrawing y
ImageDrawing objetos. En la ilustración siguiente se muestra el resultado que genera el ejemplo.
//
// Create three drawings.
//
GeometryDrawing ellipseDrawing =
new GeometryDrawing(
new SolidColorBrush(Color.FromArgb(102, 181, 243, 20)),
new Pen(Brushes.Black, 4),
new EllipseGeometry(new Point(50,50), 50, 50)
);
ImageDrawing kiwiPictureDrawing =
new ImageDrawing(
new BitmapImage(new Uri(@"sampleImages\kiwi.png", UriKind.Relative)),
new Rect(50,50,100,100));
GeometryDrawing ellipseDrawing2 =
new GeometryDrawing(
new SolidColorBrush(Color.FromArgb(102,181,243,20)),
new Pen(Brushes.Black, 4),
new EllipseGeometry(new Point(150, 150), 50, 50)
);
<GeometryDrawing Brush="#66B5F314">
<GeometryDrawing.Geometry>
<EllipseGeometry Center="50,50" RadiusX="50" RadiusY="50"/>
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="4" />
</GeometryDrawing.Pen>
</GeometryDrawing>
<ImageDrawing ImageSource="sampleImages\kiwi.png" Rect="50,50,100,100"/>
<GeometryDrawing Brush="#66B5F314">
<GeometryDrawing.Geometry>
<EllipseGeometry Center="150,150" RadiusX="50" RadiusY="50"/>
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="4" />
</GeometryDrawing.Pen>
</GeometryDrawing>
</DrawingGroup>
Puede usar un DrawingGroup para aplicar un Transform, Opacity establecer, OpacityMask, BitmapEffect,
ClipGeometry, o GuidelineSet a la contiene los dibujos. Dado que un DrawingGroup es también un Drawing,
pueden contener otros DrawingGroup objetos.
El ejemplo siguiente es similar al ejemplo anterior, salvo que usa adicionales DrawingGroup objetos que se va a
aplicar efectos de imagen y una máscara de opacidad a algunos de sus planos. En la ilustración siguiente se
muestra el resultado que genera el ejemplo.
// Create a DrawingGroup.
DrawingGroup mainGroup = new DrawingGroup();
//
// Create a GeometryDrawing
//
GeometryDrawing ellipseDrawing =
new GeometryDrawing(
new SolidColorBrush(Color.FromArgb(102, 181, 243, 20)),
new Pen(Brushes.Black, 4),
new EllipseGeometry(new Point(50, 50), 50, 50)
);
//
// Use a DrawingGroup to apply a blur
// bitmap effect to the drawing.
//
DrawingGroup blurGroup = new DrawingGroup();
blurGroup.Children.Add(ellipseDrawing);
blurGroup.Children.Add(ellipseDrawing);
BlurBitmapEffect blurEffect = new BlurBitmapEffect();
blurEffect.Radius = 5;
blurGroup.BitmapEffect = blurEffect;
//
// Create an ImageDrawing.
//
ImageDrawing kiwiPictureDrawing =
new ImageDrawing(
new BitmapImage(new Uri(@"sampleImages\kiwi.png", UriKind.Relative)),
new Rect(50, 50, 100, 100));
//
// Use a DrawingGroup to apply an opacity mask
// and a bevel.
//
DrawingGroup maskedAndBeveledGroup = new DrawingGroup();
maskedAndBeveledGroup.Children.Add(kiwiPictureDrawing);
// Apply a bevel.
maskedAndBeveledGroup.BitmapEffect = new BevelBitmapEffect();
//
// Create another GeometryDrawing.
//
GeometryDrawing ellipseDrawing2 =
new GeometryDrawing(
new SolidColorBrush(Color.FromArgb(102, 181, 243, 20)),
new Pen(Brushes.Black, 4),
new EllipseGeometry(new Point(150, 150), 50, 50)
);
<DrawingGroup>
<GeometryDrawing Brush="#66B5F314">
<GeometryDrawing.Geometry>
<EllipseGeometry Center="50,50" RadiusX="50" RadiusY="50"/>
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="4" />
</GeometryDrawing.Pen>
</GeometryDrawing>
<DrawingGroup.BitmapEffect>
<BlurBitmapEffect Radius="5" />
</DrawingGroup.BitmapEffect>
</DrawingGroup>
<DrawingGroup>
<ImageDrawing ImageSource="sampleImages\kiwi.png" Rect="50,50,100,100"/>
<DrawingGroup.BitmapEffect>
<BevelBitmapEffect />
</DrawingGroup.BitmapEffect>
<DrawingGroup.OpacityMask>
<RadialGradientBrush>
<GradientStop Offset="0.55" Color="#00000000" />
<GradientStop Offset="0.65" Color="#FF000000" />
<GradientStop Offset="0.75" Color="#00000000" />
<GradientStop Offset="0.80" Color="#FF000000" />
<GradientStop Offset="0.90" Color="#00000000" />
<GradientStop Offset="1.0" Color="#FF000000" />
</RadialGradientBrush>
</DrawingGroup.OpacityMask>
</DrawingGroup>
<GeometryDrawing Brush="#66B5F314">
<GeometryDrawing.Geometry>
<EllipseGeometry Center="150,150" RadiusX="50" RadiusY="50"/>
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="4" />
</GeometryDrawing.Pen>
</GeometryDrawing>
</DrawingGroup>
Para obtener más información acerca de Drawing objetos, vea información general sobre objetos de dibujo.
Vea también
BitmapEffect
Transform
OpacityMask
Opacity
ClipGeometry
GuidelineSet
Información general sobre objetos Drawing
Procedimiento Crear un objeto GeometryDrawing
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo crear y mostrar un GeometryDrawing. Un GeometryDrawing le permite crear
de forma con un relleno y el contorno asociando un Pen y un Brush con un Geometry. El Geometry describe la
estructura de la forma, el Brush describe el relleno de la forma y el Pen describe el contorno de la forma.
Ejemplo
En el ejemplo siguiente se usa un GeometryDrawing para representar una forma. Se describe la forma mediante
una GeometryGroup y dos EllipseGeometry objetos. Se pinta el interior de la forma con un LinearGradientBrush y
el contorno se dibuja con un Black Pen. El GeometryDrawing se muestra mediante un ImageDrawing y un Image
elemento.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SDKSample
{
public class GeometryDrawingExample : Page
{
public GeometryDrawingExample()
{
//
// Create the Geometry to draw.
//
GeometryGroup ellipses = new GeometryGroup();
ellipses.Children.Add(
new EllipseGeometry(new Point(50,50), 45, 20)
);
ellipses.Children.Add(
new EllipseGeometry(new Point(50, 50), 20, 45)
);
//
// Create a GeometryDrawing.
//
GeometryDrawing aGeometryDrawing = new GeometryDrawing();
aGeometryDrawing.Geometry = ellipses;
//
// Use a DrawingImage and an Image control
// to display the drawing.
//
//
DrawingImage geometryImage = new DrawingImage(aGeometryDrawing);
//
// Place the image inside a border and
// add it to the page.
//
Border exampleBorder = new Border();
exampleBorder.Child = anImage;
exampleBorder.BorderBrush = Brushes.Gray;
exampleBorder.BorderThickness = new Thickness(1);
exampleBorder.HorizontalAlignment = HorizontalAlignment.Left;
exampleBorder.VerticalAlignment = VerticalAlignment.Top;
exampleBorder.Margin = new Thickness(10);
<GeometryDrawing>
<GeometryDrawing.Geometry>
</Page>
Para crear dibujos más complejos, puede combinar varios objetos de dibujo en un elemento compuesto de dibujo
utilizando un DrawingGroup.
Vea también
DrawingGroup
Información general sobre objetos Drawing
Información general sobre geometría
Crear un dibujo compuesto
Procedimiento Dibujar una imagen mediante un
objeto ImageDrawing
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un ImageDrawing para dibujar una imagen. Un ImageDrawing permite
mostrar un ImageSource con un DrawingBrush, DrawingImage, o Visual. Para dibujar una imagen, se crea un
ImageDrawing y establezca su ImageDrawing.ImageSource y ImageDrawing.Rect propiedades. El
ImageDrawing.ImageSource propiedad especifica la imagen para dibujar y la ImageDrawing.Rect propiedad
especifica la posición y tamaño de cada imagen.
Ejemplo
En el ejemplo siguiente se crea un dibujo compuesto mediante cuatro ImageDrawing objetos. Este ejemplo genera
la siguiente imagen:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Media.Imaging;
namespace SDKSample
{
public class ImageDrawingExample : Page
{
public ImageDrawingExample()
{
// Create a DrawingGroup to combine the ImageDrawing objects.
DrawingGroup imageDrawings = new DrawingGroup();
imageDrawings.Children.Add(bigKiwi);
//
// Use a DrawingImage and an Image control to
// display the drawings.
//
DrawingImage drawingImageSource = new DrawingImage(imageDrawings);
this.Background = Brushes.White;
this.Margin = new Thickness(20);
this.Content = imageBorder;
}
}
}
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions"
Background="White" Margin="20">
<Border BorderBrush="Gray" BorderThickness="1"
HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="20">
<Image Stretch="None">
<Image.Source>
<DrawingImage PresentationOptions:Freeze="True">
<DrawingImage.Drawing>
<DrawingGroup>
<!-- The Rect property specifies that the image only fill a 100 by 100
rectangular area. -->
<ImageDrawing Rect="75,75,100,100" ImageSource="sampleImages\kiwi.png"/>
</DrawingGroup>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>
</Border>
</Page>
Para obtener un ejemplo que muestra una manera sencilla de mostrar una imagen sin utilizar ImageDrawing,
consulte usar el elemento de imagen.
Vea también
Freeze
Image
Información general sobre objetos Drawing
Información general sobre objetos Freezable
PresentationOptions:Freeze (Atributo)
Procedimiento Reproducir elementos multimedia con
un objeto VideoDrawing
23/10/2019 • 2 minutes to read • Edit Online
Para reproducir un archivo de audio o vídeo, use VideoDrawing MediaPlayery. Hay dos maneras de cargar y
reproducir elementos multimedia. La MediaPlayer primera es usar una y una VideoDrawing por sí MediaPlayer
misma, y la segunda consiste en crear la suya propia MediaTimeline para usarla con y VideoDrawing.
NOTE
Al distribuir elementos multimedia con la aplicación, no puede utilizar un archivo multimedia como recurso del proyecto,
como haría con una imagen. En el archivo de proyecto, debe establecer en su lugar el tipo de elemento multimedia en
Content y establecer CopyToOutputDirectory en PreserveNewest o Always .
Ejemplo
En el ejemplo siguiente se VideoDrawing usa un MediaPlayer y un para reproducir un archivo de vídeo una vez.
//
// Create a VideoDrawing.
//
MediaPlayer player = new MediaPlayer();
aVideoDrawing.Player = player;
Para obtener un MediaTimeline control de tiempo adicional sobre los medios, utilice con MediaPlayer los
VideoDrawing objetos y. MediaTimeline Permite especificar si el vídeo debe repetirse.
Ejemplo
En el ejemplo siguiente se MediaTimeline usa con MediaPlayer los VideoDrawing objetos y para reproducir un
vídeo repetidamente.
//
// Create a VideoDrawing that repeats.
//
// Create a MediaTimeline.
MediaTimeline mTimeline =
new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
Tenga MediaClock en cuenta que, cuando se MediaTimelineusa un, se usa ClockController la interactiva Controller
devuelta desde la propiedad de para controlar la reproducción multimedia en lugar de MediaPlayerlos métodos
interactivos de.
Vea también
VideoDrawing
Información general sobre objetos Drawing
Procedimiento Usar un dibujo como el origen de una
imagen
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un Drawing como el Source para un Image control. Para mostrar un
Drawing con un Image controlar, use un DrawingImage como el Image del control Source y establezca el
DrawingImage del objeto DrawingImage.Drawing propiedad para el dibujo que desea mostrar.
Ejemplo
En el ejemplo siguiente se usa un DrawingImage y un Image control para mostrar un GeometryDrawing. Este
ejemplo produce el siguiente resultado:
DrawingImage
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SDKSample
{
public class DrawingImageExample : Page
{
public DrawingImageExample()
{
//
// Create the Geometry to draw.
//
GeometryGroup ellipses = new GeometryGroup();
ellipses.Children.Add(
new EllipseGeometry(new Point(50,50), 45, 20)
);
ellipses.Children.Add(
new EllipseGeometry(new Point(50, 50), 20, 45)
);
//
// Create a GeometryDrawing.
//
GeometryDrawing aGeometryDrawing = new GeometryDrawing();
aGeometryDrawing.Geometry = ellipses;
//
// Use a DrawingImage and an Image control
// to display the drawing.
//
DrawingImage geometryImage = new DrawingImage(aGeometryDrawing);
//
// Place the image inside a border and
// add it to the page.
//
Border exampleBorder = new Border();
exampleBorder.Child = anImage;
exampleBorder.BorderBrush = Brushes.Gray;
exampleBorder.BorderThickness = new Thickness(1);
exampleBorder.HorizontalAlignment = HorizontalAlignment.Left;
exampleBorder.VerticalAlignment = VerticalAlignment.Top;
exampleBorder.Margin = new Thickness(10);
<!-- This image uses a Drawing object for its source. -->
<Image>
<Image.Source>
<DrawingImage PresentationOptions:Freeze="True">
<DrawingImage.Drawing>
<GeometryDrawing>
<GeometryDrawing.Geometry>
<GeometryGroup>
<EllipseGeometry Center="50,50" RadiusX="45" RadiusY="20" />
<EllipseGeometry Center="50,50" RadiusX="20" RadiusY="45" />
</GeometryGroup>
</GeometryDrawing.Geometry>
<GeometryDrawing.Brush>
<LinearGradientBrush>
<GradientStop Offset="0.0" Color="Blue" />
<GradientStop Offset="1.0" Color="#CCCCFF" />
</LinearGradientBrush>
</GeometryDrawing.Brush>
<GeometryDrawing.Pen>
<Pen Thickness="10" Brush="Black" />
</GeometryDrawing.Pen>
</GeometryDrawing>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>
</Border>
</Page>
Vea también
Freeze
Dibujar una imagen usando un objeto ImageDrawing
Información general sobre objetos Drawing
Información general sobre objetos Freezable
PresentationOptions:Freeze (Atributo)
Geometrías
23/10/2019 • 2 minutes to read • Edit Online
Geometry es una clase versátil, que se utiliza para representar gráficos 2D, objetos de la prueba de
posicionamiento y definir regiones de recorte
En esta sección
Sintaxis de marcado de trazados
Información general sobre geometría
Temas "Cómo..."
Vea también
Brushes
Shape
Imágenes y gráficos 2D
Información general sobre formas y dibujo básico en WPF
Gráficos y multimedia
Sintaxis de marcado de trazados
23/10/2019 • 16 minutes to read • Edit Online
Las rutas de acceso se tratan en formas y dibujo básico en WPF Overview y información general sobre
geometría, sin embargo, este tema describe en detalle el eficaz y complejo minilenguaje puede usar para
especificar la ruta de acceso geometrías de manera más compacta con Lenguaje XAML (Extensible Application
Markup Language).
Requisitos previos
Para entender este tema, debe estar familiarizado con las características básicas de Geometry objetos. Para
obtener más información, consulte el información general sobre geometría.
Como puede ver en los ejemplos anteriores, los dos minilenguajes son muy similares. ¿Siempre es posible usar
un PathGeometry en cualquier situación donde podría usar un StreamGeometry; por lo que debe cuál usar?
Usar un StreamGeometry cuando no es necesario modificar la ruta de acceso después de crearla; utilice un
PathGeometry si tiene que modificar la ruta de acceso.
Para obtener más información sobre las diferencias entre PathGeometry y StreamGeometry objetos, vea el
información general sobre geometría.
Nota sobre los espacios en blanco
Por razones de brevedad, se muestra un solo espacio en las secciones de sintaxis siguientes, pero también se
aceptan varios espacios cada vez que se muestra uno solo.
Dos números realmente no tienen que estar separados por comas o espacios en blanco, pero esto solo se puede
hacer cuando la cadena resultante no es ambigua. Por ejemplo, 2..3 es realmente de dos números: "2." y ".3".
De forma similar, 2-3 es "2" y "-3". Tampoco se necesitan espacios antes o después de los comandos.
Sintaxis
El Lenguaje XAML (Extensible Application Markup Language) atributo sintaxis de uso para un StreamGeometry
se compone de un elemento opcional FillRule valor y uno o más descripciones de figura.
< object property =" [ fillRule ] figureDescription [ figureDescription ]* " ... />
El Lenguaje XAML (Extensible Application Markup Language) atributo sintaxis de uso para un
PathFigureCollection se compone de uno o más descripciones de figura.
TÉRMINO DESCRIPCIÓN
fillRule System.Windows.Media.FillRule
Comando de movimiento
Especificar el punto inicial de una figura nueva.
SINTAXIS
M startPoint
o bien
m startPoint
TÉRMINO DESCRIPCIÓN
startPoint System.Windows.Point
En mayúscula M indica que startPoint es un valor absoluto; una minúscula m indica que startPoint es un
desplazamiento hasta el punto anterior, o bien (0,0) si no existe ninguno. Si enumera varios puntos después del
comando de movimiento, se dibuja una línea a esos puntos si especificó el comando de línea.
Comandos de dibujo
Un comando de dibujo puede constar de varios comandos de forma. Están disponibles los siguientes comandos
de forma: línea, línea horizontal, línea vertical, curva Bézier cúbica, curva Bézier cuadrática, curva Bézier cúbica
suavizada, curva Bézier cuadrática suavizada y arco elíptico.
Puede escribir cada comando con una letra mayúscula o una minúscula, donde las letras mayúsculas indican
valores absolutos y las minúsculas, valores relativos: los puntos de control de ese segmento son relativos al
punto final del ejemplo anterior. Cuando escriba secuencialmente más de un comando del mismo tipo, puede
omitir la entrada de comando duplicada; Por ejemplo, L 100,200 300,400 es equivalente a L 100,200 L 300,400 .
La tabla siguiente se describen los mover y dibujar comandos.
Comando de línea
Crea una línea recta entre el punto actual y el punto final especificado. l 20 30 y L 20,30 son ejemplos de
línea comandos.
SINTAXIS
L endPoint
o bien
l endPoint
TÉRMINO DESCRIPCIÓN
endPoint System.Windows.Point
En mayúscula L indica que endPoint es un valor absoluto; una minúscula l indica que endPoint es un
desplazamiento hasta el punto anterior, o bien (0,0) si no existe ninguno.
Comando de línea horizontal
Crea una línea horizontal entre el punto actual y la coordenada x especificada. H 90 es un ejemplo de un
comando de línea horizontal válido.
SINTAXIS
H x
o bien
h x
TÉRMINO DESCRIPCIÓN
x System.Double
En mayúscula H indica que x es un valor absoluto; una minúscula h indica que x es un desplazamiento
hasta el punto anterior, o bien (0,0) si no existe ninguno.
Comando de línea vertical
Crea una línea vertical entre el punto actual y la coordenada y especificada. v 90 es un ejemplo de comando de
línea vertical válido.
SINTAXIS
V y
o bien
v y
TÉRMINO DESCRIPCIÓN
y System.Double
En mayúscula V indica que y es un valor absoluto; una minúscula v indica que y es un desplazamiento
hasta el punto anterior, o bien (0,0) si no existe ninguno.
Comando de curva Bézier cúbica
Crea una curva Bézier cúbica entre el punto actual y el punto final especificado mediante el uso de los dos
puntos de control especificado ( controlPoint 1 y controlPoint 2). C 100,200 200,400 300,200 es un ejemplo de
un comando de curva válido.
SINTAXIS
o bien
TÉRMINO DESCRIPCIÓN
controlPoint 1 System.Windows.Point
controlPoint 2 System.Windows.Point
endPoint System.Windows.Point
SINTAXIS
Q controlPoint endPoint
o bien
q controlPoint endPoint
TÉRMINO DESCRIPCIÓN
controlPoint System.Windows.Point
endPoint System.Windows.Point
SINTAXIS
S controlPoint 2 endPoint
o bien
s controlPoint 2 endPoint
TÉRMINO DESCRIPCIÓN
controlPoint 2 System.Windows.Point
endPoint System.Windows.Point
SINTAXIS
T controlPoint endPoint
o bien
t controlPoint endPoint
TÉRMINO DESCRIPCIÓN
controlPoint System.Windows.Point
endPoint System.Windows.Point
SINTAXIS
o bien
TÉRMINO DESCRIPCIÓN
size System.Windows.Size
rotationAngle System.Double
endPoint System.Windows.Point
Comando de cierre
Finaliza la figura actual y crea una línea que conecta el punto actual con el punto inicial de la figura. Este
comando crea una unión de líneas (esquina) entre el último y el primer segmento de la figura.
SINTAXIS
o bien
Sintaxis de punto
Describe las coordenadas x e y de un punto donde (0,0) es la esquina superior izquierda.
SINTAXIS
x , y
o bien
x y
TÉRMINO DESCRIPCIÓN
x System.Double
y System.Double
Valores especiales
En lugar de un valor numérico estándar, también puede usar los valores especiales siguientes. Estos valores
distinguen mayúsculas de minúsculas.
Infinito
Representa Double.PositiveInfinity.
-Infinity
Representa Double.NegativeInfinity.
NaN
Representa Double.NaN.
También puede usar la notación científica. Por ejemplo, +1.e17 es un valor válido.
Vea también
Path
StreamGeometry
PathGeometry
PathFigureCollection
Información general sobre formas y dibujo básico en WPF
Información general sobre geometría
Temas "Cómo..."
Información general sobre geometría
04/11/2019 • 24 minutes to read • Edit Online
En esta información general se describe cómo usar las clases de Geometry de Windows Presentation
Foundation (WPF ) para describir las formas. En este tema también se contrastan las diferencias entre
Geometry objetos y elementos de Shape.
DoubleAnimationUsingPath PathGeometry
DrawingGroup ClipGeometry
GeometryDrawing Geometry
Path Data
UIElement Clip
En el ejemplo siguiente se muestra cómo usar un EllipseGeometry como la región de recorte de una imagen.
Un objeto de Image se define con un Width de 200 y un Height de 150. Un EllipseGeometry con un valor de
RadiusX de 100, un valor de RadiusY de 75 y un valor de Center de 100, 75 se establece en la propiedad
Clip de la imagen. Solo se mostrará la parte de la imagen que queda dentro del área de la elipse. En la
siguiente ilustración se muestra el resultado del ejemplo.
Objeto EllipseGeometry usado para recortar un control Image
<Image
Source="sampleImages\Waterlilies.jpg"
Width="200" Height="150" HorizontalAlignment="Left">
<Image.Clip>
<EllipseGeometry
RadiusX="100"
RadiusY="75"
Center="100,75"/>
</Image.Clip>
</Image>
Geometrías de trazado
La clase PathGeometry y su equivalente ligero, la clase StreamGeometry, proporcionan los medios para
describir varias figuras complejas que se componen de arcos, curvas y líneas.
En el corazón de un PathGeometry se trata de una colección de objetos PathFigure, de modo que cada figura
describe una forma discreta en el PathGeometry. Cada PathFigure se compone de uno o varios objetos
PathSegment, cada uno de los cuales describe un segmento de la figura.
Hay muchos tipos de segmentos.
BezierSegment Crea una curva Bézier cúbica entre Crear una curva Bézier cúbica.
dos puntos.
LineSegment Crea una línea entre dos puntos. Crear un LineSegment en una clase
PathGeometry
QuadraticBezierSegment Crea una curva Bézier cuadrática. Crear una curva Bézier cuadrática.
Los segmentos de un PathFigure se combinan en una sola forma geométrica con el punto final de cada
segmento que es el punto inicial del segmento siguiente. La propiedad StartPoint de una PathFigure
especifica el punto desde el que se dibuja el primer segmento. Cada segmento posterior comienza en el
punto final del segmento anterior. Por ejemplo, se puede definir una línea vertical de 10,50 a 10,150
estableciendo la propiedad StartPoint en 10,50 y creando un LineSegment con un valor de propiedad Point
de 10,150 .
En el ejemplo siguiente se crea un PathGeometry simple que consta de un PathFigure único con un
LineSegment y se muestra mediante un elemento de Path. El StartPoint del objeto de PathFigure se
establece en 10,20 y se define un LineSegment con un punto final de 100,130 . En la ilustración siguiente se
muestra el PathGeometry creado en este ejemplo.
Merece la pena comparar este ejemplo con el ejemplo anterior LineGeometry. La sintaxis usada para una
PathGeometry es mucho más detallada que la que se usa para un LineGeometrysimple y puede tener más
sentido usar la clase LineGeometry en este caso, pero la sintaxis detallada de la PathGeometry permite
regiones geométricas muy intrincadas y complejas.
Se pueden crear geometrías más complejas mediante una combinación de objetos de PathSegment.
En el ejemplo siguiente se usa un BezierSegment, un LineSegmenty un ArcSegment para crear la forma. En
primer lugar, el ejemplo crea una curva Bézier cúbica definiendo cuatro puntos: un punto inicial, que es el
punto final del segmento anterior, un punto final (Point3) y dos puntos de control (Point1 y Point2). Los dos
puntos de control de una curva Bézier cúbica se comportan como imanes, atraen hacia ellos partes de lo que
de otra manera sería una línea recta y generan una curva. El primer punto de control, Point1, afecta a la
parte inicial de la curva. el segundo punto de control, Point2, afecta a la parte final de la curva.
A continuación, en el ejemplo se agrega un LineSegment, que se dibuja entre el punto final del
BezierSegment anterior que lo precede al punto especificado por su propiedad LineSegment.
A continuación, en el ejemplo se agrega un ArcSegment, que se dibuja desde el punto final de la
LineSegment anterior hasta el punto especificado por su propiedad Point. En el ejemplo también se
especifica el radio x-e y (Size) del arco, un ángulo de giro (RotationAngle), un marcador que indica el tamaño
del ángulo del arco resultante (IsLargeArc) y un valor que indica en qué dirección se dibuja el arco
(SweepDirection). En la ilustración siguiente se muestra cómo se representa este ejemplo.
PathGeometry
<Path Stroke="Black" StrokeThickness="1" >
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigure StartPoint="10,50">
<PathFigure.Segments>
<BezierSegment
Point1="100,0"
Point2="200,200"
Point3="300,100"/>
<LineSegment Point="400,100" />
<ArcSegment
Size="50,50" RotationAngle="45"
IsLargeArc="True" SweepDirection="Clockwise"
Point="200,100"/>
</PathFigure.Segments>
</PathFigure>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
// Create a figure.
PathFigure myPathFigure = new PathFigure();
myPathFigure.StartPoint = new Point(10,50);
myPathFigure.Segments.Add(
new BezierSegment(
new Point(100,0),
new Point(200,200),
new Point(300,100),
true /* IsStroked */ ));
myPathFigure.Segments.Add(
new LineSegment(
new Point(400,100),
true /* IsStroked */ ));
myPathFigure.Segments.Add(
new ArcSegment(
new Point(200,100),
new Size(50,50),
45,
true, /* IsLargeArc */
SweepDirection.Clockwise,
true /* IsStroked */ ));
Se pueden crear geometrías incluso más complejas mediante el uso de varios objetos PathFigure dentro de
un PathGeometry.
En el ejemplo siguiente se crea un PathGeometry con dos objetos PathFigure, cada uno de los cuales
contiene varios objetos PathSegment. Se utiliza el PathFigure del ejemplo anterior y un PathFigure con un
PolyLineSegment y un QuadraticBezierSegment. Un PolyLineSegment se define con una matriz de puntos y
el QuadraticBezierSegment se define con un punto de control y un punto final. En la ilustración siguiente se
muestra cómo se representa este ejemplo.
<PathFigure StartPoint="10,100">
<PathFigure.Segments>
<PolyLineSegment Points="50,100 50,150" />
<QuadraticBezierSegment Point1="200,200" Point2="300,100"/>
</PathFigure.Segments>
</PathFigure>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
PathGeometry myPathGeometry = new PathGeometry();
// Create a figure.
PathFigure pathFigure1 = new PathFigure();
pathFigure1.StartPoint = new Point(10,50);
pathFigure1.Segments.Add(
new BezierSegment(
new Point(100,0),
new Point(200,200),
new Point(300,100),
true /* IsStroked */ ));
pathFigure1.Segments.Add(
new LineSegment(
new Point(400,100),
true /* IsStroked */ ));
pathFigure1.Segments.Add(
new ArcSegment(
new Point(200,100),
new Size(50,50),
45,
true, /* IsLargeArc */
SweepDirection.Clockwise,
true /* IsStroked */ ));
myPathGeometry.Figures.Add(pathFigure1);
StreamGeometry
Al igual que la clase PathGeometry, un StreamGeometry define una forma geométrica compleja que puede
contener curvas, arcos y líneas. A diferencia de un PathGeometry, el contenido de un StreamGeometry no
admite enlaces de datos, animaciones ni modificaciones. Use una StreamGeometry cuando necesite describir
una geometría compleja pero no desee la sobrecarga que supone la compatibilidad con el enlace de datos, la
animación o la modificación. Debido a su eficacia, la clase StreamGeometry es una buena opción para
describir los adornos.
Para obtener un ejemplo, vea Create a Shape Using a StreamGeometry (Cómo: Crear una forma con un
objeto StreamGeometry).
Sintaxis de marcado de trazados
Los tipos PathGeometry y StreamGeometry admiten una sintaxis de atributo Lenguaje XAML (Extensible
Application Markup Language) mediante una serie especial de comandos de movimiento y dibujo. Para más
información, consulte Sintaxis de marcado de trazados.
Geometrías compuestas
Los objetos de geometría compuestos se pueden crear mediante un GeometryGroup, un
CombinedGeometryo llamando al método estático Geometry Combine.
El objeto CombinedGeometry y el método Combine realiza una operación booleana para combinar el
área definida por dos geometrías. Geometry los objetos que no tienen área se descartan. Solo se
pueden combinar dos objetos Geometry (aunque estas dos geometrías también pueden ser
geometrías compuestas).
La clase GeometryGroup crea una fusión de los objetos Geometry que contiene sin combinar su área.
Se puede agregar cualquier número de objetos Geometry a un GeometryGroup. Para obtener un
ejemplo, vea Create a Composite Shape (Cómo: Crear una forma compuesta).
Dado que no realizan una operación de combinación, el uso de objetos de GeometryGroup proporciona
ventajas de rendimiento sobre el uso de objetos de CombinedGeometry o el método Combine.
Geometrías combinadas
En la sección anterior se menciona el objeto CombinedGeometry y el método Combine combinan el área
definida por las geometrías que contienen. La enumeración GeometryCombineMode especifica cómo se
combinan las geometrías. Los valores posibles para la propiedad GeometryCombineMode son: Union,
Intersect, Excludey Xor.
En el ejemplo siguiente, se define un CombinedGeometry con un modo de combinación de Union. Tanto
Geometry1 como la Geometry2 se definen como círculos del mismo radio, pero con el desplazamiento de
los centros por 50.
<!-- Combines two geometries using the union combine mode. -->
<CombinedGeometry GeometryCombineMode="Union">
<CombinedGeometry.Geometry1>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="75,75" />
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="125,75" />
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
<!-- Combines two geometries using the XOR combine mode. -->
<CombinedGeometry GeometryCombineMode="Xor">
<CombinedGeometry.Geometry1>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="75,75" />
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="125,75" />
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
Para obtener otros ejemplos, vea Create a Composite Shape (Cómo: Crear una forma compuesta) y Create a
Combined Geometry (Cómo: Crear una geometría combinada).
Vea también
Geometry
PathGeometry
Path
GeometryDrawing
Imágenes y gráficos 2D
Sintaxis de marcado de trazados
Temas "Cómo..."
Información general sobre animaciones
Información general sobre formas y dibujo básico en WPF
Información general sobre objetos Drawing
Temas "Cómo..." de objetos de geometría
23/10/2019 • 2 minutes to read • Edit Online
Los temas de esta sección muestran cómo usar Geometry objetos en sus aplicaciones.
En esta sección
Animar un EllipseGeometry
Animar el tamaño de un objeto ArcSegment
Controlar el relleno de una forma compuesta
Crear una geometría combinada
Crear una forma compuesta
Crear una curva Bézier cúbica
Crear una línea mediante la clase LineGeometry
Crear un LineSegment en una clase PathGeometry
Crear una forma mediante una clase PathGeometry
Crear una forma utilizando StreamGeometry
Crear una curva Bézier cuadrática
Crear un arco elíptico
Crear varios subtrazados en un PathGeometry
Definir un rectángulo usando una clase RectangleGeometry
Redondear las esquinas de un RectangleGeometry
Vea también
Brushes
Shape
Información general sobre formas y dibujo básico en WPF
Gráficos y multimedia
Procedimiento Animar un objeto EllipseGeometry
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo animar una Geometry dentro de un Path elemento. En el ejemplo siguiente, un
PointAnimation sirve para animar la Center de un EllipseGeometry.
Ejemplo
<!-- EllipseGeometryExample.xaml
This example shows how to animate an EllipseGeometry. -->
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="EllipseGeometry Animation Example">
<Canvas Height="400" Width="400" Margin="20">
<Path Name="myPathShape"
Fill="Blue" Stroke="Black" StrokeThickness="5">
<Path.Data>
<EllipseGeometry x:Name="MyEllipseGeometry"
Center="200,200" RadiusX="25" RadiusY="50" />
</Path.Data>
<Path.Triggers>
// EllipseGeometryExample.cs
//
// This sample demonstrates how to animate the center
// position of an EllipseGeometry using a PointAnimation.
using System;
using System.Windows;
using System.Windows.Navigation;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Controls;
namespace Microsoft.Samples.Animation.AnimatePathShapeSample
{
// Create an EllipseGeometry.
System.Windows.Media.EllipseGeometry myEllipseGeometry =
new System.Windows.Media.EllipseGeometry();
myEllipseGeometry.Center = new System.Windows.Point(200, 200);
myEllipseGeometry.RadiusX = 25;
myEllipseGeometry.RadiusY = 50;
Storyboard.SetTargetName(myPointAnimation, "MyEllipseGeometry");
Storyboard.SetTargetProperty(myPointAnimation,
new PropertyPath(EllipseGeometry.CenterProperty));
Storyboard myStoryboard = new Storyboard();
myStoryboard.Children.Add(myPointAnimation);
' EllipseGeometryExample.cs
'
' This sample demonstrates how to animate the center
' position of an EllipseGeometry using a PointAnimation.
Imports System.Windows
Imports System.Windows.Navigation
Imports System.Windows.Navigation
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Imports System.Windows.Controls
Namespace Microsoft.Samples.Animation.AnimatePathShapeSample
Storyboard.SetTargetName(myPointAnimation, "MyEllipseGeometry")
Storyboard.SetTargetProperty(myPointAnimation, _
new PropertyPath(EllipseGeometry.CenterProperty))
myStoryboard = New Storyboard()
myStoryboard.Children.Add(myPointAnimation)
End Sub
myStoryboard.Begin(myPath)
End Sub
End Class
End Namespace
Vea también
Información general sobre animaciones
Información general sobre geometría
Cómo: Animar el tamaño de un objeto ArcSegment
20/02/2020 • 3 minutes to read • Edit Online
Ejemplo
En el ejemplo siguiente se crea una ArcSegment que anima su Size cuando se carga en la pantalla.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Media;
namespace SDKSamples
{
public class SizeAnimationExample : Page
{
public SizeAnimationExample()
{
// Set the starting point for the PathFigure specifying that the
// geometry starts at point 100,200.
myPathFigure.StartPoint = new Point(100, 200);
myPathFigure.Segments = myPathSegmentCollection;
Content = containerCanvas;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Imports System.Windows.Media
Namespace SDKSamples
Public Class SizeAnimationExample
Inherits Page
Public Sub New()
' Set the starting point for the PathFigure specifying that the
' geometry starts at point 100,200.
myPathFigure.StartPoint = New Point(100, 200)
myPathFigure.Segments = myPathSegmentCollection
' specify the shape of the path using the path geometry.
.Data = myPathGeometry
End With
Content = containerCanvas
End Sub
End Class
End Namespace
Consulte también
Size
ArcSegment
Información general sobre animaciones
Información general sobre geometría
Temas de procedimientos de las geometrías
Temas de procedimientos de animación y control de tiempo
Procedimiento Controlar el relleno de una forma
compuesta
23/10/2019 • 7 minutes to read • Edit Online
La FillRule propiedad GeometryGroup de oPathGeometry, especifica una "regla" que la forma compuesta utiliza
para determinar si un punto determinado forma parte de la geometría. Existen dos valores posibles para FillRule:
EvenOdd y Nonzero. En las secciones siguientes se describe cómo usar estas dos reglas.
EvenOdd: Esta regla determina si un punto está en la región de relleno dibujando un rayo desde ese punto hasta
el infinito en cualquier dirección y contando el número de segmentos de trazado dentro de la forma especificada
que cruza el rayo. Si este número es impar, el punto está dentro; si es par, el punto está fuera.
Por ejemplo, el código XAML siguiente crea una forma compuesta formada por una serie de anillos concéntricos
(destino) FillRule con un EvenOddestablecido en.
En la ilustración anterior, observe que no se rellenan el centro y el tercer anillo. Esto se debe a que un radio
dibujado desde cualquier punto dentro de esos dos anillos pasa a través de un número par de segmentos. Vea la
ilustración siguiente:
NonZero: Esta regla determina si un punto está en la región de relleno del trazado dibujando un rayo desde ese
punto hasta el infinito en cualquier dirección y examinando después los lugares donde un segmento de la forma
cruza el rayo. Partiendo de cero, sume una ubicación cada vez que un segmento cruce el radio de izquierda a
derecha y reste una ubicación cada vez que un segmento de trazado cruce el radio de derecha a izquierda.
Después de contar el número de veces que cruza, si el resultado es cero, el punto está fuera del trazado. De lo
contrario, está dentro.
Con el ejemplo anterior, un valor de Nonzero para FillRule proporciona la siguiente ilustración como resultado:
Como puede ver, se rellenan todos los anillos. Esto es porque todos los segmentos se ejecutan en la misma
dirección de modo que un radio dibujado desde cualquier punto cruzará uno o más segmentos y la suma de las
veces que cruza no será igual a cero. Por ejemplo, en la siguiente ilustración, las flechas rojas representan la
dirección en la que se dibujan los segmentos y la flecha blanca representa un rayo arbitrario que se ejecuta desde
un punto en el anillo más interno. A partir de un valor de cero, para cada segmento que cruza el radio, se agrega
un valor de uno porque el segmento cruza el radio de izquierda a derecha.
Para demostrar mejor el comportamiento de Nonzero la regla, se requiere una forma más compleja con
segmentos que se ejecuten en diferentes direcciones. En el código XAML siguiente se crea una forma similar
PathGeometry EllipseGeometry a la del ejemplo anterior, salvo que se crea con un en su lugar, que crea cuatro
arcos concéntricos en lugar de círculos concéntricos totalmente cerrados.
<Path Stroke="Black" StrokeThickness="1" Fill="#CCCCFF">
<Path.Data>
<GeometryGroup FillRule="NonZero">
<PathGeometry>
<PathGeometry.Figures>
Observe que no se rellena el tercer arco contando desde el centro. En la ilustración siguiente se muestra por qué
es. En la ilustración, las flechas rojas representan la dirección en que se dibujan los segmentos. Las dos flechas
blancas representan dos radios arbitrarios que parten desde un punto en la región "no rellena". Como puede
observarse en la ilustración, la suma de los valores de un radio determinado que cruza los segmentos en su
trazado es cero. Como se ha definido anteriormente, una suma de cero significa que el punto no forma parte de la
geometría (no es parte del relleno), mientras que la suma que no es igual a cero, incluido un valor negativo, sí
forma parte de la geometría.
NOTE
Para los fines de FillRule, todas las formas se consideran cerradas. Si hay un hueco en un segmento, dibuje una línea
imaginaria para cerrarlo. En el ejemplo anterior, hay huecos pequeños en los anillos. Por tanto, se podría esperar que un
radio que atraviesa el hueco ofrezca un resultado distinto al de un radio que se ejecuta en otra dirección. A continuación se
muestra una ilustración ampliada de uno de estos huecos y el "segmento imaginario" (segmento que se dibuja con el
FillRulefin de aplicar el) que lo cierra.
Ejemplo
Vea también
Crear una forma compuesta
Información general sobre geometría
Procedimiento Crear una geometría combinada
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo se combinan las geometrías. Para combinar dos geometrías, utilice un
CombinedGeometry objeto. Establezca su Geometry1 y Geometry2 propiedades con las dos geometrías para
combinar y establecer el GeometryCombineMode propiedad, que determina cómo se se combinan las geometrías
juntos, para Union , Intersect , Exclude , o Xor .
Para crear una geometría compuesta de dos o más geometrías, utilice un GeometryGroup.
Ejemplo
En el ejemplo siguiente, un CombinedGeometry se define con el modo de combinación de geometría Exclude .
Ambos Geometry1 y Geometry2 se definen como círculos del mismo radio, pero con los centros desplazados en
50.
<!-- Combines two geometries using the exclude combine mode. -->
<CombinedGeometry GeometryCombineMode="Exclude">
<CombinedGeometry.Geometry1>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="75,75" />
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="125,75" />
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
<!-- Combines two geometries using the intersect combine mode. -->
<CombinedGeometry GeometryCombineMode="Intersect">
<CombinedGeometry.Geometry1>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="75,75" />
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="125,75" />
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
<!-- Combines two geometries using the union combine mode. -->
<CombinedGeometry GeometryCombineMode="Union">
<CombinedGeometry.Geometry1>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="75,75" />
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="125,75" />
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
<!-- Combines two geometries using the XOR combine mode. -->
<CombinedGeometry GeometryCombineMode="Xor">
<CombinedGeometry.Geometry1>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="75,75" />
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<EllipseGeometry RadiusX="50" RadiusY="50" Center="125,75" />
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
En este ejemplo se muestra cómo crear formas compuestas mediante Geometry objetos y cómo mostrarlas
mediante un elemento Path. En el ejemplo siguiente, se usa un LineGeometry, EllipseGeometryy un
RectangleGeometry con un GeometryGroup para crear una forma compuesta. A continuación, las geometrías se
dibujan utilizando un elemento Path.
Ejemplo
<!-- Displays the geometry. -->
<Path Stroke="Black" StrokeThickness="1" Fill="#CCCCFF">
<Path.Data>
myPath.Data = myGeometryGroup;
myPath.Data = myGeometryGroup
Geometría compuesta
Las formas más complejas, como polígonos y formas con segmentos curvos, se pueden crear con un
PathGeometry. Para ver un ejemplo en el que se muestra cómo crear una forma mediante un PathGeometry, vea
crear una forma mediante una PathGeometry. Aunque en este ejemplo se representa una forma en la pantalla
mediante un elemento Path, Geometry objetos también se pueden usar para describir el contenido de un
GeometryDrawing o de un DrawingContext. También se pueden usar para el recorte y la prueba de
posicionamiento.
Este ejemplo forma parte de un ejemplo más extenso; para obtener el ejemplo completo, vea Ejemplo de
geometrías.
Cómo: Crear una curva Bézier cúbica
20/02/2020 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo crear una curva Bézier cúbica. Para crear una curva Bézier cúbica, utilice las
clases PathGeometry, PathFigurey BezierSegment. Para mostrar la geometría resultante, use un elemento Path o
Úselo con un GeometryDrawing o un DrawingContext. En los ejemplos siguientes, se dibuja una curva Bézier
cúbica de (10, 100) a (300, 100). La curva tiene puntos de control de (100, 0) y (200, 200).
Ejemplo
[xaml]
En Lenguaje XAML (Extensible Application Markup Language), puede usar la sintaxis de marcado abreviada para
describir una ruta de acceso.
[xaml]
En XAML, también puede dibujar una curva Bézier cúbica mediante etiquetas de objeto. El siguiente ejemplo es
equivalente al ejemplo anterior de XAML.
Este ejemplo forma parte de un ejemplo más extenso; para obtener el ejemplo completo, vea Ejemplo de
geometrías.
Consulte también
Crear un arco elíptico
Crear un LineSegment en una clase PathGeometry
Crear una curva Bézier cúbica
Crear una curva Bézier cuadrática
Procedimiento Crear una línea mediante la clase
LineGeometry
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo usar el LineGeometry clase para describir una línea. Un LineGeometry se define
por sus puntos inicial y final.
Ejemplo
El ejemplo siguiente muestra cómo crear y representar un LineGeometry. Un Path elemento se usa para
representar la línea. Dado que una línea no tiene ninguna área, el Path del objeto Fill no se ha especificado; en su
lugar el Stroke y StrokeThickness se usan las propiedades.
Vea también
Información general sobre geometría
Crear una forma compuesta
Crear una forma mediante una clase PathGeometry
Cómo: Crear un segmento de línea en una clase
PathGeometry
20/02/2020 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo crear un segmento de línea. Para crear un segmento de línea, use las clases
PathGeometry, PathFigurey LineSegment.
Ejemplo
En los ejemplos siguientes se dibuja una LineSegment de (10, 50) a (200, 70). En la ilustración siguiente se
muestra el LineSegmentresultante; se ha agregado un fondo de cuadrícula para mostrar el sistema de
coordenadas.
[xaml]
(Tenga en cuenta que esta sintaxis de atributo crea realmente un StreamGeometry, una versión más ligera de un
PathGeometry. Para más información, consulte la página Sintaxis de marcado de trazados).
En XAML, también puede dibujar un segmento de línea con la sintaxis de elemento de objeto. El siguiente ejemplo
es equivalente al ejemplo anterior de XAML.
myPathFigure.Segments = myPathSegmentCollection;
myPathFigure.Segments = myPathSegmentCollection
Este ejemplo forma parte de un ejemplo más extenso; para obtener el ejemplo completo, vea Ejemplo de
geometrías.
Consulte también
PathFigure
PathGeometry
GeometryDrawing
Path
Información general sobre geometría
Cómo: Crear una forma mediante una clase
PathGeometry
20/02/2020 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo crear una forma mediante la clase PathGeometry. PathGeometry objetos se
componen de uno o varios objetos PathFigure; cada PathFigure representa una "figura" o forma diferente. Cada
PathFigure se compone de uno o varios objetos PathSegment, cada uno de los cuales representa una parte
conectada de la figura o forma. Los tipos de segmento incluyen LineSegment, ArcSegmenty BezierSegment.
Ejemplo
En el ejemplo siguiente se usa una PathGeometry para crear un triángulo. El PathGeometry se muestra utilizando
un elemento Path.
StreamGeometry es una alternativa ligera a PathGeometry para crear formas geométricas. Use un
StreamGeometry cuando necesite describir una geometría compleja pero no desea la sobrecarga de admitir el
enlace de datos, animaciones ni modificaciones. Por ejemplo, debido a su eficacia, la StreamGeometry clase es una
buena elección para describir adornos.
Ejemplo
En el ejemplo siguiente se usa la sintaxis de atributo para crear un triangular StreamGeometry en XAML.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
</StackPanel>
</Page>
Para obtener más información acerca de StreamGeometry sintaxis de atributo, vea el sintaxis de marcado de
trazados página.
Ejemplo
El ejemplo siguiente se usa un StreamGeometry para definir un triángulo en el código. En primer lugar, el ejemplo
se crea un StreamGeometry, a continuación, obtiene un StreamGeometryContext y lo usa para describir el
triángulo.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
namespace SDKSample
{
// Use StreamGeometry with StreamGeometryContext to define a triangle shape.
public partial class StreamGeometryTriangleExample : Page
{
public StreamGeometryTriangleExample()
{
// Create a path to draw a geometry with.
Path myPath = new Path();
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
// Begin the triangle at the point specified. Notice that the shape is set to
// be closed so only two lines need to be specified below to make the triangle.
ctx.BeginFigure(new Point(10, 100), true /* is filled */, true /* is closed */);
Namespace SDKSample
' Use StreamGeometry with StreamGeometryContext to define a triangle shape.
Partial Public Class StreamGeometryTriangleExample
Inherits Page
Public Sub New()
' Create a path to draw a geometry with.
Dim myPath As New Path()
myPath.Stroke = Brushes.Black
myPath.StrokeThickness = 1
' Begin the triangle at the point specified. Notice that the shape is set to
' be closed so only two lines need to be specified below to make the triangle.
ctx.BeginFigure(New Point(10, 100), True, True) ' is closed - is filled
' Specify the shape (triangle) of the Path using the StreamGeometry.
myPath.Data = geometry
Ejemplo
En el ejemplo siguiente se crea un método que utiliza un StreamGeometry y StreamGeometryContext para definir
una forma geométrica según los parámetros especificados.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
namespace SDKSample
{
public partial class StreamGeometryExample : Page
{
public StreamGeometryExample()
{
// Create a path to draw a geometry with.
Path myPath = new Path();
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
return geometry;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Shapes
Namespace SDKSample
Partial Public Class StreamGeometryExample
Inherits Page
Public Sub New()
' Create a path to draw a geometry with.
Dim myPath As New Path()
myPath.Stroke = Brushes.Black
myPath.StrokeThickness = 1
Return geometry
End Function
End Class
End Namespace
Vea también
PathGeometry
StreamGeometry
StreamGeometryContext
Crear una forma mediante una clase PathGeometry
Información general sobre geometría
Cómo: Crear una curva Bézier cuadrática
20/02/2020 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo crear una curva Bézier cuadrática. Para crear una curva Bézier cuadrática, utilice
las clases PathGeometry, PathFigurey QuadraticBezierSegment.
Ejemplo
En los ejemplos siguientes, se dibuja una curva Bézier cuadrática de (10.100) a (300.100). La curva tiene un punto
de control de (200.200).
[xaml]
En Lenguaje XAML (Extensible Application Markup Language), puede utilizar la sintaxis de atributo para describir
una ruta de acceso.
[xaml]
(Tenga en cuenta que esta sintaxis de atributo crea realmente un StreamGeometry, una versión más ligera de un
PathGeometry. Para más información, consulte la página Sintaxis de marcado de trazados).
En XAML, también puede dibujar una curva Bézier cuadrática mediante la sintaxis del elemento de objeto. El
siguiente ejemplo es equivalente al ejemplo anterior de XAML.
Este ejemplo forma parte de un ejemplo más extenso; para obtener el ejemplo completo, vea Ejemplo de
geometrías.
Consulte también
Crear un arco elíptico
Crear una curva Bézier cúbica
Cómo: Crear un arco elíptico
20/02/2020 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo dibujar un arco elíptico. Para crear un arco elíptico, utilice las clases
PathGeometry, PathFigurey ArcSegment.
Ejemplo
En los ejemplos siguientes, se dibuja un arco elíptico de (10.100) a (200.100). El arco tiene una Size de 100 por
píxeles independientes del dispositivo 50, una RotationAngle de 45 grados, una IsLargeArc configuración de
true y una SweepDirection de Counterclockwise.
[xaml]
En Lenguaje XAML (Extensible Application Markup Language), puede utilizar la sintaxis de atributo para
describir una ruta de acceso.
[xaml]
(Tenga en cuenta que esta sintaxis de atributo crea realmente un StreamGeometry, una versión más ligera de un
PathGeometry. Para más información, consulte la página Sintaxis de marcado de trazados).
En XAML, también puede dibujar un arco elíptico mediante etiquetas de objeto explícitamente. Lo siguiente es
equivalente al marcado de XAML anterior.
Este ejemplo forma parte de un ejemplo mayor. Para obtener el ejemplo completo, vea el ejemplo de geometrías.
Consulte también
Crear una curva Bézier cuadrática
Crear una curva Bézier cúbica
Procedimiento Crear varios subtrazados en un objeto
PathGeometry
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo crear varios subtrazados en un PathGeometry. Para crear varios subtrazados,
cree un PathFigure para cada subtrazado.
Ejemplo
El ejemplo siguiente crea dos subtrazados, cada uno de ellos un triángulo.
El ejemplo siguiente muestra cómo crear varios subtrazados mediante un Path y XAML sintaxis de atributo. Cada
M crea una subruta de acceso nuevo para que el ejemplo crea dos subtrazados cada dibuja un triángulo.
(Tenga en cuenta que esta sintaxis de atributo se crea en realidad un StreamGeometry, una versión ligera de un
PathGeometry. Para más información, consulte la página Sintaxis de marcado de trazados).
Vea también
Información general sobre geometría
Procedimiento Definir un rectángulo mediante una
clase RectangleGeometry
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se describe cómo usar el RectangleGeometry clase para describir un rectángulo.
Ejemplo
El ejemplo siguiente muestra cómo crear y representar un RectangleGeometry. La posición relativa y las
dimensiones del rectángulo se definen mediante un Rect estructura. Es la posición relativa 50,50 y el alto y ancho
son ambos 25 creación de un cuadrado. El interior del rectángulo se pinta con un LemonChiffon pincel y su
contorno se dibuja con un Black con un grosor de trazo de 1 .
RectangleGeometry
Aunque este ejemplo usa un Path elemento para representar el RectangleGeometry, hay muchas otras formas de
usar RectangleGeometry objetos. Por ejemplo, un RectangleGeometry puede utilizarse para especificar el Clip de
un UIElement o Geometry de un GeometryDrawing.
Otras clases de geometría simple incluyen LineGeometry y EllipseGeometry. Estas geometrías, así como otras más
complejas, también se pueden crear mediante un PathGeometry o StreamGeometry.
Vea también
Información general sobre geometría
Crear una forma compuesta
Crear una forma mediante una clase PathGeometry
Procedimiento Redondear las esquinas de un
RectangleGeometry
23/10/2019 • 2 minutes to read • Edit Online
Para redondear los vértices de un RectangleGeometry, establezca su RadiusX y RadiusY propiedades en un valor
mayor que cero. Cuanto mayor sea el valores, más redondeadas serán las esquinas del rectángulo.
Ejemplo
El ejemplo siguiente se muestra varias RectangleGeometry objetos con diferentes RadiusX y RadiusY
configuración. El RectangleGeometry objetos se muestran mediante Path elementos.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="GeoOvwSample.RectangleGeometryRoundedCornerExample">
<Page.Resources>
<!-- Create a graph paper style border to frame the rectangles. -->
<Style x:Key="GraphPaperBorderStyle" TargetType="{x:Type Border}">
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="Background"
Value="{StaticResource GridDrawingBrushResource}" />
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Margin" Value="10" />
<Setter Property="Width" Value="190" />
<Setter Property="Height" Value="90" />
</Style>
</Page.Resources>
<StackPanel Name="MainStackPanel">
</StackPanel>
</Page>
Vea también
Información general sobre geometría
Crear una forma compuesta
Crear una forma mediante una clase PathGeometry
Imágenes
23/10/2019 • 2 minutes to read • Edit Online
Windows Presentation Foundation (WPF ) proporciona compatibilidad integrada con varios formatos de imagen,
representación de imágenes de alta fidelidad y extensibilidad de códec.
En esta sección
Información general sobre imágenes
Temas "Cómo..."
Referencia
Image
BitmapImage
BitmapSource
Vea también
Imágenes y gráficos 2D
Gráficos y multimedia
Información general sobre imágenes
08/01/2020 • 25 minutes to read • Edit Online
En este tema se proporciona una introducción al componente de creación de imágenes de Microsoft Windows
Presentation Foundation. La creación de imágenes de WPF permite a los desarrolladores Mostrar, transformar
y dar formato a las imágenes.
<!-- Simple image rendering. However, rendering an image this way may not
result in the best use of application memory. See markup below which
creates the same end result but using less memory. -->
<Image Width="200"
Source="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg"/>
<Image Width="200">
<Image.Source>
<!-- To save significant application memory, set the DecodePixelWidth or
DecodePixelHeight of the BitmapImage value of the image source to the desired
height and width of the rendered image. If you don't do this, the application will
cache the image as though it were rendered as its normal size rather then just
the size that is displayed. -->
<!-- Note: In order to preserve aspect ratio, only set either DecodePixelWidth
or DecodePixelHeight but not both. -->
<BitmapImage DecodePixelWidth="200"
UriSource="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water
Lilies.jpg" />
</Image.Source>
</Image>
Muchos de los ejemplos usan un objeto BitmapImage para hacer referencia a un archivo de imagen.
BitmapImage es un BitmapSource especializado que está optimizado para la carga de Lenguaje XAML
(Extensible Application Markup Language) y es una manera fácil de mostrar imágenes como Source de un
control de Image.
En el siguiente ejemplo se muestra cómo representar una imagen de 200 píxeles de ancho mediante código.
NOTE
BitmapImage implementa la interfaz ISupportInitialize para optimizar la inicialización en varias propiedades. Los cambios
en la propiedad solo se pueden producir durante la inicialización del objeto. Llame a BeginInit para indicar que la
inicialización ha comenzado y EndInit para indicar que la inicialización se ha completado. Una vez inicializado, se omiten
los cambios en la propiedad.
// Create source
BitmapImage myBitmapImage = new BitmapImage();
La conversión de una imagen a un formato de píxel diferente, como la escala de grises, se realiza mediante
FormatConvertedBitmap. En los ejemplos siguientes, una imagen se convierte en Gray4.
<!-- Grayscale XAML Image -->
<Image Width="200" Grid.Column="0" Grid.Row="1">
<Image.Source>
<FormatConvertedBitmap Source="/sampleImages/rocks.jpg" DestinationFormat="Gray4" />
</Image.Source>
</Image>
Para recortar una imagen, se puede usar la propiedad Clip de Image o CroppedBitmap. Normalmente, si solo
desea mostrar una parte de una imagen, se debe usar Clip. Si necesita codificar y guardar una imagen
recortada, se debe usar el CroppedBitmap. En el ejemplo siguiente, se recorta una imagen utilizando la
propiedad clip mediante una EllipseGeometry.
Ajustar imágenes
La propiedad Stretch controla cómo se ajusta una imagen para rellenar su contenedor. La propiedad Stretch
acepta los siguientes valores, definidos por la enumeración Stretch:
None: la imagen no se ajusta para rellenar el área de salida. Si la imagen es más grande que el área de
salida, esta se dibujará en dicha área, recortando lo que no se ajuste.
Fill: la imagen se escala para ajustarse al área de salida. Como el alto y el ancho de las imágenes se
escalan de forma independiente, podría no conservarse la relación de aspecto original de la imagen. En
otras palabras, la imagen podría distorsionarse para rellenar por completo el contenedor de salida.
Uniform: la imagen se escala para que quepa completamente dentro del área de salida. Se conserva la
relación de aspecto de la imagen.
UniformToFill: la imagen se escala para que rellene completamente el área de salida, al mismo tiempo
que se conserva la relación de aspecto original de la imagen.
En el ejemplo siguiente se aplica cada una de las enumeraciones de Stretch disponibles a una Image.
En la imagen siguiente se muestra el resultado del ejemplo y se muestra el efecto que tienen las distintas
configuraciones de Stretch cuando se aplican a una imagen.
<!-- Sets the button's Background property with an ImageBrush. The resulting
button has an image as its background. -->
<Button Grid.Row="3" Grid.Column="2"
Height="75" Width="100" Foreground="White" FontWeight="Bold"
HorizontalAlignment="Left">
A Button
<Button.Background>
<ImageBrush ImageSource="sampleImages\blueberries.jpg" />
</Button.Background>
</Button>
Para obtener más información sobre cómo ImageBrush y pintar imágenes , vea pintar con imágenes, dibujos y
objetos visuales.
Metadatos de imagen
Algunos archivos de imagen contienen metadatos que describen el contenido o las características del archivo.
Por ejemplo, la mayoría de las cámaras digitales crean imágenes que contienen metadatos sobre la marca y
modelo de la cámara empleada para capturar la imagen. Cada formato de imagen controla los metadatos de
manera diferente, pero la creación de imágenes de WPF proporciona una manera uniforme de almacenar y
recuperar los metadatos de cada formato de imagen compatible.
El acceso a los metadatos se proporciona a través de la propiedad Metadata de un objeto BitmapSource.
Metadata devuelve un objeto BitmapMetadata que incluye todos los metadatos que contiene la imagen. Estos
datos pueden estar en un esquema de metadatos o una combinación de diferentes esquemas. La creación de
imágenes de WPF admite los siguientes esquemas de metadatos de imagen: el archivo de imagen
intercambiable (EXIF ), el texto (datos de texto PNG ), el directorio de archivos de imagen (IFD ), el Consejo
Internacional de telecomunicaciones (IPTC ) y la plataforma de metadatos extensible (XMP ).
Con el fin de simplificar el proceso de lectura de metadatos, BitmapMetadata proporciona varias propiedades
con nombre a las que se puede tener acceso fácilmente, como Author, Titley CameraModel. Muchas de estas
propiedades con nombre también se pueden usar para escribir metadatos. El lector de consultas de metadatos
proporciona soporte técnico adicional para leer metadatos. El método GetQuery se utiliza para recuperar un
lector de consultas de metadatos proporcionando una consulta de cadena como "/APP1/Exif/" . En el ejemplo
siguiente, se usa GetQuery para obtener el texto almacenado en la ubicación "/Text/Description" .
' Add the metadata of the bitmap image to the text block.
Dim myTextBlock As New TextBlock()
myTextBlock.Text = "The Description metadata of this image is: " +
pngInplace.GetQuery("/Text/Description").ToString()
Para escribir metadatos, se usa un escritor de consultas de metadatos. SetQuery obtiene el escritor de
consultas y establece el valor deseado. En el ejemplo siguiente, se usa SetQuery para escribir el texto
almacenado en la ubicación "/Text/Description" .
Extensibilidad de códec
Una característica fundamental de la creación de imágenes de WPF es el modelo de extensibilidad para los
nuevos códecs de imagen. Estas interfaces no administradas permiten a los desarrolladores de códec integrar
códecs con WPF para que las aplicaciones de WPF puedan usar automáticamente nuevos formatos de
imagen.
Para obtener un ejemplo de la API de extensibilidad, vea el ejemplo de códec de Win32. En este ejemplo se
muestra cómo crear un descodificador y un codificador para un formato de imagen personalizado.
NOTE
El códec se debe firmar digitalmente para que el sistema lo reconozca.
Vea también
BitmapSource
BitmapImage
Image
BitmapMetadata
Imágenes y gráficos 2D
Código de ejemplo Win32
Temas "Cómo..." de imágenes
23/10/2019 • 2 minutes to read • Edit Online
Los temas de esta sección muestran cómo usar Windows Presentation Foundation (WPF ) con el fin de mostrar o
modificar las imágenes de mapa de bits.
En esta sección
Usar BitmapImage en XAML
Cargar una imagen como una miniatura
Aplicar una transformación a un BitmapImage
Crear un mapa de bits desde un objeto visual
Codificar un objeto visual en un archivo de imagen
Crear un nuevo objeto BitmapSource
Encadenar objetos BitmapSource
Convertir un elemento BitmapSource a un formato de píxeles diferente
Convertir un elemento BitmapSource en un formato de píxeles indexado
Codificar y descodificar una imagen JPEG
Codificar y descodificar una imagen BMP
Codificar y descodificar una imagen PNG
Codificar y descodificar una imagen WDP
Codificar y descodificar una imagen GIF
Codificar y descodificar una imagen TIFF
Escribir metadatos en un mapa de bits
Leer metadatos de un mapa de bits
Referencia
Image
BitmapImage
BitmapSource
Vea también
Información general sobre imágenes
Procedimiento Usar un BitmapImage
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un BitmapImage como origen de un Image controlar en Lenguaje XAML
(Extensible Application Markup Language).
Ejemplo
<!-- Simple image rendering. However, rendering an image this way may not
result in the best use of application memory. See markup below which
creates the same end result but using less memory. -->
<Image Width="200"
Source="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg"/>
<Image Width="200">
<Image.Source>
<!-- To save significant application memory, set the DecodePixelWidth or
DecodePixelHeight of the BitmapImage value of the image source to the desired
height and width of the rendered image. If you don't do this, the application will
cache the image as though it were rendered as its normal size rather then just
the size that is displayed. -->
<!-- Note: In order to preserve aspect ratio, only set either DecodePixelWidth
or DecodePixelHeight but not both. -->
<BitmapImage DecodePixelWidth="200"
UriSource="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg" />
</Image.Source>
</Image>
// Create source
BitmapImage myBitmapImage = new BitmapImage();
Vea también
Información general sobre imágenes
Procedimiento Cargar una imagen como una
miniatura
23/10/2019 • 2 minutes to read • Edit Online
Los ejemplos siguientes muestran cómo cargar un Image como una miniatura para conservar memoria de la
aplicación.
Ejemplo
El ejemplo siguiente se establece la DecodePixelWidth propiedad de un BitmapImage en Lenguaje XAML
(Extensible Application Markup Language) para reducir la memoria necesaria para cargar la imagen.
<!-- Simple image rendering. However, rendering an image this way may not
result in the best use of application memory. See markup below which
creates the same end result but using less memory. -->
<Image Width="200"
Source="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg"/>
<Image Width="200">
<Image.Source>
<!-- To save significant application memory, set the DecodePixelWidth or
DecodePixelHeight of the BitmapImage value of the image source to the desired
height and width of the rendered image. If you don't do this, the application will
cache the image as though it were rendered as its normal size rather then just
the size that is displayed. -->
<!-- Note: In order to preserve aspect ratio, only set either DecodePixelWidth
or DecodePixelHeight but not both. -->
<BitmapImage DecodePixelWidth="200"
UriSource="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg" />
</Image.Source>
</Image>
Ejemplo
El ejemplo siguiente se establece la DecodePixelWidth propiedad de un BitmapImage en el código para reducir la
memoria necesaria para cargar la imagen.
// Create Image Element
Image myImage = new Image();
myImage.Width = 200;
// Create source
BitmapImage myBitmapImage = new BitmapImage();
Vea también
Información general sobre imágenes
Procedimiento Aplicar una transformación a un
BitmapImage
23/10/2019 • 2 minutes to read • Edit Online
Ejemplo
///// Create a BitmapImage and set it's DecodePixelWidth to 200. Use /////
///// this BitmapImage as a source for other BitmapSource objects. /////
// Create the new BitmapSource that will be used to scale the size of the source.
TransformedBitmap myRotatedBitmapSource = new TransformedBitmap();
// Use the BitmapSource object defined above as the source for this BitmapSource.
// This creates a "chain" of BitmapSource objects which essentially inherit from each other.
myRotatedBitmapSource.Source = myBitmapImage;
' BitmapSource objects like BitmapImage can only have their properties
' changed within a BeginInit/EndInit block.
myBitmapImage.BeginInit()
myBitmapImage.UriSource = New Uri("C:\Documents and Settings\All Users\Documents\My Pictures\Sample
Pictures\Water Lilies.jpg")
' BitmapSource objects like TransformedBitmap can only have their properties
' changed within a BeginInit/EndInit block.
myRotatedBitmapSource.BeginInit()
' Use the BitmapSource object defined above as the source for this BitmapSource.
' This creates a "chain" of BitmapSource objects which essentially inherit from each other.
myRotatedBitmapSource.Source = myBitmapImage
Vea también
BitmapSource
Información general sobre imágenes
Girar una imagen
Procedimiento Crear un mapa de bits desde un
objeto visual
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo puede crear un mapa de bits desde un Visual. Un DrawingVisual se presenta con
FormattedText. El Visual , a continuación, se representa en el RenderTargetBitmap creación de un mapa de bits del
texto dado.
Ejemplo
Image myImage = new Image();
FormattedText text = new FormattedText("ABC",
new CultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface(this.FontFamily, FontStyles.Normal, FontWeights.Normal, new FontStretch()),
this.FontSize,
this.Foreground);
Vea también
DrawingContext
Información general sobre imágenes
Información general sobre objetos Drawing
Usar objetos DrawingVisual
Procedimiento Codificar un objeto visual en un
archivo de imagen
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo codificar Visual un objeto en un archivo de imagen RenderTargetBitmap
mediante y PngBitmapEncoder.
Ejemplo
Se crea RenderTargetBitmapmediante y queFormattedText se representa en un. BitmapImage DrawingVisual El
mapa de bits representado se usa para crear un BitmapFrame que se agrega PngBitmapEncoder a para crear un
nuevo archivo PNG (Portable Network Graphics).
// Base Image
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri("sampleImages/waterlilies.jpg",UriKind.Relative);
bi.DecodePixelWidth = 200;
bi.EndInit();
Se usó en este ejemplo, pero cualquiera de los objetos BitmapEncoder derivados podría haberse utilizado para
crear el archivo de imagen. PngBitmapEncoder
Vea también
DrawingContext
Información general sobre imágenes
Información general sobre objetos Drawing
Usar objetos DrawingVisual
Procedimiento Crear un objeto BitmapSource
23/10/2019 • 2 minutes to read • Edit Online
Este ejemplo muestra cómo usar el Create método BitmapSource para crear un nuevo BitmapSource objeto.
Ejemplo
// Define parameters used to create the BitmapSource.
PixelFormat pf = PixelFormats.Bgr32;
int width = 200;
int height = 200;
int rawStride = (width * pf.BitsPerPixel + 7) / 8;
byte[] rawImage = new byte[rawStride * height];
// Create a BitmapSource.
BitmapSource bitmap = BitmapSource.Create(width, height,
96, 96, pf, null,
rawImage, rawStride);
Vea también
Información general sobre imágenes
Procedimiento Encadenar objetos BitmapSource
23/10/2019 • 5 minutes to read • Edit Online
En este ejemplo se muestra cómo aplicar diversos efectos a un origen de imagen encadenando varios
BitmapSource objetos derivados entre sí.
En el ejemplo siguiente se utiliza el encadenamiento para voltear y cambiar el formato de píxel del origen de una
imagen.
Ejemplo
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<!-- This TransformedBitmap uses the BitmapImage defined above and flips
it 90 degrees. -->
<TransformedBitmap x:Key="rotatedImage" Source="{StaticResource masterImage}">
<TransformedBitmap.Transform>
<RotateTransform Angle="90" />
</TransformedBitmap.Transform>
</TransformedBitmap>
</Page.Resources>
<StackPanel>
namespace SDKSample
{
public partial class ChainedBitmapSourcesExample : Page
public partial class ChainedBitmapSourcesExample : Page
{
public ChainedBitmapSourcesExample()
{
///// Create a BitmapImage and set it's DecodePixelWidth to 200. Use /////
///// this BitmapImage as a source for other BitmapSource objects. /////
// Create the new BitmapSource that will be used to scale the size of the source.
TransformedBitmap myRotatedBitmapSource = new TransformedBitmap();
// Use the BitmapSource object defined above as the source for this BitmapSource.
// This creates a "chain" of BitmapSource objects which essentially inherit from each other.
myRotatedBitmapSource.Source = myBitmapImage;
// Multiply the size of the X and Y axis of the source by 3.
myRotatedBitmapSource.Transform = new RotateTransform(90);
myRotatedBitmapSource.EndInit();
// Create a new BitmapSource using a different format than the original one.
FormatConvertedBitmap newFormatedBitmapSource = new FormatConvertedBitmap();
Namespace SDKSample
Class ChainedBitmapSourcesExample
Inherits Page
' BitmapSource objects like BitmapImage can only have their properties
' changed within a BeginInit/EndInit block.
myBitmapImage.BeginInit()
myBitmapImage.UriSource = New Uri("sampleImages/WaterLilies.jpg", UriKind.Relative)
' BitmapSource objects like TransformedBitmap can only have their properties
' changed within a BeginInit/EndInit block.
myRotatedBitmapSource.BeginInit()
' Use the BitmapSource object defined above as the source for this BitmapSource.
' This creates a "chain" of BitmapSource objects which essentially inherit from each other.
myRotatedBitmapSource.Source = myBitmapImage
' Multiply the size of the X and Y axis of the source by 3.
myRotatedBitmapSource.Transform = New RotateTransform(90)
myRotatedBitmapSource.EndInit()
' Create a new BitmapSource using a different format than the original one.
Dim newFormatedBitmapSource As New FormatConvertedBitmap()
' BitmapSource objects like FormatConvertedBitmap can only have their properties
' changed within a BeginInit/EndInit block.
newFormatedBitmapSource.BeginInit()
newFormatedBitmapSource.Source = myRotatedBitmapSource
newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray32Float
newFormatedBitmapSource.EndInit()
End Sub
End Sub
End Class
End Namespace
Procedimiento Convertir un elemento BitmapSource
a un formato de píxeles diferente
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo convertir un BitmapSource objeto (BitmapImage) en otro PixelFormat mediante
un FormatConvertedBitmap.
Ejemplo
///// Create a BitmapImage and set it's DecodePixelWidth to 200. Use /////
///// this BitmapImage as a source for other BitmapSource objects. /////
// Use the BitmapSource object defined above as the source for this new
// BitmapSource (chain the BitmapSource objects together).
newFormatedBitmapSource.Source = myBitmapImage;
' BitmapSource objects like BitmapImage can only have their properties
' changed within a BeginInit/EndInit block.
myBitmapImage.BeginInit()
myBitmapImage.UriSource = New Uri("sampleImages/WaterLilies.jpg", UriKind.Relative)
' BitmapSource objects like FormatConvertedBitmap can only have their properties
' changed within a BeginInit/EndInit block.
newFormatedBitmapSource.BeginInit()
' Use the BitmapSource object defined above as the source for this new
' BitmapSource (chain the BitmapSource objects together).
newFormatedBitmapSource.Source = myBitmapImage
Vea también
Información general sobre imágenes
Procedimiento Convertir un elemento BitmapSource
a un formato de píxeles indexado
23/10/2019 • 3 minutes to read • Edit Online
Ejemplo
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Collections.Generic;
namespace SDKSample
{
public partial class FormatConvertedBitmapExample2 : Page
{
public FormatConvertedBitmapExample2()
{
///// Create a BitmapImage and set it's DecodePixelWidth to 200. Use /////
///// this BitmapImage as a source for other BitmapSource objects. /////
// Use the BitmapSource object defined above as the source for this new
// BitmapSource (chain the BitmapSource objects together).
newFormatedBitmapSource.Source = myBitmapImage;
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Imaging
Imports System.Collections.Generic
Namespace SDKSample
Class FormatConvertedBitmapExample2
Inherits Page
'/// Create a BitmapImage and set it's DecodePixelWidth to 200. Use /////
'/// this BitmapImage as a source for other BitmapSource objects. /////
Dim myBitmapImage As New BitmapImage()
' BitmapSource objects like BitmapImage can only have their properties
' changed within a BeginInit/EndInit block.
myBitmapImage.BeginInit()
myBitmapImage.UriSource = New Uri("sampleImages/WaterLilies.jpg", UriKind.Relative)
' BitmapSource objects like FormatConvertedBitmap can only have their properties
' changed within a BeginInit/EndInit block.
newFormatedBitmapSource.BeginInit()
' Use the BitmapSource object defined above as the source for this new
' BitmapSource (chain the BitmapSource objects together).
newFormatedBitmapSource.Source = myBitmapImage
' Set the DestinationPalette property to the custom palette created above.
newFormatedBitmapSource.DestinationPalette = myPalette
End Sub
End Class
End Namespace 'ImagingSnippetGallery
Procedimiento Codificar y descodificar una imagen
JPEG
23/10/2019 • 2 minutes to read • Edit Online
Los ejemplos siguientes muestran cómo descodificar y codificar imágenes JPEG con específico del
JpegBitmapDecoder y JpegBitmapEncoder objetos.
Vea también
Información general sobre imágenes
Procedimiento Codificar y descodificar una imagen
BMP
23/10/2019 • 2 minutes to read • Edit Online
En los siguientes ejemplos se muestra cómo descodificar y codificar una imagen de mapa de bits (
BmpBitmapDecoder BMP BmpBitmapEncoder ) mediante los objetos y específicos.
Ejemplo
En este ejemplo se muestra cómo descodificar una imagen BMP BmpBitmapDecoder con un Uride.
Ejemplo
En este ejemplo se muestra cómo codificar BitmapSource un en una imagen BMP BmpBitmapEncodermediante.
int width = 128;
int height = width;
int stride = width / 8;
array<System::Byte>^ pixels = gcnew array<System::Byte>(height * stride);
Vea también
Información general sobre imágenes
Procedimiento Codificar y descodificar una imagen
PNG
23/10/2019 • 2 minutes to read • Edit Online
En los siguientes ejemplos se muestra cómo descodificar y codificar una imagen PNG (Portable Network
Graphics) PngBitmapDecoder mediante PngBitmapEncoder los objetos y específicos.
Ejemplo
En este ejemplo se muestra cómo descodificar una imagen PNG PngBitmapDecoder con un FileStreamde.
Ejemplo
En este ejemplo se muestra cómo codificar BitmapSource un en una imagen PNG PngBitmapEncodermediante.
int width = 128;
int height = 128;
int stride = width;
array<System::Byte>^ pixels = gcnew array<System::Byte>(height * stride);
Vea también
Información general sobre imágenes
Cómo: Codificar y descodificar una imagen WDP
29/10/2019 • 2 minutes to read • Edit Online
En los siguientes ejemplos se muestra cómo descodificar y codificar una imagen de Microsoft Windows Media
Photo con los objetos WmpBitmapDecoder y WmpBitmapEncoder específicos.
Ejemplo
En este ejemplo se muestra cómo descodificar una imagen de Windows Media Photo mediante una
WmpBitmapDecoder de un Uri.
Ejemplo
En este ejemplo se muestra cómo codificar un BitmapSource en una imagen fotográfica de Windows Media
mediante un WmpBitmapEncoder.
int width = 128;
int height = width;
int stride = width / 8;
array<System::Byte>^ pixels = gcnew array<System::Byte>(height * stride);
Vea también
Información general sobre imágenes
Procedimiento Codificar y descodificar una imagen
GIF
23/10/2019 • 2 minutes to read • Edit Online
En los siguientes ejemplos se muestra cómo descodificar y codificar una imagen de formato de intercambio de
gráficos ( GifBitmapDecoder GIF GifBitmapEncoder ) mediante los objetos y específicos.
Ejemplo
En este ejemplo se muestra cómo descodificar una imagen GIF GifBitmapDecoder mediante un FileStreamde.
Ejemplo
En este ejemplo se muestra cómo codificar BitmapSource un en una imagen GIF GifBitmapEncodermediante.
int width = 128;
int height = width;
int stride = width / 8;
array<System::Byte>^ pixels = gcnew array<System::Byte>(height * stride);
Vea también
Información general sobre imágenes
Procedimiento Codificar y descodificar una imagen
TIFF
23/10/2019 • 2 minutes to read • Edit Online
En los siguientes ejemplos se muestra cómo descodificar y codificar una imagen de Tagged Image File Format
(TIFF ) mediante los objetos TiffBitmapDecoder y TiffBitmapEncoder específicos.
Ejemplo
En este ejemplo se muestra cómo descodificar una imagen TIFF mediante un TiffBitmapDecoder de un Uri.
Ejemplo
En este ejemplo se muestra cómo codificar un BitmapSource en una imagen TIFF mediante un TiffBitmapEncoder.
int width = 128;
int height = width;
int stride = width / 8;
array<System::Byte>^ pixels = gcnew array<System::Byte>(height * stride);
Vea también
Información general sobre imágenes
Procedimiento Escribir metadatos en un mapa de bits
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo escribir metadatos en un mapa de bits mediante el lenguaje de consulta de
metadatos.
Ejemplo
Stream^ pngStream = gcnew FileStream("smiley.png", FileMode::Open, FileAccess::ReadWrite,
FileShare::ReadWrite);
PngBitmapDecoder^ pngDecoder = gcnew PngBitmapDecoder(pngStream, BitmapCreateOptions::PreservePixelFormat,
BitmapCacheOption::Default);
BitmapFrame^ pngFrame = pngDecoder->Frames[0];
InPlaceBitmapMetadataWriter^ pngInplace = pngFrame->CreateInPlaceBitmapMetadataWriter();
if (pngInplace->TrySave() == true)
{
pngInplace->SetQuery("/Text/Description", "Have a nice day.");
}
pngStream->Close();
En este ejemplo se muestra cómo leer los metadatos de mapa de bits mediante el lenguaje de consulta de
metadatos.
Ejemplo
// Add the metadata of the bitmap image to the text block.
TextBlock^ myTextBlock = gcnew TextBlock();
myTextBlock->Text = "The Description metadata of this image is: " + pngInplace->GetQuery("/Text/Description")-
>ToString();
' Add the metadata of the bitmap image to the text block.
Dim myTextBlock As New TextBlock()
myTextBlock.Text = "The Description metadata of this image is: " +
pngInplace.GetQuery("/Text/Description").ToString()
Formas
23/10/2019 • 2 minutes to read • Edit Online
Windows Presentation Foundation (WPF ) proporciona compatibilidad para dibujar formas básicas mediante el
Shape clase. Los objetos de forma que se derivan de FrameworkElement y por lo tanto, participar en el sistema de
diseño y se pueden dibujar usando simplemente Lenguaje XAML (Extensible Application Markup Language).
En esta sección
Información general sobre formas y dibujo básico en WPF
Temas "Cómo..."
Vea también
Shape
Imágenes y gráficos 2D
Gráficos y multimedia
Información general sobre formas y dibujo básico
en WPF
03/02/2020 • 15 minutes to read • Edit Online
En este tema se proporciona información general sobre cómo dibujar con objetos Shape. Un Shape es un tipo
de UIElement que permite dibujar una forma en la pantalla. Dado que son elementos de interfaz de usuario, se
pueden usar Shape objetos dentro de Panel elementos y la mayoría de los controles.
Windows Presentation Foundation (WPF ) ofrece varias capas de acceso a gráficos y servicios de
representación. En la capa superior, los objetos Shape son fáciles de usar y proporcionan muchas
características útiles, como el diseño y la participación en el sistema de eventos Windows Presentation
Foundation (WPF ).
Objetos Shape
WPF proporciona varios objetos Shape listos para usar. Todos los objetos de forma se heredan de la clase
Shape. Los objetos de forma disponibles incluyen Ellipse, Line, Path, Polygon, Polyliney Rectangle. Shape
objetos comparten las siguientes propiedades comunes.
Stroke: describe cómo se pinta el contorno de la forma.
StrokeThickness: describe el grosor del contorno de la forma.
Fill: describe cómo se pinta el interior de la forma.
Propiedades de datos para especificar coordenadas y vértices, medidos en píxeles independientes del
dispositivo.
Dado que se derivan de UIElement, los objetos de forma se pueden usar dentro de los paneles y la mayoría de
los controles. El panel de Canvas es una opción especialmente adecuada para crear dibujos complejos porque
admite el posicionamiento absoluto de sus objetos secundarios.
La clase Line permite dibujar una línea entre dos puntos. En el ejemplo siguiente se muestran varias maneras
de especificar coordenadas de línea y propiedades de trazo.
<Canvas Height="300" Width="300">
</Canvas>
Aunque la clase Line proporciona una propiedad Fill, establecerla no tiene ningún efecto porque un Line no
tiene área.
Otra forma común es la Ellipse. Cree una Ellipse definiendo las propiedades Width y Height de la forma. Para
dibujar un círculo, especifique una Ellipse cuyos valores de Width y Height sean iguales.
<Ellipse
Fill="Yellow"
Height="100"
Width="200"
StrokeThickness="2"
Stroke="Black"/>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
namespace SDKSample
{
public partial class SetBackgroundColorOfShapeExample : Page
{
public SetBackgroundColorOfShapeExample()
{
// Create a StackPanel to contain the shape.
StackPanel myStackPanel = new StackPanel();
this.Content = myStackPanel;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Shapes
Namespace SDKSample
Partial Public Class SetBackgroundColorOfShapeExample
Inherits Page
Public Sub New()
' Create a StackPanel to contain the shape.
Dim myStackPanel As New StackPanel()
Me.Content = myStackPanel
End Sub
End Class
End Namespace
Para obtener más información sobre PathGeometry y las demás clases de Geometry, consulte la información
general sobre geometría.
Sintaxis abreviada de XAML
En Lenguaje XAML (Extensible Application Markup Language), también puede usar una sintaxis abreviada
especial para describir un Path. En el ejemplo siguiente, se utiliza la sintaxis abreviada para dibujar una forma
compleja.
La cadena de atributo de Data comienza con el comando "moveTo", indicado por M, que establece un punto de
inicio para la ruta de acceso en el sistema de coordenadas del Canvas. Path parámetros de datos distinguen
mayúsculas de minúsculas. La letra M mayúscula indica una ubicación absoluta para el nuevo punto actual.
Una m minúscula indica coordenadas relativas. El primer segmento es una curva de Bézier cúbica que
comienza en (100,200) y termina en (400,175), trazado con los dos puntos de control (100,25) y (400,350).
Este segmento se indica mediante el comando C en la cadena de atributo Data. De nuevo, la C mayúscula
indica una ruta de acceso absoluta; la c minúscula indicaría una ruta de acceso relativa.
El segundo segmento comienza con un comando H "lineto" horizontal absoluto, que especifica una línea
trazada desde el punto de conexión del subtrazado anterior (400,175) hasta un nuevo punto de conexión
(280,175). Dado que es un comando "lineTo" horizontal, el valor especificado es una coordenada x.
Para obtener la sintaxis de ruta de acceso completa, vea la referencia de Data y crear una forma mediante
PathGeometry.
Pintar formas
Brush objetos se utilizan para pintar el Stroke y el Fillde una forma. En el ejemplo siguiente, se especifican el
trazo y el relleno de un Ellipse. Tenga en cuenta que una entrada válida para las propiedades del pincel puede
ser una palabra clave o el valor de color en formato hexadecimal. Para obtener más información sobre las
palabras clave de color disponibles, consulte propiedades de la clase Colors en el espacio de nombres
System.Windows.Media.
<Canvas Background="LightGray">
<Ellipse
Canvas.Top="50"
Canvas.Left="50"
Fill="#FFFFFF00"
Height="75"
Width="75"
StrokeThickness="5"
Stroke="#FF0000FF"/>
</Canvas>
Como alternativa, puede usar la sintaxis de elementos de propiedad para crear explícitamente un objeto
SolidColorBrush para pintar la forma con un color sólido.
<!-- This polygon shape uses pre-defined color values for its Stroke and
Fill properties.
The SolidColorBrush's Opacity property affects the fill color in
this case by making it slightly transparent (opacity of 0.4) so
that it blends with any underlying color. -->
<Polygon
Points="300,200 400,125 400,275 300,200"
Stroke="Purple"
StrokeThickness="2">
<Polygon.Fill>
<SolidColorBrush Color="Blue" Opacity="0.4"/>
</Polygon.Fill>
</Polygon>
También puede pintar el trazo o relleno de una forma con degradados, imágenes, patrones y mucho más. Para
obtener más información, consulte la información General sobre el dibujo con colores sólidos y degradados.
Formas extensibles
Todas las clases Line, Path, Polygon, Polyliney Rectangle tienen una propiedad Stretch. Esta propiedad
determina cómo se ajusta el contenido de un objeto Shape (la forma que se va a dibujar) para rellenar el
espacio de diseño del objeto Shape. El espacio de diseño de un objeto Shape es la cantidad de espacio que el
sistema de diseño asigna al Shape, debido a un valor de Width explícito y Height, o debido a su configuración
HorizontalAlignment y VerticalAlignment. Para obtener información adicional sobre el diseño en Windows
Presentation Foundation, consulte información general de diseño .
La propiedad Stretch puede tener uno de los siguientes valores:
None: el contenido del objeto de Shape no se ajusta.
Fill: el contenido del objeto de Shape se ajusta para rellenar el espacio de diseño. No se mantiene la
relación de aspecto.
Uniform: el contenido del objeto de Shape se ajusta tanto como sea posible para rellenar el espacio de
diseño a la vez que conserva su relación de aspecto original.
UniformToFill: el contenido del objeto de la Shape se ajusta para rellenar completamente su espacio de
diseño conservando la relación de aspecto original.
Tenga en cuenta que, cuando se ajusta el contenido de un objeto Shape, el contorno del objeto Shape se pinta
después de la ampliación.
En el ejemplo siguiente, se usa un Polygon para dibujar un triángulo muy pequeño de (0,0) a (0,1) a (1,1). Los
Width y Height del objeto de Polygon se establecen en 100 y su propiedad Stretch está establecida en Fill.
Como resultado, el contenido del objeto Polygon (el triángulo) se ajusta para rellenar el espacio mayor.
<Polygon
Points="0,0 0,1 1,1"
Fill="Blue"
Width="100"
Height="100"
Stretch="Fill"
Stroke="Black"
StrokeThickness="2" />
Transformar formas
La clase Transform proporciona los medios para transformar las formas en un plano bidimensional. Los
distintos tipos de transformaciones incluyen la rotación (RotateTransform), la escala (ScaleTransform), el sesgo
(SkewTransform) y la traslación (TranslateTransform).
Una transformación común para aplicar a una forma es la rotación. Para girar una forma, cree un
RotateTransform y especifique su Angle. Un Angle de 45 gira el elemento 45 grados en el sentido de las agujas
del reloj; un ángulo de 90 gira el elemento 90 grados en el sentido de las agujas del reloj; etc. Establezca las
propiedades CenterX y CenterY si desea controlar el punto sobre el que se gira el elemento. Estos valores de
propiedad se expresan en el espacio de coordenadas del elemento que se va a transformar. CenterX y CenterY
tienen valores predeterminados de cero. Por último, aplique el RotateTransform al elemento. Si no desea que
la transformación afecte al diseño, establezca la propiedad RenderTransform de la forma.
En el ejemplo siguiente, se usa un RotateTransform para girar una forma 45 grados sobre la esquina superior
izquierda de la forma (0,0).
<!-- Rotates the Polyline 45 degrees about the point (0,0). -->
<Polyline Points="25,25 0,50 25,75 50,50 25,25 25,0"
Stroke="Blue" StrokeThickness="10"
Canvas.Left="75" Canvas.Top="50">
<Polyline.RenderTransform>
<RotateTransform CenterX="0" CenterY="0" Angle="45" />
</Polyline.RenderTransform>
</Polyline>
En el ejemplo siguiente, otra forma se gira 45 grados, pero esta vez se gira alrededor del punto (25,50).
<!-- Rotates the Polyline 45 degrees about its center. -->
<Polyline
Points="25,25 0,50 25,75 50,50 25,25 25,0"
Stroke="Blue" StrokeThickness="10"
Canvas.Left="75" Canvas.Top="50"
RenderTransformOrigin="0.5,0.5">
<Polyline.RenderTransform>
<RotateTransform Angle="45" />
</Polyline.RenderTransform>
</Polyline>
En los ejemplos anteriores, se aplicó una única transformación a cada objeto de forma. Para aplicar varias
transformaciones a una forma (o cualquier otro elemento de la interfaz de usuario), use una TransformGroup.
Consulte también
Imágenes y gráficos 2D
Información general sobre el dibujo con colores sólidos y degradados
Información general sobre geometría
Tutorial: Mi primera aplicación de escritorio WPF
Información general sobre animaciones
Temas "Cómo..." de formas
23/10/2019 • 2 minutes to read • Edit Online
Los temas de esta sección muestran cómo usar Shape objetos que se va a dibujar formas básicas en la pantalla.
En esta sección
Dibujar una forma cerrada utilizando el elemento Polygon
Dibujar una elipse o un círculo
Dibujar una línea
Dibujar una Polilínea mediante el uso del elemento Polyline
Dibujar un rectángulo
Modificar el extremo en el final de una línea o segmento
Vea también
Shape
Gráficos y multimedia
Cómo: Dibujar una forma cerrada utilizando el
elemento Polygon
20/02/2020 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo dibujar una forma cerrada utilizando el elemento Polygon. Para dibujar una
forma cerrada, cree un elemento Polygon y utilice su propiedad Points para especificar los vértices de una forma.
Se dibuja automáticamente una línea que conecta los puntos primero y último. Por último, especifique un Fill, un
Strokeo ambos.
Ejemplo
En Lenguaje XAML (Extensible Application Markup Language), la sintaxis válida para los puntos es una lista
delimitada por espacios de pares de coordenadas x e y separadas por comas.
</Canvas>
Aunque en el ejemplo se usa una Canvas para contener los polígonos, puede utilizar elementos Polygon (y todos
los demás elementos de forma) con cualquier Panel o Control que admita contenido que no sea de texto.
Este ejemplo forma parte de un ejemplo más grande; para obtener el ejemplo completo, vea ejemplo de elementos
de forma.
Cómo: Dibujar una elipse o un círculo
20/02/2020 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo dibujar elipses y círculos mediante el elemento Ellipse. Para dibujar una elipse,
cree un elemento Ellipse y especifique su Width y Height. Utilice su propiedad Fill para especificar el Brush que se
utiliza para pintar el interior de la elipse. Utilice su propiedad Stroke para especificar el Brush que se usa para
pintar el contorno de la elipse. La propiedad StrokeThickness especifica el grosor del contorno de la elipse.
Para dibujar un círculo, convierta el Width y Height del elemento Ellipse igual entre sí.
En el ejemplo siguiente se dibujan cuatro elementos Ellipse dentro de un Canvas.
Ejemplo
<Canvas Height="200" Width="200">
<!-- Draws an oval with a blue interior and a black outline. -->
<Ellipse
Width="100"
Height="50"
Fill="Blue"
Stroke="Black"
StrokeThickness="4"
Canvas.Left="10"
Canvas.Top="100"/>
<!-- Draws a circle with a blue interior and a black outline. -->
<Ellipse
Width="50"
Height="50"
Stroke="Black"
StrokeThickness="4"
Canvas.Left="135"
Canvas.Top="100" />
</Canvas>
Aunque en este ejemplo se usa una Canvas para contener los puntos suspensivos, se pueden usar elementos
Ellipse (y todos los demás elementos Shape) con cualquier Panel o Control que admita contenido que no sea de
texto.
Este ejemplo forma parte de un ejemplo más grande; para obtener el ejemplo completo, vea ejemplo de elementos
de forma.
Consulte también
Ellipse
Shape
Ejemplo de elementos de forma
Cómo: Dibujar una línea
20/02/2020 • 2 minutes to read • Edit Online
Ejemplo
<Canvas Height="300" Width="300">
</Canvas>
Este ejemplo forma parte de un ejemplo más grande; para obtener el ejemplo completo, vea ejemplo de elementos
de forma.
Consulte también
Line
Ejemplo de elementos de forma
Cómo: Dibujar una polilínea mediante el uso del
elemento Polyline
20/02/2020 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo dibujar una polilínea, que es una serie de líneas conectadas, mediante el
elemento Polyline.
Para dibujar una polilínea, cree un elemento Polyline y utilice su propiedad Points para especificar los vértices de la
forma. Por último, use las propiedades Stroke y StrokeThickness para describir el contorno de la polilínea porque
una línea sin trazo es invisible.
NOTE
Dado que el elemento Polyline no es una forma cerrada, la propiedad Fill no tiene ningún efecto, aunque cierre
deliberadamente el contorno de la forma. Para crear una forma cerrada con un Fill, use un elemento Polygon.
Ejemplo
En Lenguaje XAML (Extensible Application Markup Language), la sintaxis válida para los puntos es una lista
delimitada por espacios de pares de coordenadas x e y separadas por comas.
<Polyline
Points="10,110 60,10 110,110"
Stroke="Black"
StrokeThickness="4" />
<Polyline
Points="10,110 110,110 110,10"
Stroke="Black"
StrokeThickness="4"
Canvas.Left="150" />
</Canvas>
Aunque en este ejemplo se usa una Canvas para contener las polilíneas, puede utilizar elementos Polyline (y todos
los demás elementos Shape) con cualquier Panel o Control que admita contenido que no sea de texto.
Este ejemplo forma parte de un ejemplo más grande; para obtener el ejemplo completo, vea ejemplo de elementos
de forma.
Consulte también
Polyline
Polygon
Shape
Ejemplo de elementos de forma
Información general sobre formas y dibujo básico en WPF
Cómo: Dibujar un rectángulo
20/02/2020 • 2 minutes to read • Edit Online
Ejemplo
<Canvas Width="120" Height="200" >
</Canvas>
Aunque en este ejemplo se usa un Canvas para contener los rectángulos, puede utilizar elementos de rectángulo (y
todos los demás elementos de forma) con cualquier Panel o Control que admita contenido que no sea de texto. De
hecho, los rectángulos son especialmente útiles para proporcionar el fondo para partes de los paneles de Grid.
Para obtener un ejemplo, vea la información generalde la tabla.
Este ejemplo forma parte de un ejemplo más grande; para obtener el ejemplo completo, vea ejemplo de elementos
de forma.
Consulte también
Rectangle
Ejemplo de elementos de forma
Información general sobre formas y dibujo básico en WPF
Información general sobre las tablas
Cómo: Modificar el extremo en el final de una línea o
segmento
20/02/2020 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo modificar la forma al principio o al final de un elemento de Shape abierto. Para
cambiar el extremo al principio de un Shapeabierto, utilice su propiedad StrokeStartLineCap. Para cambiar el
extremo al final de un Shapeabierto, utilice su propiedad StrokeEndLineCap. Para ver los límites de línea
disponibles, consulte la enumeración PenLineCap.
NOTE
Esta propiedad solo afecta a una forma abierta, como un Line, un Polylineo un elemento Path abierto.
En el ejemplo siguiente se dibujan cuatro elementos Polyline y se utiliza un conjunto diferente de formas en los
extremos de cada uno de ellos.
Ejemplo
<TextBlock Grid.Column="3" Grid.Row="0" Grid.ColumnSpan="2">
<Bold>Line Caps</Bold>
</TextBlock>
<TextBlock Grid.Column="3" Grid.Row="1">Flat</TextBlock>
<Polyline
Points="50,50 75,30 100,100 130,40"
Stroke="Red"
StrokeThickness="20"
StrokeStartLineCap="Flat"
StrokeEndLineCap="Flat"
Grid.Row="1" Grid.Column="4"/>
Este ejemplo forma parte de un ejemplo más grande; para obtener el ejemplo completo, vea ejemplo de elementos
de forma.
Consulte también
Polyline
PenLineCap
Transformaciones
23/10/2019 • 2 minutes to read • Edit Online
Las transformaciones se usan para girar, escalar, traducir o sesgar FrameworkElement objetos.
En esta sección
Información general sobre transformaciones
Temas "Cómo..."
Vea también
Transform
Gráficos y multimedia
Información general sobre la representación de gráficos en WPF
Diseño
Información general sobre transformaciones
04/11/2019 • 13 minutes to read • Edit Online
En este tema se describe cómo utilizar las clases de Transform 2D para girar, escalar, desplazar (trasladar) y
sesgar objetos de FrameworkElement.
NOTE
Windows Presentation Foundation (WPF) usa matrices de filas principales. Los vectores se expresan como vectores de fila,
no como vectores de columna.
Manipulando los valores de la matriz, puede girar, escalar, sesgar y mover (trasladar) un objeto.Por ejemplo, si
cambia el valor de la primera columna de la tercera fila (el valor OffsetX) a 100, puede utilizarlo para desplace
un objeto 100 unidades a lo largo del eje x. Si cambia a 3 el valor de la segunda columna de la segunda fila,
puede usarlo para triplicar el alto actual de un objeto. Si cambia ambos valores, mueve el objeto 100 unidades a
lo largo del eje X y ajusta su alto a un factor de 3. Dado que Windows Presentation Foundation (WPF ) solo
admite transformaciones afines, los valores de la columna derecha siempre son 0, 0, 1.
Aunque Windows Presentation Foundation (WPF ) permite manipular directamente los valores de la matriz,
también proporciona varias clases Transform que permiten transformar un objeto sin saber cómo se configura
la estructura de la matriz subyacente. Por ejemplo, la clase ScaleTransform permite escalar un objeto
estableciendo sus propiedades ScaleX y ScaleY, en lugar de manipular una matriz de transformación. Del
mismo modo, la clase RotateTransform permite girar un objeto simplemente estableciendo su propiedad Angle.
Clases Transform
Windows Presentation Foundation (WPF ) proporciona las siguientes clases de Transform 2D para operaciones
de transformación comunes:
CLASE DESCRIPCIÓN EJEMPLO ILUSTRACIÓN
Para crear transformaciones más complejas, Windows Presentation Foundation (WPF ) proporciona las dos
clases siguientes:
Windows Presentation Foundation (WPF ) también proporciona transformaciones 3D. Para obtener más
información, vea la clase Transform3D.
ContainerVisual Transform
DrawingGroup Transform
Geometry Transform
TextEffect Transform
UIElement RenderTransform
Rotación de 45 grados en el sentido de las agujas del reloj desde la esquina superior izquierda
<Border Margin="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
BorderBrush="Black" BorderThickness="1" >
<StackPanel Orientation="Vertical">
<Button Content="A Button" Opacity="1" />
<Button Content="Rotated Button">
<Button.RenderTransform>
<RotateTransform Angle="45" />
</Button.RenderTransform>
</Button>
<Button Content="A Button" Opacity="1" />
</StackPanel>
</Border>
En el ejemplo siguiente también se usa un RotateTransform para girar un botón 45 grados en el sentido de las
agujas del reloj, pero también se establece el RenderTransformOrigin del botón en (0,5, 0,5). El valor de la
propiedad RenderTransformOrigin es relativo al tamaño del botón. Como resultado, la rotación se aplica al
centro del botón en lugar de a la esquina superior izquierda. En la ilustración siguiente se muestra el resultado
de la transformación.
Rotación de 45 grados en el sentido de las agujas del reloj alrededor del centro
<Border Margin="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
BorderBrush="Black" BorderThickness="1">
<StackPanel Orientation="Vertical">
<Button Content="A Button" Opacity="1" />
<Button Content="Rotated Button"
RenderTransformOrigin="0.5,0.5">
<Button.RenderTransform>
<RotateTransform Angle="45" />
</Button.RenderTransform>
</Button>
<Button Content="A Button" Opacity="1" />
</StackPanel>
</Border>
<Border Margin="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
BorderBrush="Black" BorderThickness="1">
<StackPanel Orientation="Vertical">
Animación de transformaciones
Dado que heredan de la clase Animatable, las clases de Transform se pueden animar. Para animar un Transform,
aplique una animación de un tipo compatible a la propiedad que desee animar.
En el ejemplo siguiente se usa un Storyboard y un DoubleAnimation con un RotateTransform para hacer que
un Button gire en su lugar cuando se hace clic en él.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Button Animated RotateTransform Example"
Background="White" Margin="50">
<StackPanel>
</StackPanel>
</Page>
Para ver el ejemplo completo, consulte Ejemplo de transformaciones 2D. Para más información sobre
animaciones, vea Información general sobre animaciones.
Vea también
Transform
Matrix
Temas "Cómo..."
Ejemplo de transformaciones 2D
Temas "Cómo..." de transformaciones
23/10/2019 • 2 minutes to read • Edit Online
Los temas de esta sección describen cómo aplicar distintas transformaciones a los objetos.
En esta sección
Aplicar una transformación a un elemento cuando se provoca un evento
Aplicar varias transformaciones a un objeto
Hacer que un elemento gire en su posición
Girar un objeto
Ajustar la escala de un elemento
Sesgar un elemento
Especificar el origen de una transformación utilizando valores relativos
Trasladar un elemento
Utilizar un objeto MatrixTransform para crear transformaciones personalizadas
Vea también
Transform
Gráficos y multimedia
Información general sobre la representación de gráficos en WPF
Diseño
Procedimiento Aplicar una transformación a un
elemento cuando se produce un evento
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo aplicar un ScaleTransform cuando se produce un evento. El concepto que se
muestra aquí es el mismo que se utiliza para aplicar otros tipos de transformaciones. Para obtener más
información acerca de los tipos de transformaciones disponibles, consulte el Transform clase o información general
sobre transformaciones.
Puede aplicar una transformación a un elemento de cualquiera de estas dos maneras:
Si lo hace no desea que la transformación afecte al diseño, utilice el RenderTransform propiedad del
elemento.
Si desea que la transformación afecte al diseño, utilice el LayoutTransform propiedad del elemento.
El ejemplo siguiente aplica un ScaleTransform a la RenderTransform propiedad de un botón. Cuando se mueve el
mouse sobre el botón, el ScaleX y ScaleY propiedades de la ScaleTransform se establecen en 2 , lo que hace que el
botón se agrande. Cuando el mouse se aleja del botón, ScaleX y ScaleY se establecen en 1 , lo que hace que el
botón para volver a su tamaño original.
Ejemplo
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WCSample.TransformExample"
WindowTitle="Transform on Mouse Enter Example">
<Canvas Width="400" Height="400">
</Canvas>
</Page>
Vea también
Transform
ScaleTransform
Información general sobre transformaciones
Temas "Cómo..."
Información general sobre eventos enrutados
Cómo: Aplicar varias transformaciones a un objeto
20/02/2020 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un TransformGroup para agrupar dos o más objetos de Transform en un
solo Transformcompuesto.
Ejemplo
En el ejemplo siguiente se usa un TransformGroup para aplicar un ScaleTransform y un RotateTransform a un
Button.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<StackPanel Margin="50">
<Button
RenderTransformOrigin="0.5,0.5"
HorizontalAlignment="Center">Click
<Button.RenderTransform>
<!-- Triple the size (scale) of the button in the Y direction. -->
<ScaleTransform ScaleY="3" />
</TransformGroup>
</Button.RenderTransform>
</Button>
</StackPanel>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace SDKSample
{
public partial class MultipleTransformsExample : Page
{
public MultipleTransformsExample()
{
// Create a Button that will have two transforms applied to it.
Button myButton = new Button();
myButton.Content = "Click";
Namespace SDKSample
Partial Public Class MultipleTransformsExample
Inherits Page
Public Sub New()
' Create a Button that will have two transforms applied to it.
Dim myButton As New Button()
myButton.Content = "Click"
End Sub
End Class
End Namespace
Consulte también
RenderTransform
TransformGroup
Información general sobre transformaciones
Ejemplo de transformaciones 2D
Cómo: Hacer que un elemento gire en su posición
20/02/2020 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo hacer que un elemento gire mediante un RotateTransform y un
DoubleAnimation.
En el ejemplo siguiente se aplica el RotateTransform a la propiedad RenderTransform del elemento. En el ejemplo
se usa un DoubleAnimation para animar el Angle de la RotateTransform. Para hacer que el elemento gire en su
lugar, en el ejemplo se establece la propiedad RenderTransformOrigin del elemento en el punto (0,5, 0,5).
Ejemplo
<!-- RotateAboutCenterExample.xaml
This example shows how to make an element spin
about its center. -->
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Microsoft.Samples.Animation.RotateAboutCenterExample"
WindowTitle="Rotate About Center Example">
<StackPanel Margin="50">
<Button
RenderTransformOrigin="0.5,0.5"
HorizontalAlignment="Left">
Hello,World
<Button.RenderTransform>
<RotateTransform x:Name="MyAnimatedTransform" Angle="0" />
</Button.RenderTransform>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyAnimatedTransform"
Storyboard.TargetProperty="(RotateTransform.Angle)"
From="0.0" To="360" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Page>
Para obtener el ejemplo completo, que incluye más ejemplos de transformación, vea ejemplo de transformaciones
2D.
Consulte también
Información general sobre animaciones
Información general sobre transformaciones
Procedimiento Girar un objeto
23/10/2019 • 3 minutes to read • Edit Online
Este ejemplo muestra cómo girar un objeto. El ejemplo crea primero un RotateTransform y, a continuación,
especifica su Angle en grados.
En el ejemplo siguiente se gira un Polyline objeto 45 grados sobre su esquina superior izquierda.
Ejemplo
<Canvas Height="200" Width="200">
<!-- Rotates the Polyline 45 degrees about the point (0,0). -->
<Polyline Points="25,25 0,50 25,75 50,50 25,25 25,0"
Stroke="Blue" StrokeThickness="10"
Canvas.Left="75" Canvas.Top="50">
<Polyline.RenderTransform>
<RotateTransform CenterX="0" CenterY="0" Angle="45" />
</Polyline.RenderTransform>
</Polyline>
</Canvas>
// Create a Polyline.
Polyline polyline1 = new Polyline();
polyline1.Points.Add(new Point(25, 25));
polyline1.Points.Add(new Point(0, 50));
polyline1.Points.Add(new Point(25, 75));
polyline1.Points.Add(new Point(50, 50));
polyline1.Points.Add(new Point(25, 25));
polyline1.Points.Add(new Point(25, 0));
polyline1.Stroke = Brushes.Blue;
polyline1.StrokeThickness = 10;
El CenterX y CenterY propiedades de la RotateTransform especificar el punto sobre el que se gira el objeto. Este
punto central se expresa en el espacio de coordenadas del elemento que se transforma. De forma predeterminada,
la rotación se aplica a (0,0), que es la esquina superior izquierda del objeto que transformar.
El siguiente ejemplo se gira un Polyline objeto hacia la derecha 45 grados sobre el punto (25,50).
<!-- Rotates the Polyline 45 degrees about the point (25,50). -->
<Polyline Points="25,25 0,50 25,75 50,50 25,25 25,0"
Stroke="Blue" StrokeThickness="10"
Canvas.Left="75" Canvas.Top="50">
<Polyline.RenderTransform>
<RotateTransform CenterX="25" CenterY="50" Angle="45" />
</Polyline.RenderTransform>
</Polyline>
</Canvas>
// Create a Polyline.
Polyline polyline2 = new Polyline();
polyline2.Points = polyline1.Points;
polyline2.Stroke = Brushes.Blue;
polyline2.StrokeThickness = 10;
Vea también
Transform
Información general sobre transformaciones
Temas "Cómo..."
Procedimiento Ajustar la escala de un elemento
23/10/2019 • 2 minutes to read • Edit Online
Ejemplo
<!-- Scales a rectangle by 200% from a center of (0,0).-->
<Rectangle Height="50" Width="50" Fill="#CCCCCCFF"
Stroke="Blue" StrokeThickness="2"
Canvas.Left="100" Canvas.Top="100">
<Rectangle.RenderTransform>
<ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="2" />
</Rectangle.RenderTransform>
</Rectangle>
Normalmente, se establece CenterX y CenterY al centro del objeto que se escala: (Width/2, Height /2).
El ejemplo siguiente muestra otro Rectangle que tiene el doble de tamaño; sin embargo, esto ScaleTransform tiene
un valor de 25 para ambos CenterX y CenterY, que se corresponde con el centro del rectángulo.
La siguiente ilustración muestra la diferencia entre los dos ScaleTransform operaciones. La línea de puntos
muestra el tamaño y la posición del rectángulo antes de escalar.
Dos operaciones de ScaleTransform con valores idénticos de ScaleX y ScaleY pero con centros diferentes
Para ver el ejemplo completo, consulte Ejemplo de transformaciones 2D.
Vea también
Transform
ScaleTransform
Información general sobre transformaciones
Temas "Cómo..."
Procedimiento Sesgar un elemento
23/10/2019 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un SkewTransform para sesgar un elemento. Un sesgo, también conocido
como distorsión, es una transformación que expande el espacio de coordenadas de una manera no uniforme. Un
uso típico de un SkewTransform para simular una profundidad 3D en objetos 2D.
Use la CenterX y CenterY propiedades para especificar el centro de punto de la SkewTransform.
Use la AngleX y AngleY propiedades para especificar el ángulo de sesgado de los ejes x y y y para sesgar el
sistema de coordenadas actual a lo largo de estos ejes.
Para predecir el efecto de una transformación de sesgo, considere la posibilidad de que AngleX sesga los valores
del eje x en relación con el sistema de coordenadas original. Por lo tanto, para un AngleX de 30, el eje y gira 30
grados a través del origen y sesga los valores de x-30 grados desde ese origen. Del mismo modo, un AngleY de 30
sesga los valores y de la forma 30 grados desde el origen. Tenga en cuenta que esto no tiene el mismo efecto que
trasladar (mover) el sistema de coordenadas 30 grados en x o y.
El ejemplo siguiente aplica un sesgo horizontal de 45 grados a un Rectangle desde un punto central de (0,0).
Ejemplo
<Rectangle
Height="50" Width="50" Fill="#CCCCCCFF"
Stroke="Blue" StrokeThickness="2"
Canvas.Left="100" Canvas.Top="100">
<Rectangle.RenderTransform>
El ejemplo siguiente aplica un sesgo horizontal de 45 grados a un Rectangle desde un punto central de (25,25).
El ejemplo siguiente aplica un sesgo vertical de 45 grados a un Rectangle desde un punto central de (25,25).
<Rectangle Height="50" Width="50" Fill="#CCCCCCFF"
Stroke="Blue" StrokeThickness="2"
Canvas.Left="100" Canvas.Top="100">
<Rectangle.RenderTransform>
La ilustración siguiente muestra los diferentes sesgos que se usan en este ejemplo.
Vea también
Transform
SkewTransform
Información general sobre transformaciones
Temas "Cómo..."
Procedimiento Especificar el origen de una
transformación mediante valores relativos
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo utilizar valores relativos para especificar el origen de un RenderTransform que
se aplica a un FrameworkElement.
Al girar, escalar o sesgar un FrameworkElement utilizando el RenderTransform propiedad, el valor
predeterminado aplica la transformación a la esquina superior izquierda del elemento. Si desea girar, escalar o
sesgar desde el centro del elemento, puede realizar la compensación estableciendo el centro de la transformación
en el centro del elemento. Sin embargo, esa solución requiere que conozca el tamaño del elemento. Una manera
más fácil de aplicar una transformación al centro de un elemento es establecer su RenderTransformOrigin
propiedad en (0,5, 0,5), en lugar de establecer un valor central en la propia transformación.
Ejemplo
En el ejemplo siguiente se usa un RotateTransform para girar un Button 45 grados a la derecha. Puesto que el
ejemplo no especifica un centro, el botón gira sobre el punto (0, 0), que está en la esquina superior izquierda. El
RotateTransform se aplica a la RenderTransform propiedad.
La siguiente ilustración muestra el resultado de la transformación del ejemplo siguiente.
<Border Margin="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
BorderBrush="Black" BorderThickness="1" >
<StackPanel Orientation="Vertical">
<Button Content="A Button" Opacity="1" />
<Button Content="Rotated Button">
<Button.RenderTransform>
<RotateTransform Angle="45" />
</Button.RenderTransform>
</Button>
<Button Content="A Button" Opacity="1" />
</StackPanel>
</Border>
El ejemplo siguiente se usa también un RotateTransform para girar un Button 45 grados a la derecha; sin
embargo, este ejemplo se establece la RenderTransformOrigin del botón en (0,5, 0,5). Como resultado, la rotación
se aplica al centro del botón en lugar de a la esquina superior izquierda.
La siguiente ilustración muestra el resultado de la transformación del ejemplo siguiente.
Una rotación de 45 grados utilizando la propiedad RenderTransform con un valor de RenderTransformOrigin de
(0,5, 0,5)
<Border Margin="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
BorderBrush="Black" BorderThickness="1">
<StackPanel Orientation="Vertical">
<Button Content="A Button" Opacity="1" />
<Button Content="Rotated Button"
RenderTransformOrigin="0.5,0.5">
<Button.RenderTransform>
<RotateTransform Angle="45" />
</Button.RenderTransform>
</Button>
<Button Content="A Button" Opacity="1" />
</StackPanel>
</Border>
Para obtener más información acerca de la transformación FrameworkElement objetos, vea el información
general sobre transformaciones.
Vea también
Transform
Información general sobre transformaciones
Temas "Cómo..."
Procedimiento Trasladar un elemento
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo trasladar (mover) un elemento mediante el uso de un TranslateTransform.
La TranslateTransform clase es especialmente útil para mover elementos dentro de paneles que no admiten el
posicionamiento absoluto. Por ejemplo, aplicando un TranslateTransform a la RenderTransform propiedad de un
elemento, puede mover un elemento dentro de un StackPanel o DockPanel.
Use la X propiedad de la TranslateTransform para especificar la cantidad, en píxeles, que moverá el elemento a lo
largo del eje x. Use el Y propiedad para especificar la cantidad, en píxeles, que moverá el elemento a lo largo del
eje y. Por último, aplique el TranslateTransform a la RenderTransform propiedad del elemento.
En el ejemplo siguiente se usa un TranslateTransform para mover un elemento 50 píxeles a la derecho y 50 píxeles
hacia abajo.
Ejemplo
<Rectangle Height="50" Width="50"
Fill="#CCCCCCFF" Stroke="Blue" StrokeThickness="2"
Canvas.Left="100" Canvas.Top="100">
<Rectangle.RenderTransform>
<TranslateTransform X="50" Y="50" />
</Rectangle.RenderTransform>
</Rectangle>
Vea también
Información general sobre transformaciones
Procedimiento Usar un objeto MatrixTransform para
crear transformaciones personalizadas
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo utilizar MatrixTransform un para trasladar (mover) la posición, el ajuste y el
Buttonsesgo de un.
NOTE
Utilice la MatrixTransform clase para crear transformaciones personalizadas no proporcionadas por las RotateTransformclases,
SkewTransform, ScaleTransformo TranslateTransform .
Ejemplo
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<StackPanel Margin="20">
<Canvas HorizontalAlignment="Left" Width="340" Height="240" >
<Button MinWidth="100">Click
<Button.RenderTransform>
<MatrixTransform x:Name="myMatrixTransform">
<MatrixTransform.Matrix >
Vea también
MatrixTransform
Transform
Información general sobre transformaciones
Temas "Cómo..."
Información general sobre formas y dibujo básico en WPF
Configuración del Registro en la representación de
gráficos
20/02/2020 • 9 minutes to read • Edit Online
En este tema se ofrece información general sobre la configuración del Registro en la representación de gráficos
WPF que afecta a las aplicaciones de WPF.
Configuración de registro
WPF proporciona cuatro parámetros de configuración del Registro para controlar la representación de WPF:
CONFIGURACIÓN DESCRIPCIÓN
Valor máximo de muestreo múltiple Especifica el grado de muestreo múltiple para el suavizado de
contorno de contenido 3D.
Configuración obligatoria de fecha del controlador de Especifica si el sistema deshabilita la aceleración de hardware
vídeo para los controladores publicados antes de noviembre de
2004.
Opción de uso del rasterizador de referencia Especifica si WPF debe utilizar el rasterizador de referencia.
Es posible acceder a estos parámetros mediante una utilidad de configuración externa que pueda hacer referencia
a la configuración del Registro de WPF. Esta configuración también se puede crear o modificar si se obtiene acceso
a los valores directamente mediante el editor del registro de Windows.
DWORD
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration
DWORD
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\MaxMultisampleType
El valor máximo de muestreo múltiple permite ajustar la cantidad máxima de suavizado de contorno del
contenido 3D. Use este nivel para deshabilitar el suavizado de contorno 3D en Windows Vista.
El valor máximo de muestreo múltiple es un valor DWORD comprendido entre 0 y 16. Un valor de 0 especifica
que debe deshabilitarse el suavizado de contorno de muestreo múltiple del contenido 3D y un valor de 16
intentará usar un suavizado de contorno de muestreo múltiple hasta 16 veces mayor, si la tarjeta de vídeo lo
admite. Tenga en cuenta que el establecimiento de este valor de clave del registro en los equipos que usan
controladores XPDM hará que las aplicaciones usen una gran cantidad de memoria de vídeo adicional, reduzcan el
rendimiento de la representación 3D y tenga el potencial de introducir errores de representación y estabilidad
surge.
Cuando no se establece esta clave del Registro, el valor predeterminado de WPF es 0 para los controladores
XPDM y 4 para los controladores WDDM.
String
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\RequiredVideoDriverDate
En noviembre de 2004, Microsoft publicó una nueva versión de las directrices de pruebas de controladores; los
controladores escritos después de esta fecha ofrecen una mayor estabilidad. De forma predeterminada, WPF usará
la canalización de aceleración de hardware para estos controladores y recurrirá a la representación de software
para los controladores XPDM publicados antes de esta fecha.
La configuración obligatoria de fecha del controlador de vídeo le permite especificar una fecha mínima
alternativa para los controladores XPDM. Solo se debe especificar una fecha anterior a noviembre de 2004 si está
seguro de que el controlador de vídeo es lo suficientemente estable como para admitir WPF.
La configuración obligatoria de fecha del controlador de vídeo adopta una cadena con el formato siguiente:
YYYY / mm / DD
Donde AAAA son los cuatro dígitos del año, MM son los dos dígitos del mes y DD son los dos dígitos del día.
Cuando este valor no se establece, WPF usa noviembre de 2004 como fecha obligatoria del controlador de vídeo.
DWORD
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\UseReferenceRasterizer
La opción usar rasterizador de referencia permite forzar el WPF en un modo de representación de hardware
simulado para la depuración: WPF entra en modo de hardware, pero usa el rasterizador de software de referencia
de Microsoft Direct3D, d3dref9. dll, en lugar de un dispositivo de hardware real.
El rasterizador de referencia es muy lento, pero omite el controlador de vídeo para evitar cualquier problema de
representación causado por problemas de controladores. Por este motivo, se puede usar el rasterizador de
referencia para determinar si los problemas de representación se deben al controlador de vídeo. El archivo
d3dref9.dll debe estar en una ubicación en la que la aplicación pueda acceder a él, como cualquier ubicación en la
ruta del sistema o el directorio local de la aplicación.
La opción de uso del rasterizador de referencia adopta un valor DWORD. Un valor de 0 indica que no se usa
el rasterizador de referencia. Cualquier otro valor distinto de cero fuerza a WPF a usar el rasterizador de referencia.
Consulte también
Niveles de representación de gráficos
Información general sobre la representación de gráficos en WPF
Temas "Cómo..." de gráficos
23/10/2019 • 2 minutes to read • Edit Online
Los temas siguientes muestran cómo usar las capacidades gráficas de la Windows Presentation Foundation
(WPF ).
En esta sección
Animar un rectángulo
Animar la posición de un objeto mediante PointAnimation
Transformar puntos y vectores
Ampliar el marco de vidrio en una aplicación de WPF
Cómo: Mejorar el rendimiento al almacenar en caché un elemento de la representación
Cómo: Usar un elemento almacenado en caché como pincel
Vea también
Shape
Transform
BitmapImage
Geometry
Drawing
Brush
BitmapEffect
Gráficos y multimedia
Información general sobre la representación de gráficos en WPF
Procedimiento Animar un rectángulo
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo animar los cambios de tamaño y posición de un rectángulo.
Ejemplo
En el ejemplo siguiente se usa una instancia de la RectAnimation clase se va a animar el Rect propiedad de un
RectangleGeometry, que anima los cambios de tamaño y posición del rectángulo.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Media;
namespace SDKSamples
{
public class RectAnimationExample : Page
{
public RectAnimationExample()
{
Content = containerCanvas;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Imports System.Windows.Media
Namespace SDKSamples
Public Class RectAnimationExample
Inherits Page
Public Sub New()
Content = containerCanvas
End Sub
End Class
End Namespace
Vea también
RectAnimation
Rect
RectangleGeometry
Información general sobre animaciones
Gráficos y multimedia
Temas de procedimientos de gráficos
Temas de procedimientos de temporización y animación
Procedimiento Animar la posición de un objeto
mediante PointAnimation
23/10/2019 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo usar el PointAnimation clase para animar un objeto a lo largo de un Path.
Ejemplo
En el ejemplo siguiente se mueve una elipse a lo largo de un Path desde un punto en la pantalla a otra. En el
ejemplo se anima la posición de un EllipseGeometry utilizando PointAnimation para animar el Center propiedad.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Media;
namespace SDKSamples
{
// This example shows how to use PointAnimation to animate the
// position of an ellipse by animating the Center property of an
// EllipseGeometry. PointAnimation is used because the Center property
// takes a Point value.
public class PointAnimationExample : Page
{
public PointAnimationExample()
{
Content = containerCanvas;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Imports System.Windows.Media
Namespace SDKSamples
' This example shows how to use PointAnimation to animate the
' position of an ellipse by animating the Center property of an
' EllipseGeometry. PointAnimation is used because the Center property
' takes a Point value.
Public Class PointAnimationExample
Inherits Page
Public Sub New()
Content = containerCanvas
End Sub
End Class
End Namespace
Vea también
PointAnimation
Path
EllipseGeometry
Center
Información general sobre animaciones
Gráficos y multimedia
Temas de procedimientos de gráficos
Temas de procedimientos de temporización y animación
Procedimiento Transformar puntos y vectores
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un Matrix transformar Point y Vector objetos.
Ejemplo
private void transformExamples()
{
//
// Transform a point.
//
Point myPoint = new Point(15,25);
//
// Transform an array of points.
//
Point[] myPointArray = new Point[]
{new Point(15,25), new Point(30,35)};
//
// Transform a vector.
//
Vector myVector = new Vector(15,25);
//
// Transform an array of vectors.
//
Vector[] myVectorArray = new Vector[]
{new Vector(15, 25), new Vector(30,35)};
En este tema se muestra cómo extender el marco Glass de Windows Vista en el área cliente de una aplicación
Windows Presentation Foundation (WPF ).
NOTE
Este ejemplo solo funcionará en un equipo con Windows Vista que ejecute el Administrador de ventanas de escritorio (DWM)
con Glass habilitado. Windows Vista Home Basic Edition no admite el efecto de cristal transparente. Las áreas que
normalmente se representarían con el efecto de cristal transparente en otras ediciones de Windows Vista se representan
opacas.
Ejemplo
En la imagen siguiente se muestra el marco Glass extendido en la barra de direcciones de Internet Explorer 7:
Para extender el marco Glass en una aplicación WPF, se necesita acceso a la API no administrada. En el ejemplo de
código siguiente se realiza una invocación de plataforma (PInvoke) para las dos API necesarias para extender el
marco en el área cliente. Cada una de estas API se declaran en una clase denominada NonClientRegionAPI.
[StructLayout(LayoutKind.Sequential)]
public struct MARGINS
{
public int cxLeftWidth; // width of left border that retains its size
public int cxRightWidth; // width of right border that retains its size
public int cyTopHeight; // height of top border that retains its size
public int cyBottomHeight; // height of bottom border that retains its size
};
[DllImport("DwmApi.dll")]
public static extern int DwmExtendFrameIntoClientArea(
IntPtr hwnd,
ref MARGINS pMarInset);
<StructLayout(LayoutKind.Sequential)>
Public Structure MARGINS
Public cxLeftWidth As Integer ' width of left border that retains its size
Public cxRightWidth As Integer ' width of right border that retains its size
Public cyTopHeight As Integer ' height of top border that retains its size
Public cyBottomHeight As Integer ' height of bottom border that retains its size
End Structure
<DllImport("DwmApi.dll")>
Public Shared Function DwmExtendFrameIntoClientArea(ByVal hwnd As IntPtr, ByRef pMarInset As MARGINS) As
Integer
End Function
DwmExtendFrameIntoClientArea es la función de DWM que amplia el marco en el área cliente. Toma dos
parámetros; un identificador de ventana y una estructura MARGINS. MARGINS se usa para indicarle al DWM
cuánto más debe ampliarse el marco en el área cliente.
Ejemplo
Para usar la función DwmExtendFrameIntoClientArea, debe obtenerse un identificador de ventana. En WPF, el
identificador de ventana se puede obtener de la propiedad Handle de una HwndSource. En el ejemplo siguiente, el
marco se extiende en el área cliente del evento Loaded de la ventana.
// Set Margins
NonClientRegionAPI.MARGINS margins = new NonClientRegionAPI.MARGINS();
Ejemplo
En el ejemplo siguiente se muestra una ventana simple en la que el marco se amplía en el área cliente. El marco se
extiende detrás del borde superior que contiene los dos objetos TextBox.
<Window x:Class="SDKSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Extended Glass in WPF" Height="300" Width="400"
Loaded="OnLoaded" Background="Transparent"
>
<Grid ShowGridLines="True">
<DockPanel Name="mainDock">
<!-- The border is used to compute the rendered height with margins.
topBar contents will be displayed on the extended glass frame.-->
<Border Name="topBar" DockPanel.Dock="Top" >
<Grid Name="grid">
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="100" Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" MinWidth="100" Margin="0,0,10,5">Path</TextBox>
<TextBox Grid.Column="1" MinWidth="75" Margin="0,0,0,5">Search</TextBox>
</Grid>
</Border>
<Grid DockPanel.Dock="Top" >
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" AcceptsReturn="True"/>
</Grid>
</DockPanel>
</Grid>
</Window>
Consulte también
Información general de Administrador de ventanas de escritorio
Información general sobre desenfoque Administrador de ventanas de escritorio
DwmExtendFrameIntoClientArea (DwmExtendFrameIntoClientArea [función])
Procedimiento para mejorar el rendimiento de la
representación mediante el almacenamiento en caché
de un elemento
23/10/2019 • 96 minutes to read • Edit Online
Use la BitmapCache clase para mejorar el rendimiento de la representación de un complejo UIElement. Para
almacenar en caché un elemento, crear una nueva instancia de la BitmapCache clase y se asigna a la propiedad del
elemento CacheMode propiedad. Puede volver a usar un BitmapCache eficazmente en un BitmapCacheBrush.
Ejemplo
El ejemplo de código siguiente muestra cómo crear un elemento complejo y lo almacena en caché como un mapa
de bits, lo que mejora el rendimiento cuando se anima el elemento. El elemento es un lienzo que contiene formas
geométricas con muchos vértices. Un BitmapCache no tiene valor predeterminado se asigna valores a la
CacheMode del lienzo, y una animación muestra la escala sin problemas del mapa de bits almacenado en caché.
<Window x:Class="CachedCompositionDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="bitmapCacheCanvas"
Storyboard.TargetProperty="(Canvas.RenderTransform).(ScaleTransform.ScaleX)"
From="0.5" To="4.0" Duration="0:0:4"
AutoReverse="True" RepeatBehavior="Forever" />
<DoubleAnimation
Storyboard.TargetName="bitmapCacheCanvas"
Storyboard.TargetProperty="(Canvas.RenderTransform).(ScaleTransform.ScaleY)"
From="0.5" To="4.0" Duration="0:0:4"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Window.Triggers>
<Canvas>
<Canvas x:Name="demoCanvas" Canvas.Top="10">
<Canvas Name='Popcan_xpr'>
<Canvas x:Name="bitmapCacheCanvas">
<Canvas.RenderTransform>
<ScaleTransform CenterX="200" CenterY="600"/>
</Canvas.RenderTransform>
</Canvas>
<Path Canvas.Left='397.111' Canvas.Top='270.871' Fill='#34FFFFFF' Data='F1 M
0.296112,0C 7.02383,6.12756 8.51117,17.194 7.75146,26.2622C 7.31982,29.4223 5.53839,32.2619 4.07693,35.0968L
3.73489,34.9761C 5.0965,32.134 6.84088,29.3306 7.27322,26.209C 8.04324,17.2848 6.48596,6.53064 0,0.31842L
0.296112,0'/>
</Canvas>
</Canvas>
</Canvas>
</Canvas>
</Canvas>
</Window>
Vea también
BitmapCache
BitmapCacheBrush
CacheMode
Cómo: Usar un elemento almacenado en caché como pincel
Procedimiento para usar un elemento almacenado
en caché como pincel
23/10/2019 • 2 minutes to read • Edit Online
Use la BitmapCacheBrush clase para reutilizar un elemento almacenado en caché eficazmente. Para almacenar en
caché un elemento, crear una nueva instancia de la BitmapCache clase y se asigna a la propiedad del elemento
CacheMode propiedad.
Ejemplo
El ejemplo de código siguiente muestra cómo reutilizar un elemento almacenado en caché. El elemento
almacenado en caché es un Image control que muestra una imagen grande. El Image control se almacena en
caché como un mapa de bits mediante el uso de la BitmapCache clase y la memoria caché se reutiliza mediante la
asignación a un BitmapCacheBrush. El pincel se asigna al fondo de veinticinco botones para mostrar una
reutilización eficiente.
<Window x:Class="BitmapCacheBrushDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Height="300" Width="300" >
<Window.Resources>
<RichTextBox x:Key="cachedRichTextBox" >
<RichTextBox.CacheMode>
<BitmapCache EnableClearType="True" RenderAtScale="1" SnapsToDevicePixels="True" />
</RichTextBox.CacheMode>
</RichTextBox>
Vea también
BitmapCache
BitmapCacheBrush
CacheMode
Cómo: Mejorar el rendimiento al almacenar en caché un elemento de la representación
Información general sobre gráficos 3D
23/10/2019 • 31 minutes to read • Edit Online
3D en un contenedor 2D
Gráficos 3D contenidos en WPF se encapsula en un elemento, Viewport3D, que puede participar en la
estructura de elementos bidimensionales. El sistema de gráficos trata Viewport3D como elementos visuales
bidimensionales, como muchos otros elementos de WPF. Viewport3D funciona como una ventana, una
ventanilla, en una escena tridimensional. Más concretamente, es una superficie en la que se proyecta una
escena 3D.
En una aplicación de 2-D convencional, utilice Viewport3D como lo haría con cualquier otro elemento
contenedor, como Grid o Canvas. Aunque puede usar Viewport3D con otros objetos de dibujo 2D en el mismo
gráfico de escena, no puede interpenetrar objetos 2D y 3D en un Viewport3D. En este tema se centrará en cómo
dibujar gráficos en 3D dentro de la Viewport3D.
Espacio de coordenadas 3D
El WPF del sistema de coordenadas para gráficos 2D localiza el origen en la parte superior izquierda del área
de representación (que suele ser la pantalla). En el sistema 2D, los valores positivos del eje X se extienden hacia
la derecha, y los valores positivos del eje Y se extienden hacia abajo. En el sistema de coordenadas 3D, sin
embargo, el origen se encuentra en el centro del área de representación, con valores positivos del eje x hacia la
derecha pero valores positivos del eje y continuando hacia arriba en su lugar y los valores del eje z positivo
extienden hacia el exterior partiendo del origen , hacia el espectador.
Cámaras y proyecciones
Los desarrolladores que trabajan en 2D están acostumbrados a colocar los elementos de dibujo primitivos en
una pantalla bidimensional. Al crear una escena 3D, es importante recordar que realmente está creando una
representación 2D de objetos 3D. Dado que una escena 3D tiene un aspecto diferente dependiendo de la
perspectiva del espectador, debe especificar ese punto de vista. La Camera clase le permite especificar este
punto de vista de una escena 3D.
Es otra manera de comprender cómo se representa una escena 3D en una superficie 2D en describir dicha
escena como una proyección sobre la superficie de visualización. El ProjectionCamera le permite especificar
proyecciones diferentes y sus propiedades para cambiar cómo el espectador ve los modelos 3D. Un
PerspectiveCamera especifica una proyección en escorzo de la escena. En otras palabras, el PerspectiveCamera
proporciona una perspectiva de punto de fuga. Puede especificar la posición de la cámara en el espacio de
coordenadas de la escena, la dirección y el campo de visión de la cámara y un vector que define la dirección de
"arriba" en la escena. El siguiente diagrama ilustra la PerspectiveCamerade proyección.
El NearPlaneDistance y FarPlaneDistance propiedades de ProjectionCamera limite el intervalo de proyección
de la cámara. Dado que las cámaras se pueden ubicar en cualquier parte de la escena, es posible situarlas
dentro de un modelo o muy cerca de él, con lo que resultaría difícil distinguir correctamente los objetos.
NearPlaneDistance le permite especificar una distancia mínima de la cámara más allá del cual no se dibujarán
objetos. Por el contrario, FarPlaneDistance le permite especificar una distancia desde la cámara más allá del cual
no se dibujarán objetos, lo que garantiza que los objetos demasiado lejos para ser reconocibles no se incluirán
en la escena.
Posición de la cámara
OrthographicCamera Especifica una proyección ortogonal de un modelo 3D en una superficie visual 2D. Al
igual que otras cámaras, especifica una posición, dirección de visualización y dirección "hacia arriba". A
diferencia de PerspectiveCamera, sin embargo, OrthographicCamera describe una proyección que no incluye la
perspectiva en escorzo. En otras palabras, OrthographicCamera describe un cuadro de vista cuyos lados son
paralelos, en lugar de uno cuyos lados convergen en un punto de la cámara. La siguiente imagen muestra el
mismo modelo visto con PerspectiveCamera y OrthographicCamera.
' Defines the camera used to view the 3D object. In order to view the 3D object,
' the camera must be positioned and pointed such that the object is within view
' of the camera.
Dim myPCamera As New PerspectiveCamera()
En el ejemplo anterior, el Positions lista especifica ocho vértices para definir una malla en forma de cubo. El
TriangleIndices propiedad especifica una lista de doce grupos de tres índices. Cada número en la lista hace
referencia a un desplazamiento en el Positions lista. Por ejemplo, los tres primeros vértices especificados por el
Positions lista son (1,1,0), (0,1,0) y (0,0,0). Los tres primeros índices especificados por el TriangleIndices lista son
0, 2 y 1, que corresponden a la primera, en tercer lugar y segundo puntos en el Positions lista. Como resultado,
el primer triángulo que constituye el modelo del cubo se creará de (1,1,0) a (0,1,0) y a (0,0,0), y los once
triángulos restantes se determinarán de igual forma.
Puede seguir definiendo el modelo especificando valores para el Normals y TextureCoordinates propiedades.
Para representar la superficie del modelo, el sistema de gráficos necesita información sobre en qué dirección
mira la superficie de cualquier triángulo dado. Utiliza esta información para realizar los cálculos de iluminación
del modelo: las superficies que miran directamente hacia una fuente de luz parecen más luminosas que las que
tienen un ángulo que las oculta de la luz. Aunque WPF puede determinar los vectores normales
predeterminados utilizando las coordenadas de posición, también es posible especificar vectores normales
diferentes para crear un aspecto más aproximado de las superficies curvas.
El TextureCoordinates propiedad especifica una colección de Pointque indica el sistema de gráficos cómo
asignar las coordenadas que determinan cómo trazar una textura en los vértices de la malla.
TextureCoordinates se especifican como un valor comprendido entre 0 y 1, ambos incluidos. Igual que con el
Normals propiedad, el sistema de gráficos puede calcular las coordenadas de textura de predeterminado, pero
decide establecer coordenadas de textura diferentes para controlar la asignación de una textura que incluya
parte de un patrón repetitivo, por ejemplo. Encontrará más información sobre coordenadas de textura en los
temas siguientes o en el SDK de Managed Direct3D.
En el ejemplo siguiente se muestra cómo crear una cara del modelo del cubo en código de procedimiento.
Observe que puede dibujar el cubo completo como un solo objeto GeometryModel3D; en este ejemplo se
dibuja la cara del cubo como un modelo distinto a fin de aplicar después texturas independientes a cada cara.
side1Plane.TriangleIndices.Add(0);
side1Plane.TriangleIndices.Add(1);
side1Plane.TriangleIndices.Add(2);
side1Plane.TriangleIndices.Add(3);
side1Plane.TriangleIndices.Add(4);
side1Plane.TriangleIndices.Add(5);
side1Plane.TriangleIndices.Add(0)
side1Plane.TriangleIndices.Add(1)
side1Plane.TriangleIndices.Add(2)
side1Plane.TriangleIndices.Add(3)
side1Plane.TriangleIndices.Add(4)
side1Plane.TriangleIndices.Add(5)
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Cyan" Opacity="0.3"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<DrawingBrush x:Key="patternBrush" Viewport="0,0,0.1,0.1" TileMode="Tile">
<DrawingBrush.Drawing>
<DrawingGroup>
<DrawingGroup.Children>
<GeometryDrawing Geometry="M0,0.1 L0.1,0 1,0.9, 0.9,1z"
Brush="Gray" />
<GeometryDrawing Geometry="M0.9,0 L1,0.1 0.1,1 0,0.9z"
Brush="Gray" />
<GeometryDrawing Geometry="M0.25,0.25 L0.5,0.125 0.75,0.25 0.5,0.5z"
Brush="#FFFF00" />
<GeometryDrawing Geometry="M0.25,0.75 L0.5,0.875 0.75,0.75 0.5,0.5z"
Brush="Black" />
<GeometryDrawing Geometry="M0.25,0.75 L0.125,0.5 0.25,0.25 0.5,0.5z"
Brush="#FF0000" />
<GeometryDrawing Geometry="M0.75,0.25 L0.875,0.5 0.75,0.75 0.5,0.5z"
Brush="MediumBlue" />
</DrawingGroup.Children>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
Iluminación de la escena
Las luces en los gráficos 3D es ¿qué luces en el mundo real: permiten ver las superficies. Más concretamente,
las luces determinan qué parte de una escena se incluye en la proyección. Los objetos de luz en WPF crean
gran variedad de efectos de luz y sombra y siguen el modelo de comportamiento de diversas luces del mundo
real. Debe incluir por lo menos una luz en la escena, pues de lo contrario no habrá ningún modelo visible.
Las luces siguientes se derivan de la clase base Light:
AmbientLight: Proporciona iluminación de ambiente que ilumina todos los objetos uniformemente,
independientemente de su ubicación u orientación.
DirectionalLight: Ilumina como una fuente de luz distante. Las luces direccionales tienen un Direction
especificado como un Vector3D, pero ninguna ubicación concreta.
PointLight: Ilumina como una fuente de luz cercana. Las luces puntuales tienen posición y emiten la luz
desde esa posición. Los objetos de la escena se iluminan dependiendo de su posición y distancia con
respecto a la luz. PointLightBase expone un Range propiedad, que determina una distancia más allá del
cual no se iluminará los modelos por la luz. PointLight también expone propiedades de atenuación que
determinan cómo disminuye la intensidad de la luz con la distancia. Puede especificar interpolaciones
constantes, lineales o cuadráticas para la atenuación de la luz.
SpotLight: Se hereda de PointLight. Los focos de luz iluminan como las luces puntuales, y tienen
posición y dirección. Proyectan la luz en un área cónica establecido por InnerConeAngle y
OuterConeAngle propiedades, especificadas en grados.
Las luces son Model3D objetos, por lo que puede transformar y animar propiedades de la luz, incluida la
posición, color, dirección y rango.
<ModelVisual3D.Content>
<AmbientLight Color="#333333" />
</ModelVisual3D.Content>
myDirLight.Color = Colors.White;
myDirLight.Direction = new Vector3D(-3, -4, -5);
myDirLight.Color = Colors.White
myDirLight.Direction = New Vector3D(-3, -4, -5)
modelGroup.Children.Add(myDirLight);
modelGroup.Children.Add(myDirLight)
Transformación de modelos
Al crear modelos, estos tienen una ubicación determinada en la escena. Para mover esos modelos por la escena,
girarlos o cambiar su tamaño, no es práctico cambiar los vértices que definen los propios modelos. En lugar de
ello, al igual que en 2D, se aplican transformaciones a los modelos.
Cada objeto de modelo tiene un Transform propiedad con el que puede mover, reorientar o cambiar el tamaño
del modelo. Al aplicar una transformación, en realidad lo que se hace es desplazar todos los puntos del modelo
según un vector o valor especificado por la transformación. Es decir, se transforma el espacio de coordenadas
en el que se ha definido el modelo ("espacio del modelo"), pero no se cambian los valores que constituyen la
geometría del modelo en el sistema de coordenadas de la escena completa ("espacio universal").
Para más información acerca de la transformación de modelos, consulte Información general sobre
transformaciones de modelos 3D.
Animación de modelos
La implementación 3-D en WPF utiliza el mismo sistema de control de tiempo y animación que los gráficos 2D.
En otras palabras, para animar una escena 3D, se animan las propiedades de sus modelos. Es posible animar
directamente las propiedades de los elementos primitivos, pero suele ser más fácil animar las transformaciones
que cambian la posición o el aspecto de los modelos. Dado que se pueden aplicar transformaciones a
Model3DGroup objetos, así como los modelos individuales, es posible aplicar un conjunto de animaciones a un
elemento secundario de un Model3DGroup y otro conjunto de animaciones a un grupo de objetos secundarios.
También puede lograr gran variedad de efectos visuales animando las propiedades de iluminación de la escena.
Finalmente, si lo desea, puede animar la propia proyección, animando la posición de la cámara o el campo de
visión. Para información general sobre el sistema de control de tiempo y animación de WPF, consulte los temas
Información general sobre animaciones, Información general sobre objetos Storyboard y Información general
sobre objetos Freezable.
Para animar un objeto en WPF, se crea una escala de tiempo, se define una animación (que, en realidad, es un
cambio de algún valor de propiedad a lo largo del tiempo) y se especifica la propiedad a la que aplicar la
animación. Dado que todos los objetos en una escena 3D son elementos secundarios de Viewport3D, las
propiedades de destino de cualquier animación que desea aplicar a la escena son propiedades de las
propiedades de Viewport3D.
Supongamos que desea hacer que un modelo parezca tambalearse en su lugar. Podría optar por aplicar un
RotateTransform3D al modelo y animar el eje de giro de un vector a otro. En el ejemplo de código siguiente se
muestra cómo aplicar Vector3DAnimation a la propiedad Axis de la propiedad Rotation3D de la
transformación, suponiendo que RotateTransform3D es una de las diversas transformaciones aplicadas al
modelo con TransformGroup.
//Define a rotation
RotateTransform3D myRotateTransform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0),
1));
'Define a rotation
Dim myRotateTransform As New RotateTransform3D(New AxisAngleRotation3D(New Vector3D(0, 1, 0), 1))
myRotateTransform.Rotation.BeginAnimation(AxisAngleRotation3D.AxisProperty, myVectorAnimation);
myRotateTransform.Rotation.BeginAnimation(AxisAngleRotation3D.AxisProperty, myVectorAnimation)
<UserControl x:Class="HostingWpfUserControlInWf.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
>
<Grid>
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup >
<Model3DGroup.Children>
<!-- Lights, MeshGeometry3D and DiffuseMaterial objects are added to the ModelVisual3D. -
->
<DirectionalLight Color="#FFFFFFFF" Direction="3,-4,5" />
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="0.293893 -0.5 0.404509 0.475528 -0.5 0.154509 0 0.5 0 0.475528 -0.5 0.154509 0 0.5 0 0
0.5 0 0.475528 -0.5 0.154509 0.475528 -0.5 -0.154509 0 0.5 0 0.475528 -0.5 -0.154509 0 0.5 0 0 0.5 0
0.475528 -0.5 -0.154509 0.293893 -0.5 -0.404509 0 0.5 0 0.293893 -0.5 -0.404509 0 0.5 0 0 0.5 0
0.293893 -0.5 -0.404509 0 -0.5 -0.5 0 0.5 0 0 -0.5 -0.5 0 0.5 0 0 0.5 0 0 -0.5 -0.5 -0.293893 -0.5 -
0.404509 0 0.5 0 -0.293893 -0.5 -0.404509 0 0.5 0 0 0.5 0 -0.293893 -0.5 -0.404509 -0.475528 -0.5 -
0.154509 0 0.5 0 -0.475528 -0.5 -0.154509 0 0.5 0 0 0.5 0 -0.475528 -0.5 -0.154509 -0.475528 -0.5
0.154509 0 0.5 0 -0.475528 -0.5 0.154509 0 0.5 0 0 0.5 0 -0.475528 -0.5 0.154509 -0.293892 -0.5
0.404509 0 0.5 0 -0.293892 -0.5 0.404509 0 0.5 0 0 0.5 0 -0.293892 -0.5 0.404509 0 -0.5 0.5 0 0.5 0
0 -0.5 0.5 0 0.5 0 0 0.5 0 0 -0.5 0.5 0.293893 -0.5 0.404509 0 0.5 0 0.293893 -0.5 0.404509 0 0.5 0
0 0.5 0 "
Normals="0.7236065,0.4472139,0.5257313 0.2763934,0.4472138,0.8506507 0.5308242,0.4294462,0.7306172
0.2763934,0.4472138,0.8506507 0,0.4294458,0.9030925 0.5308242,0.4294462,0.7306172
0.2763934,0.4472138,0.8506507 -0.2763934,0.4472138,0.8506507 0,0.4294458,0.9030925 -
0.2763934,0.4472138,0.8506507 -0.5308242,0.4294462,0.7306172 0,0.4294458,0.9030925 -
0.2763934,0.4472138,0.8506507 -0.7236065,0.4472139,0.5257313 -0.5308242,0.4294462,0.7306172 -
0.7236065,0.4472139,0.5257313 -0.858892,0.429446,0.279071 -0.5308242,0.4294462,0.7306172 -
0.7236065,0.4472139,0.5257313 -0.8944269,0.4472139,0 -0.858892,0.429446,0.279071 -0.8944269,0.4472139,0
-0.858892,0.429446,-0.279071 -0.858892,0.429446,0.279071 -0.8944269,0.4472139,0 -0.7236065,0.4472139,-
0.5257313 -0.858892,0.429446,-0.279071 -0.7236065,0.4472139,-0.5257313 -0.5308242,0.4294462,-0.7306172
-0.858892,0.429446,-0.279071 -0.7236065,0.4472139,-0.5257313 -0.2763934,0.4472138,-0.8506507 -
0.5308242,0.4294462,-0.7306172 -0.2763934,0.4472138,-0.8506507 0,0.4294458,-0.9030925 -
0.5308242,0.4294462,-0.7306172 -0.2763934,0.4472138,-0.8506507 0.2763934,0.4472138,-0.8506507
0,0.4294458,-0.9030925 0.2763934,0.4472138,-0.8506507 0.5308249,0.4294459,-0.7306169 0,0.4294458,-
0.9030925 0.2763934,0.4472138,-0.8506507 0.7236068,0.4472141,-0.5257306 0.5308249,0.4294459,-0.7306169
0.7236068,0.4472141,-0.5257306 0.8588922,0.4294461,-0.27907 0.5308249,0.4294459,-0.7306169
0.7236068,0.4472141,-0.5257306 0.8944269,0.4472139,0 0.8588922,0.4294461,-0.27907 0.8944269,0.4472139,0
0.858892,0.429446,0.279071 0.8588922,0.4294461,-0.27907 0.8944269,0.4472139,0
0.7236065,0.4472139,0.5257313 0.858892,0.429446,0.279071 0.7236065,0.4472139,0.5257313
0.5308242,0.4294462,0.7306172 0.858892,0.429446,0.279071 " TriangleIndices="0 1 2 3 4 5
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 " />
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush
Color="Red"
Opacity="1.0"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
</GeometryModel3D>
</Model3DGroup.Children>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
</Grid>
</UserControl>
Vea también
Viewport3D
PerspectiveCamera
DirectionalLight
Material
Información general sobre transformaciones de modelos 3D
Maximizar el rendimiento de representación 3D en WPF
Temas "Cómo..."
Información general sobre formas y dibujo básico en WPF
Pintar con imágenes, dibujos y elementos visuales
Información general sobre transformaciones de
modelos 3D
20/02/2020 • 23 minutes to read • Edit Online
En este tema se describe cómo aplicar las transformaciones a los modelos 3D del sistema de gráficos de Windows
Presentation Foundation (WPF ). Las transformaciones permiten que el desarrollador cambie la posición y el
tamaño de los modelos, así como que los vuelva a orientar sin cambiar los valores base que los definen.
Espacio de coordenadas 3D
el contenido de gráficos 3D de Windows Presentation Foundation (WPF ) se encapsula en un elemento,
Viewport3D, que puede participar en la estructura de elementos bidimensionales. El sistema de gráficos trata los
objetos Viewport3D como elementos visuales bidimensionales, al igual que ocurre con muchos otros elementos
de Windows Presentation Foundation (WPF ). Viewport3D funciona como ventana (una ventanilla) de una escena
tridimensional. Más concretamente, es una superficie en la que se proyecta una escena 3D. Aunque puede usar
Viewport3D con otros objetos de dibujo 2D en el mismo gráfico de escena, no puede interpenetrar objetos 2D y
3D en un Viewport3D. El elemento Viewport3D contiene el espacio de coordenadas descrito en la siguiente
descripción.
El sistema de coordenadas de Windows Presentation Foundation (WPF ) para gráficos 2D localiza el origen en la
parte superior izquierda de la superficie de representación (que suele ser la pantalla). En el sistema 2D, los valores
positivos del eje X se extienden hacia la derecha, y los valores positivos del eje Y se extienden hacia abajo. En el
sistema de coordenadas 3D, sin embargo, el origen se encuentra en el centro del área de la pantalla, los valores
positivos del eje X se extienden hacia la derecha, los del eje Y, hacia arriba (no hacia abajo) y los del eje Z, hacia el
exterior partiendo del origen; es decir, hacia el lector.
Transformación de modelos
Al crear modelos, estos tienen una ubicación determinada en la escena. Para mover esos modelos por la escena,
girarlos o cambiar su tamaño, no es práctico cambiar los vértices que definen los propios modelos. En lugar de
ello, al igual que en 2D, se aplican transformaciones a los modelos.
Cada objeto de modelo tiene una propiedad Transform con la que puede desplace, vuelva a orientar o cambiar el
tamaño del modelo. Al aplicar una transformación, en realidad lo que se hace es desplazar todos los puntos del
modelo según un vector o valor especificado por la transformación. Es decir, se transforma el espacio de
coordenadas en el que se ha definido el modelo ("espacio del modelo"), pero no se cambian los valores que
constituyen la geometría del modelo en el sistema de coordenadas de la escena completa ("espacio universal").
Transformaciones de la traslación
las transformaciones 3D heredan de la clase base abstracta Transform3D; entre ellas se incluyen las clases de
transformación afín TranslateTransform3D, ScaleTransform3Dy RotateTransform3D. El Windows Presentation
Foundation (WPF ) sistema 3D también proporciona una clase MatrixTransform3D que le permite especificar las
mismas transformaciones en operaciones de matriz más concisas.
TranslateTransform3D mueve todos los puntos del Model3D en la dirección del vector de desplazamiento que
especifique con las propiedades OffsetX, OffsetYy OffsetZ. Por ejemplo, dado un vértice de un cubo en (2,2,2), un
vector de desplazamiento de (0,1.6,1) movería el vértice (2,2,2) a (2,3.6,3). El vértice del cubo sigue siendo (2,2,2)
en el espacio del modelo, pero ahora dicho espacio ha cambiado su relación al espacio universal, de tal forma que
(2,2,2) en el espacio del modelo es (2,3.6,3) en el espacio universal.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="600" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="600" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- This ModelVisual3D defines the light cast in the scene. Without light, the
3D object cannot be seen. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created.
-->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear
gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Cyan" Opacity="0.3"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The OffsetX property is
animated
in the Storyboard below. -->
<GeometryModel3D.Transform>
<TranslateTransform3D x:Name="myTranslateTransform3D" OffsetX="0" OffsetY="0" OffsetZ="0"
/>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the TranslateTransform3D animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- This animation animates the OffsetX property of the TranslateTransform3D. -->
<DoubleAnimation
Storyboard.TargetName="myTranslateTransform3D"
Storyboard.TargetProperty="OffsetX"
To="-0.8"
AutoReverse="True" RepeatBehavior="Forever" />
<!-- If you want to animate OffsetY and/or OffsetZ, create similar DoubleAnimations
respectively. -->
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Transformaciones de escala
ScaleTransform3D cambia la escala del modelo en un vector de escala especificado con referencia a un punto
central. Especifique una escala uniforme, que escala el modelo mediante el mismo valor en los ejes X, Y y Z, para
cambiar proporcionalmente el tamaño del modelo. Por ejemplo, si se establecen las propiedades ScaleX, ScaleYy
ScaleZ de la transformación en 0,5 a la mitad del tamaño del modelo; al establecer las mismas propiedades en 2,
se duplica su escala en los tres ejes.
Ejemplo de ScaleVector
Si se especifica una transformación de escala no uniforme (una transformación de escala cuyos valores X, Y y Z no
son iguales), se puede provocar el estiramiento o la contracción del modelo en una o dos dimensiones sin afectar
el resto. Por ejemplo, si se establece ScaleX en 1, ScaleY en 2 y ScaleZ en 1, el modelo transformado se duplicará
en alto, pero permanecerá sin cambios a lo largo de los ejes X y Z.
De forma predeterminada, ScaleTransform3D provoca la expansión o contracción de los vértices en el origen
(0,0,0). Sin, embargo, si el modelo que desea transformar no se dibuja partiendo del origen, al escalar el modelo a
partir del origen, no se escalará el modelo "en contexto". En su lugar, cuando se multiplican los vértices del modelo
por el vector de escala, la operación de la escala tendrá el efecto de trasladar y escalar el modelo.
Ejemplo de ScaleCenter
Para escalar un modelo "en contexto", especifique el centro del modelo mediante el establecimiento de las
propiedades ScaleTransform3D's CenterX, CenterYy CenterZ. Esto garantiza que el sistema de gráficos escale el
espacio del modelo y, a continuación, lo traduce al centro en el Point3Despecificado. A la inversa, si ha creado el
modelo en el origen y especifica un punto central diferente, espere ver el modelo trasladado fuera del origen.
Transformaciones de giro
Puede girar un modelo 3D de varias maneras diferentes. Una transformación de giro típica especifica un eje y un
ángulo de giro alrededor de ese eje. La clase RotateTransform3D permite definir un Rotation3D con su propiedad
Rotation. A continuación, especifique Axis y Angle propiedades en el Rotation3D, en este caso un
AxisAngleRotation3D, para definir la transformación. En los ejemplos siguientes se gira un modelo 60 grados
sobre el eje Y.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- Two ModelVisual3D define the lights cast in the scene. Without light, the
3D object cannot be seen. Also, the direction of the lights affect shadowing. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created.
-->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear
gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The properties of the
Rotation object are animated causing the 3D object to rotate and "wobble" (see
Storyboard below).-->
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="myAngleRotation" Axis="0,3,0" Angle="40" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the rotation animation when the 3D object loads. -->
<!-- Trigger the rotation animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Nota: 3D de Windows Presentation Foundation (WPF ) es un sistema a la derecha, es decir, un valor angular
positivo de un giro tiene como resultado un giro en el sentido contrario a las agujas del reloj sobre el eje.
Los giros angulares de eje suponen una rotación sobre el origen si no se especifica un valor para las propiedades
CenterX, CenterYy CenterZ en RotateTransform3D. Como ocurre con el escalado, es útil recordar que el giro
transforma el espacio de coordenadas de todo el modelo. Si el modelo no se creó sobre el origen, o se ha
trasladado previamente, el giro podría "pivotar" sobre el origen en lugar de girar en contexto.
Ejemplo de giro
Los giros angulares sobre el eje funcionan bien para las transformaciones estáticas y algunas animaciones. Sin
embargo, considere girar un modelo de cubo 60 grados sobre el eje X y luego 45 grados sobre el eje Z. Puede
describir esta transformación como dos transformaciones afines discretas o como matriz. Sin embargo, quizá sea
difícil animar un giro definido así de forma continua. Aunque las posiciones inicial y final del modelo, calculadas
mediante cualquiera de los enfoque son las mismas, varía el cálculo de las posiciones intermedias tomadas por el
modelo. Los cuaterniones representan una forma alternativa de calcular la interpolación entre el inicio y el fin de
un giro.
Un cuaternión representa un eje en el espacio 3D y un giro alrededor de ese eje. Por ejemplo, un cuaternión
podría representar un eje (1,1,2) y un giro de 50 grados. La capacidad de los cuaterniones al definir los giros
procede de las dos operaciones que puede realizar en ellos: composición e interpolación. La composición de dos
cuaterniones aplicada a una geometría significa "girar la geometría sobre el eje2 mediante giro2, después girarla
sobre el eje1 mediante giro1". Utilizando la composición, puede combinar los dos giros en la geometría para
obtener un solo cuaternión que representa el resultado. Puesto que la interpolación del cuaternión puede calcular
una ruta de acceso continuada y correcta desde un eje y la orientación a otro, puede interpolar desde el cuaternión
original al compuesto para lograr una transición continuada de uno a otro, permitiéndole animar la
transformación. En el caso de los modelos que desea animar, puede especificar un Quaternion de destino para la
rotación mediante el uso de un QuaternionRotation3D para la propiedad Rotation.
Animación de transformaciones
La implementación 3-D en Windows Presentation Foundation (WPF ) utiliza el mismo sistema de control de
tiempo y animación que los gráficos 2D. En otras palabras, para animar una escena 3D, se animan las propiedades
de sus modelos. Es posible animar directamente las propiedades de los elementos primitivos, pero suele ser más
fácil animar las transformaciones que cambian la posición o el aspecto de los modelos. Dado que las
transformaciones se pueden aplicar a los objetos de Model3DGroup, así como a los modelos individuales, es
posible aplicar un conjunto de animaciones a los elementos secundarios de un Model3Dgroup y otro conjunto de
animaciones a un grupo de objetos. Para información general sobre el sistema de control de tiempo y animación
de Windows Presentation Foundation (WPF ), consulte los temas Información general sobre animaciones e
Información general sobre objetos Storyboard.
Para animar un objeto en Windows Presentation Foundation (WPF ), se crea una escala de tiempo, se define una
animación (que, en realidad, es un cambio de algún valor de propiedad a lo largo del tiempo) y se especifica la
propiedad a la que aplicar la animación. Esta propiedad debe ser una propiedad de FrameworkElement. Dado que
todos los objetos de una escena 3D son elementos secundarios de Viewport3D, las propiedades de destino de
cualquier animación que desea aplicar a la escena son propiedades de propiedades de Viewport3D. Es importante
obtener la ruta de acceso de la propiedad de la animación correctamente, ya que la sintaxis puede ser prolija.
Suponga que desea girar un objeto en contexto, pero también aplicar un movimiento oscilante para que se vean
más partes del objeto. Podría aplicar RotateTransform3D al modelo y animar el eje de giro de un vector a otro. En
el ejemplo de código siguiente se muestra cómo aplicar un Vector3DAnimation a la propiedad AXIS del
Rotation3D de la transformación, suponiendo que el RotateTransform3D sea una de las diversas transformaciones
aplicadas al modelo con un TransformGroup.
//Define a rotation
RotateTransform3D myRotateTransform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0),
1));
'Define a rotation
Dim myRotateTransform As New RotateTransform3D(New AxisAngleRotation3D(New Vector3D(0, 1, 0), 1))
Utilice una sintaxis similar para que otras propiedades de la transformación muevan o escalen el objeto. Por
ejemplo, puede aplicar un Point3DAnimation a la propiedad ScaleCenter de una transformación de escala para
hacer que un modelo distorsione suavemente su forma.
Aunque los ejemplos anteriores transforman las propiedades de GeometryModel3D, también es posible
transformar las propiedades de otros modelos de la escena. Animando traslaciones aplicadas a objetos Light, por
ejemplo, puede crear luz en movimiento y efectos de sombra que pueden cambiar el aspecto de los modelos
espectacularmente.
Puesto que las cámaras también son modelos, igualmente se pueden transformar las propiedades de la cámara.
Aunque puede cambiar el aspecto de la escena transformando la ubicación de la cámara o las distancias de los
planos (de hecho, transformando toda la proyección de la escena), tenga en cuenta que muchos de los efectos
obtenidos de esta forma quizá no tengan tanto "sentido visual" para el lector como las transformaciones aplicadas
a la ubicación o posición de los modelos de la escena.
Consulte también
Información general sobre gráficos 3D
Información general sobre transformaciones
Ejemplo de transformaciones 2D
Maximizar el rendimiento de representación 3D en
WPF
03/02/2020 • 10 minutes to read • Edit Online
Al usar el Windows Presentation Foundation (WPF ) para compilar controles 3D e incluir escenas 3D en las
aplicaciones, es importante tener en cuenta la optimización del rendimiento. En este tema se proporciona una lista
de las clases y propiedades 3D que tienen implicaciones de rendimiento para la aplicación, junto con
recomendaciones para optimizar el rendimiento cuando se usan.
En este tema se da por supuesto un conocimiento avanzado de Windows Presentation Foundation (WPF )
características 3D. Las sugerencias de este documento se aplican a "nivel de representación 2", que se define
aproximadamente como hardware que admite el sombreador de píxeles versión 2,0 y la versión 2,0 del
sombreador de vértices. Para obtener más información, consulte niveles de representación de gráficos.
SolidColorBrush
LinearGradientBrush
ImageBrush
RadialGradientBrush
AmbientLight
DirectionalLight
PointLight
SpotLight
EmissiveMaterial
DiffuseMaterial
SpecularMaterial
Consulte también
Información general sobre gráficos 3D
Temas "Cómo..." de gráficos 3D
23/10/2019 • 2 minutes to read • Edit Online
Los temas de esta sección muestran cómo usar gráficos 3D en Windows Presentation Foundation (WPF )
aplicaciones.
En esta sección
Crear una escena 3D
Aplicar un dibujo a un modelo 3D
Aplicar material a la parte anterior y posterior de un objeto 3D
Aplicar material emisor a un objeto tridimensional
Transformar la escala de un modelo 3D
Aplicar varias transformaciones a un modelo 3D
Animar traslaciones 3D
Animar un giro 3D mediante Storyboards
Animar un giro 3D mediante Rotation3DAnimation
Animar un giro 3D mediante cuaterniones
Animar un giro 3D mediante fotogramas clave (Rotation3DAnimationUsingKeyFrames)
Animar un giro 3D mediante fotogramas clave (QuaternionAnimationUsingKeyFrames)
Animar la posición y la dirección de una cámara en una escena 3D
Animar la posición y la dirección de una cámara mediante fotogramas clave
Animar propiedades de material en una escena 3D
Hacer una prueba de posicionamiento en Viewport3D
Comprobar la igualdad y la desigualdad de estructuras Test Point4D
Referencia
Viewport3D
PerspectiveCamera
DirectionalLight
Material
Secciones relacionadas
Gráficos y multimedia
Procedimiento Crear una escena 3D
23/10/2019 • 7 minutes to read • Edit Online
En este ejemplo se muestra cómo crear un objeto 3D que parece una hoja de papel que se ha girado plana. Un
Viewport3D junto con los siguientes componentes se usan para crear esta escena 3D sencilla:
Se crea una cámara mediante un PerspectiveCamera. La cámara especifica qué parte de la escena 3D es
visible.
Se crea una malla para especificar la forma del objeto 3D (hoja de papel) mediante el Geometry propiedad
de GeometryModel3D.
Se especifica el material que se mostrará en la superficie del objeto (degradado lineal en este ejemplo)
mediante el Material propiedad de GeometryModel3D.
Se crea una luz para destacar del objeto mediante DirectionalLight.
Ejemplo
El código siguiente muestra cómo crear una escena 3D en XAML.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D ClipToBounds="True" Width="150" Height="150" Canvas.Left="0" Canvas.Top="10">
<!-- This ModelVisual3D defines the light cast in the scene. Without light, the 3D
object cannot be seen. Also, the direction of the lights affect shadowing. If desired,
you can create multiple lights with different colors that shine from different directions. --
>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifies the shape of the 3D plane. In this sample, a flat sheet is
created. -->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the 3D object. In this sample a linear
gradient
covers the surface of the 3D object.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- Apply a transform to the object. In this sample, a rotation transform is applied,
rendering the
3D object rotated. -->
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,3,0" Angle="40" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Ejemplo
El código siguiente muestra cómo crear la misma escena 3D en el código de procedimiento.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Media3D;
namespace SDKSample
{
public partial class Basic3DShapeExample : Page
{
public Basic3DShapeExample()
{
myModel3DGroup.Children.Add(myDirectionalLight);
// The geometry specifes the shape of the 3D plane. In this sample, a flat sheet
// is created.
MeshGeometry3D myMeshGeometry3D = new MeshGeometry3D();
// The material specifies the material applied to the 3D object. In this sample a
// linear gradient covers the surface of the 3D object.
//
myViewport3D.Children.Add(myModelVisual3D);
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Media3D
Namespace SDKSample
Partial Public Class Basic3DShapeExample
Inherits Page
Public Sub New()
myModel3DGroup.Children.Add(myDirectionalLight)
' The geometry specifes the shape of the 3D plane. In this sample, a flat sheet
' is created.
Dim myMeshGeometry3D As New MeshGeometry3D()
' The material specifies the material applied to the 3D object. In this sample a
' linear gradient covers the surface of the 3D object.
' Apply a transform to the object. In this sample, a rotation transform is applied,
' rendering the 3D object rotated.
Dim myRotateTransform3D As New RotateTransform3D()
Dim myAxisAngleRotation3d As New AxisAngleRotation3D()
myAxisAngleRotation3d.Axis = New Vector3D(0,3,0)
myAxisAngleRotation3d.Angle = 40
myRotateTransform3D.Rotation = myAxisAngleRotation3d
myGeometryModel.Transform = myRotateTransform3D
'
myViewport3D.Children.Add(myModelVisual3D)
Vea también
Información general sobre gráficos 3D
Cómo: Aplicar un dibujo a un modelo 3D
04/11/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un DrawingBrush como Material aplicado a un modelo 3D.
En el código siguiente se define un DrawingGroup como contenido de un DrawingBrush. El DrawingBrush se
establece como la propiedad Brush de la DiffuseMaterial que se aplica a un plano 3D.
NOTE
A menudo es conveniente definir objetos y valores complejos como el dibujo siguiente como recursos que se pueden volver a
usar y simplificar el código. Vea recursos XAML para obtener más información.
<!-- The material specifies the material applied to the 3D object. In this sample a tiled drawing
covers the surface of the 3D object.-->
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<DrawingBrush Viewport="0,0,0.1,0.1" TileMode="Tile">
<DrawingBrush.Drawing>
<DrawingGroup>
<DrawingGroup.Children>
<GeometryDrawing Geometry="M0,0.1 L0.1,0 1,0.9, 0.9,1z"
Brush="Gray" />
<GeometryDrawing Geometry="M0.9,0 L1,0.1 0.1,1 0,0.9z"
Brush="Gray" />
<GeometryDrawing Geometry="M0.25,0.25 L0.5,0.125 0.75,0.25 0.5,0.5z"
Brush="#FFFF00" />
<GeometryDrawing Geometry="M0.25,0.75 L0.5,0.875 0.75,0.75 0.5,0.5z"
Brush="Black" />
<GeometryDrawing Geometry="M0.25,0.75 L0.125,0.5 0.25,0.25 0.5,0.5z"
Brush="#FF0000" />
<GeometryDrawing Geometry="M0.75,0.25 L0.875,0.5 0.75,0.75 0.5,0.5z"
Brush="MediumBlue" />
</DrawingGroup.Children>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
Ejemplo
En el código siguiente se muestra el ejemplo completo.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D ClipToBounds="True" Width="150" Height="150" Canvas.Left="0" Canvas.Top="10">
<!-- This ModelVisual3D defines the light cast in the scene. Without light, the 3D
object cannot be seen. Also, the direction of the lights affect shadowing. If desired,
you can create multiple lights with different colors that shine from different directions. --
>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifies the shape of the 3D plane. In this sample, a flat sheet is
created. -->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the 3D object. In this sample a tiled
drawing
covers the surface of the 3D object.-->
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<DrawingBrush Viewport="0,0,0.1,0.1" TileMode="Tile">
<DrawingBrush.Drawing>
<DrawingGroup>
<DrawingGroup.Children>
<GeometryDrawing Geometry="M0,0.1 L0.1,0 1,0.9, 0.9,1z"
Brush="Gray" />
<GeometryDrawing Geometry="M0.9,0 L1,0.1 0.1,1 0,0.9z"
Brush="Gray" />
<GeometryDrawing Geometry="M0.25,0.25 L0.5,0.125 0.75,0.25 0.5,0.5z"
Brush="#FFFF00" />
<GeometryDrawing Geometry="M0.25,0.75 L0.5,0.875 0.75,0.75 0.5,0.5z"
Brush="Black" />
<GeometryDrawing Geometry="M0.25,0.75 L0.125,0.5 0.25,0.25 0.5,0.5z"
Brush="#FF0000" />
<GeometryDrawing Geometry="M0.75,0.25 L0.875,0.5 0.75,0.75 0.5,0.5z"
Brush="MediumBlue" />
</DrawingGroup.Children>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<!-- Apply a transform to the object. In this sample, a rotation transform is applied,
rendering the
3D object rotated. -->
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,3,0" Angle="40" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Recursos XAML
Crear una escena 3D
Información general sobre objetos Drawing
Información general sobre gráficos 3D
Procedimiento Aplicar material a la parte anterior y
posterior de un objeto 3D
23/10/2019 • 2 minutes to read • Edit Online
El ejemplo siguiente muestra cómo aplicar un Material objeto a la parte frontal y posterior de un 3D y animar el
objeto para mostrar ambos lados del objeto. El Material propiedad de un GeometryModel3D se usa para aplicar
un color rojo Brush a la parte frontal del objeto y el BackMaterial propiedad de la GeometryModel3D se usa para
aplicar un azul Brush a la parte posterior del objeto. El código siguiente muestra la aplicación de los materiales en
el objeto:
<!-- This material is applied to the front of the 3D object (red side).-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Red"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- This material is applied to the back of the 3D object (blue side).-->
<GeometryModel3D.BackMaterial>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Blue"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.BackMaterial>
Ejemplo
El código siguiente muestra el ejemplo completo.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- Two ModelVisual3D define the lights cast in the scene. Without light, the
<!-- Two ModelVisual3D define the lights cast in the scene. Without light, the
3D object cannot be seen. Also, the direction of the lights affect shadowing. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created.
-->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- This material is applied to the front of the 3D object (red side).-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Red"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- This material is applied to the back of the 3D object (blue side).-->
<GeometryModel3D.BackMaterial>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Blue"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.BackMaterial>
<!-- The Transform specifies how to transform the 3D object. The properties of the
Rotation object are animated causing the 3D object to rotate (see Storyboard below).--
>
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="myAngleRotation" Axis="0,3,0" Angle="40" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the rotation animation when the 3D object loads. This animation is used to show
both sides of the 3D object. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Crear una escena 3D
Información general sobre gráficos 3D
Animar propiedades de material en una escena 3D
Aplicar material emisor a un objeto tridimensional
Procedimiento Aplicar material emisor a un objeto
3D
23/10/2019 • 10 minutes to read • Edit Online
El ejemplo siguiente muestra cómo usar EmissiveMaterial para agregar color a un Material existente igual que el
color de pincel de EmissiveMaterial. El código siguiente muestra DiffuseMaterial y EmissiveMaterial aplicados en
combinación para agregar azul a la apariencia de DiffuseMaterial.
<!-- The material applied to the 3D object is made up of a DiffuseMaterial (gradient brush) with
an EmissiveMaterial layered on top (blue SolidColorBrush). The EmissiveMaterial adds blue to the
gradient. -->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
<EmissiveMaterial>
<EmissiveMaterial.Brush>
<SolidColorBrush x:Name="mySolidColorBrush" Color="Blue" />
</EmissiveMaterial.Brush>
</EmissiveMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
En el código de procedimientos:
// The material property of GeometryModel3D specifies the material applied to the 3D object.
// In this sample the material applied to the 3D object is made up of two materials layered
// on top of each other - a DiffuseMaterial (gradient brush) with an EmissiveMaterial
// layered on top (blue SolidColorBrush). The EmmisiveMaterial alters the appearance of
// the gradient toward blue.
Ejemplo
El código siguiente muestra el ejemplo completo en XAML.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- This ModelVisual3D defines the lights cast in the scene. Without light, the
3D object cannot be seen. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifies the shape of the 3D plane. In this case, a flat sheet is
created. -->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material applied to the 3D object is made up of a DiffuseMaterial (gradient brush)
with
an EmissiveMaterial layered on top (blue SolidColorBrush). The EmissiveMaterial adds
blue to the gradient. -->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
<EmissiveMaterial>
<EmissiveMaterial.Brush>
<SolidColorBrush x:Name="mySolidColorBrush" Color="Blue" />
</EmissiveMaterial.Brush>
</EmissiveMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. This transform
rotates the object.-->
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="myAngleRotation" Axis="0,3,0" Angle="40" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Ejemplo
A continuación es el ejemplo completo en el código de procedimiento.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Media3D;
namespace SDKSample
{
public partial class EmissiveMaterialExample : Page
{
public EmissiveMaterialExample()
{
// Defines the camera used to view the 3D object. In order to view the 3D object,
// the camera must be positioned and pointed such that the object is within view
// of the camera.
PerspectiveCamera myPCamera = new PerspectiveCamera();
// Define the lights cast in the scene. Without light, the 3D object cannot
// be seen. Note: to illuminate an object from additional directions, create
// additional lights.
DirectionalLight myDirectionalLight = new DirectionalLight();
myDirectionalLight.Color = Colors.White;
myDirectionalLight.Direction = new Vector3D(-0.61, -0.5, -0.61);
myModel3DGroup.Children.Add(myDirectionalLight);
// The geometry specifes the shape of the 3D plane. In this sample, a flat sheet
// is created.
MeshGeometry3D myMeshGeometry3D = new MeshGeometry3D();
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Media3D
Namespace SDKSample
Partial Public Class EmissiveMaterialExample
Inherits Page
Public Sub New()
' Defines the camera used to view the 3D object. In order to view the 3D object,
' the camera must be positioned and pointed such that the object is within view
' of the camera.
Dim myPCamera As New PerspectiveCamera()
' Define the lights cast in the scene. Without light, the 3D object cannot
' be seen. Note: to illuminate an object from additional directions, create
' additional lights.
Dim myDirectionalLight As New DirectionalLight()
myDirectionalLight.Color = Colors.White
myDirectionalLight.Direction = New Vector3D(-0.61, -0.5, -0.61)
myModel3DGroup.Children.Add(myDirectionalLight)
' The geometry specifes the shape of the 3D plane. In this sample, a flat sheet
' is created.
Dim myMeshGeometry3D As New MeshGeometry3D()
Vea también
Crear una escena 3D
Información general sobre gráficos 3D
Animar propiedades de material en una escena 3D
Aplicar material a la parte anterior y posterior de un objeto 3D
Procedimiento Transformar la escala de un modelo
3D
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo escalar un objeto 3D. Para escalar un objeto 3D, use un ScaleTransform3D. El
ScaleX, ScaleY, y ScaleZ propiedades, cambie el tamaño del elemento por el factor que especifique. Por ejemplo,
un ScaleX valor de 1,5 ajusta un objeto al 150 por ciento de su ancho original. Un ScaleY valor de 0,5 reduce el
alto de un objeto en un 50%. El código siguiente muestra mediante un ScaleTransform3D como la transformación
para un GeometryModel3D.
<!-- Apply a scale transform to the object. You can transform the scale of the object
for the X, Y, or Z axis. The ScaleX, ScaleY, and ScaleZ properties resize the object
by the factor you specify. For example, a ScaleX value of 1.5 stretches the object to
150 percent of its original width. A ScaleY value of 0.5 shrinks the height of an object
by 50 percent. -->
<GeometryModel3D.Transform>
<!-- This Scale Transform stretches the object horizontally by 200 percent and shrinks it
vertically by 50 percent. -->
<ScaleTransform3D ScaleX="2" ScaleY="0.5" ScaleZ="1" CenterX="0" CenterY="0" CenterZ="0" />
</GeometryModel3D.Transform>
Ejemplo
El código siguiente muestra el ejemplo completo.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D ClipToBounds="True" Width="150" Height="150" Canvas.Left="0" Canvas.Top="10">
<!-- This ModelVisual3D defines the light cast in the scene. Without light, the 3D
object cannot be seen. Also, the direction of the lights affect shadowing. If desired,
you can create multiple lights with different colors that shine from different directions. --
>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifies the shape of the 3D plane. In this sample, a flat sheet is
<!-- The geometry specifies the shape of the 3D plane. In this sample, a flat sheet is
created. -->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the 3D object. In this sample a linear
gradient
covers the surface of the 3D object.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- Apply a scale transform to the object. You can transform the scale of the object
for the X, Y, or Z axis. The ScaleX, ScaleY, and ScaleZ properties resize the object
by the factor you specify. For example, a ScaleX value of 1.5 stretches the object to
150 percent of its original width. A ScaleY value of 0.5 shrinks the height of an
object
by 50 percent. -->
<GeometryModel3D.Transform>
<!-- This Scale Transform stretches the object horizontally by 200 percent and shrinks it
vertically by 50 percent. -->
<ScaleTransform3D ScaleX="2" ScaleY="0.5" ScaleZ="1" CenterX="0" CenterY="0" CenterZ="0"
/>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Animar traslaciones 3D
Crear una escena 3D
Información general sobre gráficos 3D
Procedimiento Aplicar varias transformaciones a un
modelo 3D
23/10/2019 • 9 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un RotateTransform3D y un ScaleTransform3D girar y cambiar la escala de
un modelo 3D. El código siguiente muestra cómo aplicar estas transformaciones a la Transform propiedad de un
GeometryModel3D en XAML.
<!-- Apply multiple transformations to the object. In this sample, a rotation and scale transform
is applied. -->
<GeometryModel3D.Transform>
<Transform3DGroup>
<Transform3DGroup.Children>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<!-- This Scale Transform stretches the object horizontally by 200 percent and shrinks it
vertically by 50 percent. -->
<ScaleTransform3D ScaleX="2" ScaleY="0.5" ScaleZ="1" CenterX="0" CenterY="0" CenterZ="0" />
</Transform3DGroup.Children>
</Transform3DGroup>
</GeometryModel3D.Transform>
Mediante código:
// Apply multiple transformations to the object. In this sample, a rotation and scale
// transform is applied.
// Create and apply a scale transformation that stretches the object along the local x-axis
// by 200 percent and shrinks it along the local y-axis by 50 percent.
ScaleTransform3D myScaleTransform3D = new ScaleTransform3D();
myScaleTransform3D.ScaleX = 2;
myScaleTransform3D.ScaleY = 0.5;
myScaleTransform3D.ScaleZ = 1;
// Set the Transform property of the GeometryModel to the Transform3DGroup which includes
// both transformations. The 3D object now has two Transformations applied to it.
myGeometryModel.Transform = myTransform3DGroup;
' Apply multiple transformations to the object. In this sample, a rotation and scale
' transform is applied.
' Create and apply a scale transformation that stretches the object along the local x-axis
' by 200 percent and shrinks it along the local y-axis by 50 percent.
Dim myScaleTransform3D As New ScaleTransform3D()
myScaleTransform3D.ScaleX = 2
myScaleTransform3D.ScaleY = 0.5
myScaleTransform3D.ScaleZ = 1
' Set the Transform property of the GeometryModel to the Transform3DGroup which includes
' both transformations. The 3D object now has two Transformations applied to it.
myGeometryModel.Transform = myTransform3DGroup
Ejemplo
El código siguiente muestra el ejemplo completo en XAML.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D ClipToBounds="True" Width="150" Height="150" Canvas.Left="0" Canvas.Top="10">
<!-- This ModelVisual3D defines the light cast in the scene. Without light, the 3D
object cannot be seen. Also, the direction of the lights affect shadowing. If desired,
you can create multiple lights with different colors that shine from different directions. --
>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifies the shape of the 3D plane. In this sample, a flat sheet is
created. -->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the 3D object. In this sample a linear
gradient
covers the surface of the 3D object.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- Apply multiple transformations to the object. In this sample, a rotation and scale
transform
is applied. -->
<GeometryModel3D.Transform>
<Transform3DGroup>
<Transform3DGroup.Children>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<!-- This Scale Transform stretches the object horizontally by 200 percent and shrinks
it
vertically by 50 percent. -->
<ScaleTransform3D ScaleX="2" ScaleY="0.5" ScaleZ="1" CenterX="0" CenterY="0"
CenterZ="0" />
</Transform3DGroup.Children>
</Transform3DGroup>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Ejemplo
A continuación es el ejemplo completo en el código.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Media3D;
namespace SDKSample
{
public partial class MultipleTransformationsExample : Page
{
public MultipleTransformationsExample()
{
// Defines the camera used to view the 3D object. In order to view the 3D object,
// the camera must be positioned and pointed such that the object is within view
// of the camera.
PerspectiveCamera myPCamera = new PerspectiveCamera();
// Define the lights cast in the scene. Without light, the 3D object cannot
// be seen. Note: to illuminate an object from additional directions, create
// additional lights.
DirectionalLight myDirectionalLight = new DirectionalLight();
myDirectionalLight.Color = Colors.White;
myDirectionalLight.Direction = new Vector3D(-0.61, -0.5, -0.61);
myModel3DGroup.Children.Add(myDirectionalLight);
// The geometry specifes the shape of the 3D plane. In this sample, a flat sheet
// is created.
MeshGeometry3D myMeshGeometry3D = new MeshGeometry3D();
// The material specifies the material applied to the 3D object. In this sample a
// linear gradient covers the surface of the 3D object.
// Create and apply a scale transformation that stretches the object along the local x-axis
// by 200 percent and shrinks it along the local y-axis by 50 percent.
ScaleTransform3D myScaleTransform3D = new ScaleTransform3D();
myScaleTransform3D.ScaleX = 2;
myScaleTransform3D.ScaleY = 0.5;
myScaleTransform3D.ScaleZ = 1;
// Set the Transform property of the GeometryModel to the Transform3DGroup which includes
// both transformations. The 3D object now has two Transformations applied to it.
myGeometryModel.Transform = myTransform3DGroup;
// Add the geometry model to the model group.
myModel3DGroup.Children.Add(myGeometryModel);
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Media3D
Namespace SDKSample
Partial Public Class MultipleTransformationsExample
Inherits Page
Public Sub New()
' Defines the camera used to view the 3D object. In order to view the 3D object,
' the camera must be positioned and pointed such that the object is within view
' of the camera.
Dim myPCamera As New PerspectiveCamera()
' Define the lights cast in the scene. Without light, the 3D object cannot
' be seen. Note: to illuminate an object from additional directions, create
' additional lights.
Dim myDirectionalLight As New DirectionalLight()
myDirectionalLight.Color = Colors.White
myDirectionalLight.Direction = New Vector3D(-0.61, -0.5, -0.61)
myModel3DGroup.Children.Add(myDirectionalLight)
' The geometry specifes the shape of the 3D plane. In this sample, a flat sheet
' is created.
Dim myMeshGeometry3D As New MeshGeometry3D()
' The material specifies the material applied to the 3D object. In this sample a
' linear gradient covers the surface of the 3D object.
' Create and apply a scale transformation that stretches the object along the local x-axis
' by 200 percent and shrinks it along the local y-axis by 50 percent.
Dim myScaleTransform3D As New ScaleTransform3D()
myScaleTransform3D.ScaleX = 2
myScaleTransform3D.ScaleY = 0.5
myScaleTransform3D.ScaleZ = 1
' Set the Transform property of the GeometryModel to the Transform3DGroup which includes
' both transformations. The 3D object now has two Transformations applied to it.
myGeometryModel.Transform = myTransform3DGroup
' Add the geometry model to the model group.
myModel3DGroup.Children.Add(myGeometryModel)
myViewport3D.Children.Add(myModelVisual3D)
Vea también
Transformar la escala de un modelo 3D
Procedimiento Animar traslaciones 3D
23/10/2019 • 2 minutes to read • Edit Online
En este tema se muestra cómo animar una transformación de traslación establecido en un modelo 3D.
El código siguiente muestra la aplicación de un TranslateTransform3D de objeto para el Transform propiedad de
un GeometryModel3D.
<!-- The Transform specifies how to transform the 3D object. The OffsetX property is animated
in the Storyboard below. -->
<GeometryModel3D.Transform>
<TranslateTransform3D x:Name="myTranslateTransform3D" OffsetX="0" OffsetY="0" OffsetZ="0" />
</GeometryModel3D.Transform>
<!-- Trigger the TranslateTransform3D animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- This animation animates the OffsetX property of the TranslateTransform3D. -->
<DoubleAnimation
Storyboard.TargetName="myTranslateTransform3D"
Storyboard.TargetProperty="OffsetX"
To="-0.8"
AutoReverse="True" RepeatBehavior="Forever" />
<!-- If you want to animate OffsetY and/or OffsetZ, create similar DoubleAnimations
respectively. -->
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
Ejemplo
El código siguiente muestra el ejemplo completo.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="600" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="600" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- This ModelVisual3D defines the light cast in the scene. Without light, the
3D object cannot be seen. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created.
-->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear
gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Cyan" Opacity="0.3"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The OffsetX property is
animated
in the Storyboard below. -->
<GeometryModel3D.Transform>
<TranslateTransform3D x:Name="myTranslateTransform3D" OffsetX="0" OffsetY="0" OffsetZ="0"
/>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the TranslateTransform3D animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- This animation animates the OffsetX property of the TranslateTransform3D. -->
<DoubleAnimation
Storyboard.TargetName="myTranslateTransform3D"
Storyboard.TargetProperty="OffsetX"
To="-0.8"
AutoReverse="True" RepeatBehavior="Forever" />
<!-- If you want to animate OffsetY and/or OffsetZ, create similar DoubleAnimations
respectively. -->
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Información general sobre animaciones
Crear una escena 3D
Información general sobre gráficos 3D
Información general sobre transformaciones
Procedimiento Animar un giro 3D mediante
Storyboards
23/10/2019 • 2 minutes to read • Edit Online
El ejemplo siguiente muestra cómo hacer girar mientras se "tambalea" animar un objeto 3D el Angle y Axis las
propiedades de un AxisAngleRotation3D objeto. Esto AxisAngleRotation3D objeto especifica la transformación de
giro del objeto 3D y sus propiedades de animación por lo que crea el efecto de giro deseado. En el guión gráfico,
DoubleAnimation sirve para animar la Angle propiedad mientras Vector3DAnimation sirve para animar el Axis
propiedad.
Ejemplo
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- Two ModelVisual3D define the lights cast in the scene. Without light, the
3D object cannot be seen. Also, the direction of the lights affect shadowing. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created.
-->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear
gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The properties of the
Rotation object are animated causing the 3D object to rotate and "wobble" (see
Storyboard below).-->
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="myAngleRotation" Axis="0,3,0" Angle="40" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the rotation animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Animar un giro 3D mediante Rotation3DAnimation
Animar un giro 3D mediante fotogramas clave (Rotation3DAnimationUsingKeyFrames)
Información general sobre gráficos 3D
Información general sobre objetos Storyboard
Procedimiento Animar un giro 3D mediante
Rotation3DAnimation
23/10/2019 • 2 minutes to read • Edit Online
El ejemplo siguiente muestra cómo hacer girar mientras se "tambalea" mediante el uso de un objeto 3D
Rotation3DAnimation para animar la Rotation propiedad de la RotateTransform3D objeto aplicado al objeto 3D.
Ejemplo
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- Two ModelVisual3D define the lights cast in the scene. Without light, the
3D object cannot be seen. Also, the direction of the lights affect shadowing. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created.
-->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear
gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The properties of the
Rotation object are animated causing the 3D object to rotate and "wobble" (see
Storyboard below).-->
<GeometryModel3D.Transform>
<RotateTransform3D x:Name="myRotateTransform3D" >
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,3,0" Angle="40" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the rotation animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Información general sobre gráficos 3D
Animar un giro 3D mediante fotogramas clave (Rotation3DAnimationUsingKeyFrames)
Animar un giro 3D mediante Storyboards
Animar un giro 3D mediante cuaterniones
Información general sobre animaciones
Procedimiento Animar un giro 3D mediante
cuaterniones
23/10/2019 • 2 minutes to read • Edit Online
<!-- The Transform specifies how to transform the 3D object. The rotation
is animated using the Storyboard below. -->
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<QuaternionRotation3D x:Name="myQuaternionRotation3D" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
Esto QuaternionRotation3D está animada con un QuaternionAnimation dentro de un Storyboard con el código
siguiente.
<!-- Trigger the rotation animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
Ejemplo
El código siguiente muestra el ejemplo completo.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- This ModelVisual3D defines the lights cast in the scene. Without light, the
3D object cannot be seen. Also, the direction of the lights affect shadowing. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created.
-->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear
gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The rotation
is animated using the Storyboard below. -->
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<QuaternionRotation3D x:Name="myQuaternionRotation3D" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the rotation animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Información general sobre animaciones
Crear una escena 3D
Información general sobre gráficos 3D
Información general sobre transformaciones
Animar un giro 3D mediante Storyboards
Animar un giro 3D mediante Rotation3DAnimation
Procedimiento Animar un giro 3D mediante
fotogramas clave
23/10/2019 • 3 minutes to read • Edit Online
En el ejemplo siguiente, Rotation3DAnimationUsingKeyFrames se usa para hacer girar mientras su eje de rotación
resultante en un "oscilante" anima un objeto 3D. Esta animación usa los fotogramas clave siguientes:
1. LinearRotation3DKeyFrame se usa para crear una interpolación lineal suave entre valores.
2. DiscreteRotation3DKeyFrame se usa para crear "saltos" súbitos entre los valores (sin interpolación).
3. SplineRotation3DKeyFrame se utiliza para crear una transición variable entre los valores según el
KeySpline propiedad. En el ejemplo siguiente, esta parte de la animación se inicia lentamente, pero hacia el
final del segmento temporal, se acelera exponencialmente.
Ejemplo
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- Two ModelVisual3D define the lights cast in the scene. Without light, the
3D object cannot be seen. Also, the direction of the lights affect shadowing. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created.
-->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear
gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The properties of the
Rotation object are animated causing the 3D object to rotate and "wobble" (see
Storyboard below).-->
<GeometryModel3D.Transform>
<RotateTransform3D x:Name="myRotateTransform3D" >
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,3,0" Angle="40" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the rotation animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
</Rotation3DAnimationUsingKeyFrames.KeyFrames>
</Rotation3DAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Información general sobre gráficos 3D
Información general sobre animaciones de fotogramas clave
Animar un giro 3D mediante Storyboards
Animar un giro 3D mediante Rotation3DAnimation
Animar un giro 3D mediante cuaterniones
Animar un giro 3D mediante fotogramas clave (QuaternionAnimationUsingKeyFrames)
Procedimiento Animar un giro 3D mediante
fotogramas clave
(QuaternionAnimationUsingKeyFrames)
23/10/2019 • 2 minutes to read • Edit Online
En el ejemplo siguiente, QuaternionAnimationUsingKeyFrames se usa para hacer girar un objeto 3D. Esta
animación usa los fotogramas clave siguientes:
1. LinearRotation3DKeyFrame se usa para crear una interpolación lineal suave entre valores.
2. DiscreteRotation3DKeyFrame se usa para crear "saltos" súbitos entre los valores (sin interpolación).
3. SplineRotation3DKeyFrame se utiliza para crear una transición variable entre los valores según el KeySpline
propiedad. En el ejemplo siguiente, esta parte de la animación se inicia lentamente, pero hacia el final del
segmento temporal, se acelera exponencialmente.
Ejemplo
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- This ModelVisual3D defines the lights cast in the scene. Without light, the
3D object cannot be seen. Also, the direction of the lights affect shadowing. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created.
-->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear
gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. The rotation
is animated using the Storyboard below. -->
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<QuaternionRotation3D x:Name="myQuaternionRotation3D" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the rotation animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
</QuaternionAnimationUsingKeyFrames.KeyFrames>
</QuaternionAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Animar un giro 3D mediante Storyboards
Animar un giro 3D mediante Rotation3DAnimation
Animar un giro 3D mediante cuaterniones
Animar un giro 3D mediante fotogramas clave (Rotation3DAnimationUsingKeyFrames)
Información general sobre gráficos 3D
Información general sobre animaciones de fotogramas clave
Procedimiento Animar la posición y la dirección de
una cámara en una escena 3D
23/10/2019 • 2 minutes to read • Edit Online
El ejemplo siguiente muestra cómo animar la posición de una cámara y animar la dirección en la que apunta en
una escena 3D. Esto se realiza mediante Point3DAnimation y Vector3DAnimation para animar la Position y
LookDirection propiedades respectivamente, de la PerspectiveCamera. Puede usar una animación similar al
siguiente para cambiar la vista del espectador de una escena en respuesta a un evento.
Ejemplo
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- Defines the camera used to view the 3D object. The position and direction of this
camera is animated in the Storyboard below. -->
<Viewport3D.Camera>
<PerspectiveCamera x:Name="myPerspectiveCamera" Position="0,0,2" LookDirection="0,0,-1"
FieldOfView="45" />
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D>
<ModelVisual3D.Children>
<!-- This resource defines the 3D cube that is used in this example.-->
<StaticResource ResourceKey="PictureCubeModelVisual3DResource" />
</ModelVisual3D.Children>
</ModelVisual3D>
</Viewport3D.Children>
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- This animation moves the camera around the object. The object is not
changing position or rotating but moving the camera makes it appear that
it is.-->
<Point3DAnimation
Storyboard.TargetName="myPerspectiveCamera"
Storyboard.TargetProperty="Position"
From="0,0,2" To="1,2,3" Duration="0:0:4" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Vector3DAnimation
Point3DAnimation
Animar la posición y la dirección de una cámara mediante fotogramas clave
Información general sobre gráficos 3D
Procedimiento Animar la posición y la dirección de
una cámara mediante fotogramas clave
23/10/2019 • 2 minutes to read • Edit Online
Ejemplo
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- Defines the camera used to view the 3D object. The position and direction of this
camera is animated in the Storyboard below. -->
<Viewport3D.Camera>
<PerspectiveCamera x:Name="myPerspectiveCamera" Position="0,0,2" LookDirection="0,0,-1"
FieldOfView="45" />
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D>
<ModelVisual3D.Children>
<!-- This resource defines the 3D cube that is used in this example.-->
<StaticResource ResourceKey="PictureCubeModelVisual3DResource" />
</ModelVisual3D.Children>
</ModelVisual3D>
</Viewport3D.Children>
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- This animation moves the camera around the object. The object is not
changing position or rotating but moving the camera makes it appear that
it is.-->
<Point3DAnimationUsingKeyFrames
Storyboard.TargetName="myPerspectiveCamera"
Storyboard.TargetProperty="Position" >
Storyboard.TargetProperty="Position" >
<Point3DAnimationUsingKeyFrames.KeyFrames>
<!-- Using a SplinePoint3DKeyFrame, the camera moves back to its starting point. The
animation starts out slowly at first and then speeds up. This KeyFrame ends
after the fourth second. -->
<SplinePoint3DKeyFrame KeySpline="0.6,0.0 0.9,0.00" Value="0,0,2" KeyTime="0:0:4" />
</Point3DAnimationUsingKeyFrames.KeyFrames>
</Point3DAnimationUsingKeyFrames>
<!-- Using a DiscreteVector3DKeyFrame, the camera suddenly swivels up. This happens
immdeiately after the first 1 and a half second of the animation. -->
<DiscreteVector3DKeyFrame Value="-1,-1,-3" KeyTime="0:0:1.5" />
<!-- Using a SplineVector3DKeyFrame, the camera swivels back to its starting point.
The animation starts out slowly at first and then speeds up. This KeyFrame ends
after the fourth second. -->
<SplineVector3DKeyFrame KeySpline="0.6,0.0 0.9,0.00" Value="0,0,-1" KeyTime="0:0:4" />
</Vector3DAnimationUsingKeyFrames.KeyFrames>
</Vector3DAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Animar la posición y la dirección de una cámara en una escena 3D
Información general sobre gráficos 3D
Procedimiento Animar propiedades de material en
una escena 3D
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo animar la Opacity propiedad de la Material aplicado a un modelo 3D.
En el ejemplo de código siguiente se define la LinearGradientBrush usa como el Material aplicado al objeto 3D.
<!-- The material specifies the material applied to the plane. In this case it is a linear gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<!-- The Opacity property of this LinearGradient is animated. See Storyboard below. -->
<LinearGradientBrush x:Name="myGradientBrush" StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- This animation animates the opacity of the material applied to the 3D Object. -->
<DoubleAnimation
Storyboard.TargetName="myGradientBrush"
Storyboard.TargetProperty="Opacity"
Duration="0:0:2"
To="0.1"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
Ejemplo
El código siguiente muestra el ejemplo completo.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<DockPanel>
<Viewbox>
<Canvas Width="321" Height="201">
<!-- The Viewport3D provides a rendering surface for 3-D visual content. -->
<Viewport3D Name="MyAnimatedObject"
ClipToBounds="True" Width="150" Height="150"
Canvas.Left="0" Canvas.Top="10">
<!-- This ModelVisual3D defines the lights cast in the scene. Without light, the
3D object cannot be seen. Also, the direction of the light affect shadowing. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFF" Direction="-0.612372,-0.5,-0.612372" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<!-- The geometry specifes the shape of the 3D plane. In this case, a flat sheet is created.
-->
<GeometryModel3D.Geometry>
<MeshGeometry3D
TriangleIndices="0,1,2 3,4,5 "
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 "
TextureCoordinates="0,0 1,0 1,1 1,1 0,1 0,0 "
Positions="-0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5
" />
</GeometryModel3D.Geometry>
<!-- The material specifies the material applied to the plane. In this case it is a linear
gradient.-->
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<!-- The Opacity property of this LinearGradient is animated. See Storyboard below.
-->
<LinearGradientBrush x:Name="myGradientBrush" StartPoint="0,0.5" EndPoint="1,0.5">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="0.25" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="LimeGreen" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
<!-- The Transform specifies how to transform the 3D object. In this sample, the object is
rotated.-->
<GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,3,0" Angle="40" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
<!-- Trigger the animation when the 3D object loads. -->
<Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- This animation animates the opacity of the material applied to the 3D Object. -->
<DoubleAnimation
Storyboard.TargetName="myGradientBrush"
Storyboard.TargetProperty="Opacity"
Duration="0:0:2"
To="0.1"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</Canvas>
</Viewbox>
</DockPanel>
</Page>
Vea también
Crear una escena 3D
Información general sobre gráficos 3D
Procedimiento Hacer una prueba de posicionamiento
en Viewport3D
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo hacer una prueba de posicionamiento para objetos Viewport3Dvisuales 3D en
un.
Dado HitTest que devuelve información en 2D y 3D, es posible recorrer en iteración los resultados de pruebas para
leer solo los resultados 3D.
HitTestResultBehavior En el código siguiente se determina cómo se procesan los resultados de las pruebas de
posicionamiento. UpdateResultInfo y UpdateMaterial son métodos definidos localmente.
if (rayResult != null)
{
RayMeshGeometry3DHitTestResult rayMeshResult = rayResult as RayMeshGeometry3DHitTestResult;
if (rayMeshResult != null)
{
GeometryModel3D hitgeo = rayMeshResult.ModelHit as GeometryModel3D;
UpdateResultInfo(rayMeshResult);
UpdateMaterial(hitgeo, (side1GeometryModel3D.Material as MaterialGroup));
}
}
return HitTestResultBehavior.Continue;
}
Public Function HTResult(ByVal rawresult As HitTestResult) As HitTestResultBehavior
Dim rayResult As RayHitTestResult = TryCast(rawresult, RayHitTestResult)
UpdateResultInfo(rayMeshResult)
UpdateMaterial(hitgeo, (TryCast(side1GeometryModel3D.Material, MaterialGroup)))
End If
End If
Return HitTestResultBehavior.Continue
End Function
Procedimiento Comprobar la igualdad y la
desigualdad de estructuras Point4D
23/10/2019 • 2 minutes to read • Edit Online
Ejemplo
// instantiate Points
Point4D point4D1 = new Point4D();
Point4D point4D2 = new Point4D(15, 40, 60, 75);
Point3D point3D1 = new Point3D(15, 40, 60);
// result variables
Boolean areEqual;
Boolean areNotEqual;
String stringResult;
// areEqual is False
if (Point4D.Equals(point4D1, point3D1))
{
// the if condition is not true, so this block will not execute
stringResult = "Both objects are Point4D structures and they are equal";
}
else
{
// the if condition is false, so this branch will execute
stringResult = "Parameters are not both Point4D strucutres, or they are but are not equal";
}
Vea también
Equality
Inequality
Equals
Información general sobre animaciones
20/02/2020 • 38 minutes to read • Edit Online
<StackPanel Margin="10">
<Rectangle
Name="MyRectangle"
Width="100"
Height="100"
Fill="Blue">
</Rectangle>
</StackPanel>
myPanel.Children.Add(myRectangle)
Me.Content = myPanel
3. En el código anterior se mostró una animación que realiza la transición de 1.0 a 0.0 , lo
que hace que el elemento de destino se atenúe desde completamente opaco hasta
totalmente invisible. Para que el elemento se atenúe hacia la vista después de desaparecer,
establezca la propiedad AutoReverse de la animación en true . Para que la animación se
repita indefinidamente, establezca su propiedad RepeatBehavior en Forever. A continuación
se muestra cómo establecer las propiedades AutoReverse y RepeatBehavior en XAML.
myDoubleAnimation.AutoReverse = true;
myDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
myDoubleAnimation.AutoReverse = True
myDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever
<Storyboard>
<DoubleAnimation
From="1.0" To="0.0" Duration="0:0:1"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
Para crear el Storyboard en el código, declare una variable de Storyboard en el nivel de clase.
Class MainWindow
2. El Storyboard tiene que saber dónde aplicar la animación. Utilice la propiedad adjunta
Storyboard.TargetName para especificar el objeto que se va a animar. A continuación se
muestra cómo establecer el nombre de destino del DoubleAnimation en MyRectangle en
XAML.
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle"
From="1.0" To="0.0" Duration="0:0:1"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name)
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:5"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
Storyboard.SetTargetProperty(myDoubleAnimation, new
PropertyPath(Rectangle.OpacityProperty));
Storyboard.SetTargetProperty(myDoubleAnimation, New
PropertyPath(Rectangle.OpacityProperty))
Para obtener más información sobre la sintaxis de TargetProperty y para obtener ejemplos
adicionales, vea la información general sobre los guiones gráficos.
Parte 3 (XAML ): Asociar el guion gráfico a un desencadenador
La manera más fácil de aplicar e iniciar un Storyboard en XAML es usar un desencadenador de
eventos. En esta sección se muestra cómo asociar el Storyboard con un desencadenador en XAML.
1. Cree un objeto de BeginStoryboard y asocie su guion gráfico. Un BeginStoryboard es un
tipo de TriggerAction que se aplica e inicia una Storyboard.
<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>
<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>
Ejemplo completo
A continuación se muestra cómo crear un rectángulo que se intensifica y se atenúa en la vista en
XAML.
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<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>
</Grid>
</Window>
namespace WpfApplication1
{
public partial class MainWindow : Window
{
private Storyboard myStoryboard;
public MainWindow()
{
InitializeComponent();
Class MainWindow
myPanel.Children.Add(myRectangle)
Me.Content = myPanel
End Sub
End Class
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 toma un Double, como la
propiedad Width de un elemento, utilice una animación que genere valores Double. Para animar
una propiedad que toma un Point, utilice una animación que genere valores de Point, etc. Debido al
número de tipos de propiedad 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 la información general de las
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 en 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, querrá usar el tipode <> clases de animación, como DoubleAnimation y
ColorAnimation.
En la tabla siguiente se muestran varios tipos de animación comunes y algunas propiedades con las
que se usan.
ANIMACIÓN DE
ANIMACIÓN BÁSICA FOTOGRAMAS ANIMACIÓN DE
TIPO DE CORRESPONDIENTE CLAVE TRAZADO
PROPIEDAD (FROM/TO/BY) CORRESPONDIENTE CORRESPONDIENTE EJEMPLO DE USO
Una manera de especificar un Duration en el código es usar el método FromSeconds para crear un
TimeSpany, a continuación, declarar una nueva estructura de Duration usando esa TimeSpan.
Para obtener más información sobre los valores de Duration y la sintaxis de Lenguaje XAML
(Extensible Application Markup Language) completa, vea la estructura Duration.
AutoReverse
La propiedad AutoReverse especifica si una escala de tiempo se reproduce hacia atrás una vez que
llega al final de su Duration. Si establece esta propiedad de animación en true , una animación
invierte una vez que llega al final de su Durationy reproduce desde su valor final hasta su valor
inicial. De forma predeterminada, esta propiedad es false .
RepeatBehavior
La propiedad RepeatBehavior especifica el número de veces que se reproduce una escala de
tiempo. De forma predeterminada, las escalas de tiempo tienen un recuento de iteraciones de 1.0 ,
lo que significa que se reproducen una vez y no se repiten.
Para obtener más información acerca de estas propiedades y otras, consulte la información general
sobre los comportamientos de control de tiempo.
<Rectangle
Name="MyRectangle"
Width="100"
Height="100"
Fill="Blue">
<Rectangle.Triggers>
Ejemplos de animaciones
Los ejemplos siguientes pueden ayudarle a familiarizarse con la forma de agregar animaciones a
sus aplicaciones.
Ejemplo de valores de destino de animación From, To y By
Muestra distintas configuraciones From/To/By.
Ejemplo del comportamiento del control de tiempo de la animación
Muestra las distintas maneras de controlar el comportamiento de control de tiempo de una
animación. Este ejemplo también muestra cómo enlazar a datos el valor de destino de una
animación.
Temas relacionados
TÍTULO DESCRIPCIÓN
Información general sobre sistemas de control de Describe cómo el sistema de control de tiempo utiliza
tiempo y animación las clases Timeline y Clock, que permiten crear
animaciones.
TÍTULO DESCRIPCIÓN
Sugerencias y trucos para animaciones Enumera las sugerencias útiles para solucionar
problemas con animaciones, como el rendimiento.
Información general sobre animaciones Describe cómo extender el sistema de animación con
personalizadas fotogramas clave, clases de animación o devoluciones
de llamada por fotograma.
Información general sobre animaciones From/To/By Describe cómo crear una animación que realiza la
transición entre dos valores.
Información general sobre animaciones de Describe cómo crear una animación con varios
fotogramas clave valores de destino, incluida la capacidad de controlar
el método de interpolación.
Información general sobre animaciones en trazados Describe cómo mover o girar un objeto a lo largo de
un trazado complejo.
Información general sobre técnicas de animación de Describe las animaciones de propiedades mediante
propiedades guiones gráficos, animaciones locales, relojes y
animaciones por fotograma.
Información general sobre objetos Storyboard Describe cómo utilizar guiones gráficos con varias
escalas de tiempo para crear animaciones complejas.
Información general sobre comportamientos de Describe los tipos de Timeline y las propiedades que
control de tiempo se usan en las animaciones.
Información general sobre eventos de control de Describe los eventos disponibles en los objetos
tiempo Timeline y Clock para ejecutar el código en los puntos
de la escala de tiempo, como iniciar, pausar, reanudar,
omitir o detener.
Temas de procedimientos de fotogramas clave Contiene ejemplos de código para usar animaciones
de fotogramas clave en una aplicación.
Temas de procedimientos de animación de trazado Contiene ejemplos de código para usar animaciones
de trazado en una aplicación.
Referencia
Timeline
Storyboard
BeginStoryboard
Clock
Información general sobre sistemas de
temporización y animación
23/10/2019 • 11 minutes to read • Edit Online
Este tema describe cómo utiliza la animación, el sistema de temporización Timeline, y Clock clases para animar
propiedades.
Requisitos previos
Para entender este tema, debe poder utilizar animaciones WPF para animar propiedades, como se describe en
Información general sobre animaciones. También ayuda conocer las propiedades de dependencia; para más
información, vea Información general sobre las propiedades de dependencia.
Puede aplicar cualquiera AnimationClock objetos crea para las propiedades de dependencia compatibles
utilizando el ApplyAnimationClock método.
En escenarios de rendimiento intensivo, tales como la animación de grandes cantidades de objetos similares,
administrar su propio Clock uso puede proporcionar ventajas de rendimiento.
Un objeto ClockGroup
Composición
Es posible asociar varios relojes a una única propiedad, en cuyo caso cada reloj utiliza el valor de salida del reloj
anterior como su valor base. La siguiente ilustración muestra tres AnimationClock objetos que se aplica a la
misma propiedad. El reloj1 utiliza el valor base de la propiedad animada como entrada y lo utiliza para generar
la salida. El reloj2 toma la salida del reloj1 como entrada y lo utiliza para generar la salida. El reloj3 toma la
salida del reloj2 como entrada y lo utiliza para generar la salida. Cuando varios relojes afectan simultáneamente
a la misma propiedad, se dice que están en una cadena de composición.
Vea también
Información general sobre animaciones
Información general sobre eventos de control de tiempo
Información general sobre comportamientos de control de tiempo
Sugerencias y trucos para animaciones
08/01/2020 • 15 minutes to read • Edit Online
Al trabajar con animaciones en WPF, hay una serie de sugerencias y trucos que pueden hacer que las animaciones
funcionen mejor y ahorren frustraciones.
Problemas generales
Al animar la posición de una barra de desplazamiento o de un control deslizante, se inmoviliza
Si anima la posición de una barra de desplazamiento o un control deslizante mediante una animación que tiene
una FillBehavior de HoldEnd (el valor predeterminado), el usuario ya no podrá mover la barra de desplazamiento o
el control deslizante. Esto se debe a que, aunque la animación finaliza, continúa invalidando el valor base de la
propiedad de destino. Para que la animación deje de invalidar el valor actual de la propiedad, quítelo o asígnele un
FillBehavior de Stop. Para obtener más información y un ejemplo, vea establecer una propiedad después de
animarla con un guion gráfico.
Animar la salida de una animación no surte ningún efecto
No se puede animar ningún objeto que sea la salida de otra animación. Por ejemplo, si usa un
ObjectAnimationUsingKeyFrames para animar el Fill de una Rectangle de una RadialGradientBrush a una
SolidColorBrush, no puede animar las propiedades de la RadialGradientBrush o SolidColorBrush.
No se puede cambiar el valor de una propiedad después de animarla
En algunos casos, puede parecer que no es posible cambiar el valor de una propiedad después de animarla, incluso
después de que la animación haya finalizado. Esto se debe a que, aunque la animación finaliza, continúa
invalidando el valor base de la propiedad. Para que la animación deje de invalidar el valor actual de la propiedad,
quítelo o asígnele un FillBehavior de Stop. Para obtener más información y un ejemplo, vea establecer una
propiedad después de animarla con un guion gráfico.
Cambiar una escala de tiempo no surte ningún efecto
Aunque la mayoría de las propiedades de Timeline se pueden animar y enlazar a datos, el cambio de los valores de
propiedad de una Timeline activa parece no tener ningún efecto. Esto se debe a que, cuando se inicia un Timeline,
el sistema de control de tiempo realiza una copia del Timeline y lo usa para crear un objeto Clock. Modificar el
original no surte ningún efecto en la copia del sistema.
Para que un Timeline refleje los cambios, su reloj se debe volver a generar y usar para reemplazar el reloj creado
previamente. Los relojes no se regeneran automáticamente. A continuación se muestran distintas maneras de
aplicar cambios a las escalas de tiempo:
Si la escala de tiempo es o pertenece a un Storyboard, puede hacer que refleje los cambios reaplicando su
guion gráfico mediante un BeginStoryboard o el método Begin. El efecto secundario de esta acción es que
también se reinicia la animación. En el código, puede utilizar el método Seek para hacer avanzar el guión
gráfico hasta su posición anterior.
Si aplicó una animación directamente a una propiedad mediante el método BeginAnimation, llame de
nuevo al método BeginAnimation y pásele la animación que se ha modificado.
Si está trabajando directamente en el nivel de relojes, cree y aplique un nuevo conjunto de relojes y
utilícelos para reemplazar el conjunto anterior de relojes generados.
Para obtener más información acerca de las escalas de tiempo y los relojes, consulte información general sobre
sistemas de control de tiempo y animación.
FillBehavior.Stop no funciona como se espera
Hay ocasiones en las que el establecimiento de la propiedad FillBehavior en Stop parece no tener ningún efecto,
como cuando una animación "se entrega" a otra porque tiene un valor HandoffBehavior de SnapshotAndReplace.
En el ejemplo siguiente se crea un Canvas, un Rectangle y un TranslateTransform. El TranslateTransform se animará
para mover el Rectangle alrededor de la Canvas.
En los ejemplos de esta sección se usan los objetos anteriores para mostrar varios casos en los que la propiedad
FillBehavior no se comporte como cabría esperar.
FillBehavior="Stop" y HandoffBehavior con varias animaciones
A veces parece que una animación omite su FillBehavior propiedad cuando se reemplaza por una segunda
animación. Tome el ejemplo siguiente, que crea dos objetos Storyboard y los usa para animar la misma
TranslateTransform que se muestra en el ejemplo anterior.
La primera Storyboard, B1 , anima la propiedad X de la TranslateTransform de 0 a 350, que mueve el rectángulo
350 píxeles a la derecha. Cuando la animación alcanza el final de su duración y deja de reproducirse, la propiedad
X vuelve a su valor original, 0. Como resultado, el rectángulo se mueve 350 píxeles a la derecha y luego salta para
situarse en su posición original.
La segunda Storyboard, B2 , también anima la propiedad X de la misma TranslateTransform. Dado que solo se
establece la propiedad To de la animación de este Storyboard, la animación utiliza el valor actual de la propiedad
que anima como su valor de inicio.
<!-- Animates the same object and property as the preceding
Storyboard. -->
<Button Content="Start Storyboard B2">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard x:Name="B2">
<DoubleAnimation
Storyboard.TargetName="MyTranslateTransform"
Storyboard.TargetProperty="X"
To="500" Duration="0:0:5"
FillBehavior="Stop" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
Si hace clic en el segundo botón mientras se reproduce el primer Storyboard, es posible que espere el siguiente
comportamiento:
1. El primer guion gráfico finaliza y devuelve el rectángulo a su posición original, porque la animación tiene
una FillBehavior de Stop.
2. El segundo guion gráfico se lleva a efecto y anima el objeto a partir de la posición actual, que ahora es 0,
hasta 500.
Pero esto no es lo que sucede. En lugar de ello, el rectángulo no salta a su posición original, sino que continúa
moviéndose a la derecha. Esto se debe a que la segunda animación utiliza el valor actual de la primera animación
como su valor inicial y anima desde ese valor hasta 500. Cuando la segunda animación reemplaza la primera
porque se usa el HandoffBehavior SnapshotAndReplace, el FillBehavior de la primera animación no importa.
FillBehavior y el evento Completed
En los siguientes ejemplos se muestra otro escenario en el que parece que el FillBehavior de Stopno tiene ningún
efecto. De nuevo, en el ejemplo se usa un guion gráfico para animar la propiedad X de la TranslateTransform de 0 a
350. Sin embargo, esta vez el ejemplo se registra para el evento Completed.
El controlador de eventos Completed inicia otro Storyboard que anima la misma propiedad desde su valor actual
hasta 500.
private void StoryboardC_Completed(object sender, EventArgs e)
{
Storyboard translationAnimationStoryboard =
(Storyboard)this.Resources["TranslationAnimationStoryboardResource"];
translationAnimationStoryboard.Begin(this);
}
<Page.Resources>
<Storyboard x:Key="TranslationAnimationStoryboardResource">
<DoubleAnimation
Storyboard.TargetName="MyTranslateTransform"
Storyboard.TargetProperty="X"
To="500" Duration="0:0:5" />
</Storyboard>
</Page.Resources>
Rendimiento
Las animaciones siguen ejecutándose después de salir de una página
Cuando sale de una Page que contiene animaciones en ejecución, esas animaciones seguirán reproduciéndose
hasta que el Page se recopile como elemento no utilizado. Según el sistema de navegación que se utilice, la página
de la que ha salido al navegar podría permanecer en memoria por tiempo indefinido, durante el cual seguiría
consumiendo recursos con sus animaciones. Esto resulta especialmente patente cuando una página contiene
animaciones de ejecución continua ("ambiente").
Por esta razón, se recomienda usar el evento Unloaded para quitar animaciones cuando se sale de una página.
Hay diferentes maneras de quitar una animación. Las técnicas siguientes se pueden usar para quitar animaciones
que pertenecen a un Storyboard.
Para quitar una Storyboard inicia con un desencadenador de eventos, vea Cómo: quitar un guion gráfico.
Para usar código con el fin de quitar un Storyboard, vea el método Remove.
La técnica siguiente se puede utilizar sin tener en cuenta cómo se inició la animación.
Para quitar animaciones de una propiedad concreta, use el método BeginAnimation(DependencyProperty,
AnimationTimeline). Especifique la propiedad que se anima como primer parámetro y null como segundo. De
este modo, se quitarán todos los relojes de animación de la propiedad.
Para obtener más información sobre las distintas formas de animar propiedades, vea información general sobre
técnicas de animación de propiedades.
Utilizar el valor Compose de HandoffBehavior consume recursos del sistema
Cuando se aplica un Storyboard, AnimationTimelineo AnimationClock a una propiedad mediante el
HandoffBehaviorCompose, los objetos Clock asociados previamente a esa propiedad continúan consumiendo
recursos del sistema; el sistema de control de tiempo no quitará estos relojes automáticamente.
Para evitar problemas de rendimiento al aplicar un gran número de relojes mediante Compose, debe quitar los
relojes de composición de la propiedad animada una vez completados. Hay varias formas de quitar un reloj.
Para quitar todos los relojes de una propiedad, use el método ApplyAnimationClock(DependencyProperty,
AnimationClock) o BeginAnimation(DependencyProperty, AnimationTimeline) del objeto animado.
Especifique la propiedad que se anima como primer parámetro y null como segundo. De este modo, se
quitarán todos los relojes de animación de la propiedad.
Para quitar una AnimationClock específica de una lista de relojes, utilice la propiedad Controller de la
AnimationClock para recuperar una ClockControllery, a continuación, llame al método Remove de la
ClockController. Esto se hace normalmente en el controlador de eventos Completed para un reloj. Tenga en
cuenta que solo los relojes de raíz pueden controlarse mediante un ClockController; la propiedad Controller
de un reloj secundario devolverá null . Tenga en cuenta también que no se llamará al evento Completed si
la duración efectiva del reloj es indefinidamente. En ese caso, el usuario deberá determinar cuándo llamar a
Remove.
Este problema se produce principalmente en las animaciones de objetos que tienen un período de duración
prolongado. Cuando un objeto se recolecta como elemento no utilizado, sus relojes también se desconectan y se
recolectan como elementos no utilizados.
Para obtener más información sobre los objetos de reloj, consulte información general sobre sistemas de control
de tiempo y animación.
Vea también
Información general sobre animaciones
Información general sobre animaciones
personalizadas
20/02/2020 • 14 minutes to read • Edit Online
En este tema se describe cómo y cuándo extender el sistema de animación de WPF creando fotogramas clave
personalizados o clases de animación, o utilizando la devolución de llamada por fotograma para omitirlo.
Prerequisites
Para entender este tema, debe estar familiarizado con los distintos tipos de animación proporcionados por WPF.
Para más información, consulte From/To/By Animations Overview (Información general sobre animaciones
From/To/By), Key-Frame Animations Overview (Información general sobre animaciones de fotogramas clave) e
Información general sobre animaciones en trazados.
Dado que las clases de animación heredan de la clase Freezable, debería estar familiarizado con Freezable objetos
y con la herencia de Freezable. Para más información, consulte Freezable Objects Overview (Información general
sobre objetos Freezable).
Personalizar la interpolación entre valores de un tipo que Crear un fotograma clave personalizado. Para más
tiene un <Tipo > AnimationUsingKeyFrames correspondiente información, consulte la sección Crear un fotograma clave
personalizado.
Personalizar algo más que la interpolación entre valores de un Crear una clase de animación personalizada que herede de la
tipo que tiene una clase <Tipo> Animation correspondiente. clase <Tipo > AnimationBase correspondiente al tipo que
desee animar. Para más información, consulte la sección Crear
una clase de animación personalizada.
Animar un tipo que no tenga una animación de WPF Use una ObjectAnimationUsingKeyFrames o cree una clase
correspondiente que herede de AnimationTimeline. Para más información,
consulte la sección Crear una clase de animación
personalizada.
SI DESEA... UTILICE ESTE ENFOQUE
Animar varios objetos con valores que se calculan para cada Utilizar la devolución de llamada por fotograma. Para más
fotograma y se basan en el último conjunto de interacciones información, consulte la sección Crear una devolución de
de objeto llamada por fotograma.
Consulte también
AnimationTimeline
IKeyFrame
Información general sobre técnicas de animación de propiedades
Información general sobre objetos Freezable
Información general sobre animaciones de fotogramas clave
Información general sobre animaciones en trazados
Información general sobre animaciones
Información general sobre sistemas de control de tiempo y animación
Ejemplo de animación personalizada
Información general sobre animaciones From/To/By
20/02/2020 • 19 minutes to read • Edit Online
En este tema se describe cómo usar animaciones From/To/By para animar propiedades de dependencia. Una
animación From/To/By crea una transición entre dos valores.
Prerequisites
Para entender este tema, debe estar familiarizado con las características de animaciones de WPF. Para ver una
introducción a las características de animación, consulte información general sobre animaciones.
Byte ByteAnimation
Color ColorAnimation
Decimal DecimalAnimation
Double DoubleAnimation
TIPO DE PROPIEDAD CLASE DE ANIMACIÓN FROM/TO/BY CORRESPONDIENTE
Int16 Int16Animation
Int32 Int32Animation
Int64 Int64Animation
Point PointAnimation
Quaternion QuaternionAnimation
Rect RectAnimation
Rotation3D Rotation3DAnimation
Single SingleAnimation
Size SizeAnimation
Thickness ThicknessAnimation
Vector3D Vector3DAnimation
Vector VectorAnimation
Valores de destino
Una animación From/To/By crea una transición entre dos valores de destino. Es habitual especificar un valor inicial
(establézcalo mediante la propiedad From) y un valor final (establézcalo mediante la propiedad To). Pero también
se puede especificar solo un valor inicial, un valor de destino o un valor de desplazamiento. En estos casos, la
animación obtiene el valor de destino que falta de la propiedad que se anima. La lista siguiente describe las
diferentes maneras de especificar los valores de destino de una animación.
Valor inicial
Utilice la propiedad From cuando desee especificar explícitamente el valor inicial de una animación. Puede
usar la propiedad From por sí sola o con la propiedad To o By. Si solo especifica la propiedad From, la
animación realiza la transición desde ese valor al valor base de la propiedad animada.
Valor final
Para especificar un valor final de una animación, use su propiedad To. Si usa la propiedad To por sí misma,
la animación obtiene su valor inicial de la propiedad que se anima o desde la salida de otra animación que
se aplica a la misma propiedad. Puede usar la propiedad To junto con la propiedad From para especificar
explícitamente los valores inicial y final de la animación.
Valor de desplazamiento
La propiedad By permite especificar un desplazamiento en lugar de un valor de inicio o finalización explícito
para la animación. La propiedad By de una animación especifica en qué parte la animación cambia un valor
a lo largo de su duración. Puede usar la propiedad By por sí sola o con la propiedad From. Si solo especifica
la propiedad By, la animación agrega el valor de desplazamiento al valor base de la propiedad o a la salida
de otra animación.
Usar valores From/To/By
En las secciones siguientes se describe cómo usar las propiedades From, Toy By juntas o por separado.
En los ejemplos de esta sección se usa un DoubleAnimation, que es un tipo de animación from/to/by, para animar
la propiedad Width de una Rectangle que es 10 píxeles independientes del dispositivo de alto y 100 píxeles
independientes del dispositivo de ancho.
Aunque en cada ejemplo se usa un DoubleAnimation, las propiedades from, to y by de todas las animaciones
From/to/by se comportan exactamente igual. Aunque cada uno de estos ejemplos usa una Storyboard, puede usar
animaciones From/to/by de otras maneras. Para obtener más información, vea información general sobre técnicas
de animación de propiedades.
De/Para
Al establecer los valores From y To juntos, la animación progresa desde el valor especificado por la propiedad
From hasta el valor especificado por la propiedad To.
En el ejemplo siguiente se establece la propiedad From del DoubleAnimation en 50 y su propiedad To en 300.
Como resultado, el Width del Rectangle se anima desde 50 a 300.
Storyboard.SetTargetName(myDoubleAnimation, "fromToAnimatedRectangle");
Storyboard.SetTargetProperty(myDoubleAnimation,
new PropertyPath(Rectangle.WidthProperty));
Storyboard myStoryboard = new Storyboard();
myStoryboard.Children.Add(myDoubleAnimation);
Storyboard.SetTargetName(myDoubleAnimation, "fromToAnimatedRectangle")
Storyboard.SetTargetProperty(myDoubleAnimation, New PropertyPath(Rectangle.WidthProperty))
Dim myStoryboard As New Storyboard()
myStoryboard.Children.Add(myDoubleAnimation)
A
Cuando se establece solo la propiedad To, la animación progresa desde el valor base de la propiedad animada o
desde la salida de una animación compuesta que se aplicó previamente a la misma propiedad, hasta el valor
especificado por la propiedad To.
("Composición de animación" hace referencia a una animación Active o Filling que se aplicó previamente a la
misma propiedad que todavía está en vigor cuando se aplicó la animación actual mediante el comportamiento de
entrega de Compose).
En el ejemplo siguiente se establece solo la propiedad To del DoubleAnimation en 300. Dado que no se especificó
ningún valor de inicio, el DoubleAnimation usa el valor base (100) de la propiedad Width como su valor de inicio.
El Width del Rectangle se anima desde 100 hasta el valor de destino de la animación de 300.
// Demonstrates the use of the To property.
Storyboard.SetTargetName(myDoubleAnimation, "toAnimatedRectangle");
Storyboard.SetTargetProperty(myDoubleAnimation,
new PropertyPath(Rectangle.WidthProperty));
Storyboard myStoryboard = new Storyboard();
myStoryboard.Children.Add(myDoubleAnimation);
Storyboard.SetTargetName(myDoubleAnimation, "toAnimatedRectangle")
Storyboard.SetTargetProperty(myDoubleAnimation, New PropertyPath(Rectangle.WidthProperty))
Dim myStoryboard As New Storyboard()
myStoryboard.Children.Add(myDoubleAnimation)
Por
Cuando se establece solo la propiedad By de una animación, la animación progresa desde el valor base de la
propiedad que se está animando, o desde la salida de una animación compuesta hasta la suma de ese valor y el
valor especificado por la propiedad By.
En el ejemplo siguiente se establece solo la propiedad By del DoubleAnimation en 300. Dado que el ejemplo no
especifica un valor de inicio, el DoubleAnimation usa el valor base de la propiedad Width, 100, como su valor de
inicio. El valor final se determina agregando el valor By de la animación, 300, a su valor inicial, 100:400. Como
resultado, el Width del Rectangle se anima desde 100 a 400.
// Demonstrates the use of the By property.
Storyboard.SetTargetName(myDoubleAnimation, "byAnimatedRectangle");
Storyboard.SetTargetProperty(myDoubleAnimation,
new PropertyPath(Rectangle.WidthProperty));
Storyboard myStoryboard = new Storyboard();
myStoryboard.Children.Add(myDoubleAnimation);
Storyboard.SetTargetName(myDoubleAnimation, "byAnimatedRectangle")
Storyboard.SetTargetProperty(myDoubleAnimation, New PropertyPath(Rectangle.WidthProperty))
Dim myStoryboard As New Storyboard()
myStoryboard.Children.Add(myDoubleAnimation)
From/By
Al establecer las propiedades From y By de una animación, la animación progresa desde el valor especificado por
la propiedad From hasta el valor especificado por la suma de las propiedades From y By.
En el ejemplo siguiente se establece la propiedad From del DoubleAnimation en 50 y su propiedad By en 300. El
valor final se determina agregando el valor By de la animación, 300, a su valor inicial, 50:350. Como resultado, el
Width del Rectangle se anima desde 50 a 350.
// Demonstrates the use of the From and By properties.
Storyboard.SetTargetName(myDoubleAnimation, "byAnimatedRectangle");
Storyboard.SetTargetProperty(myDoubleAnimation,
new PropertyPath(Rectangle.WidthProperty));
Storyboard myStoryboard = new Storyboard();
myStoryboard.Children.Add(myDoubleAnimation);
Storyboard.SetTargetName(myDoubleAnimation, "byAnimatedRectangle")
Storyboard.SetTargetProperty(myDoubleAnimation, New PropertyPath(Rectangle.WidthProperty))
Dim myStoryboard As New Storyboard()
myStoryboard.Children.Add(myDoubleAnimation)
De
Cuando se especifica únicamente el valor de From de una animación, la animación progresa desde el valor
especificado por la propiedad From, hasta el valor base de la propiedad que se anima o hasta la salida de una
animación compuesta.
En el ejemplo siguiente se establece solo la propiedad From del DoubleAnimation en 50. Dado que no se
especificó ningún valor final, el DoubleAnimation usa el valor base de la propiedad Width, 100, como su valor final.
El Width del Rectangle se anima desde 50 hasta el valor base de la propiedad Width, 100.
// Demonstrates the use of the From property.
Storyboard.SetTargetName(myDoubleAnimation, "fromAnimatedRectangle");
Storyboard.SetTargetProperty(myDoubleAnimation,
new PropertyPath(Rectangle.WidthProperty));
Storyboard myStoryboard = new Storyboard();
myStoryboard.Children.Add(myDoubleAnimation);
Storyboard.SetTargetName(myDoubleAnimation, "fromAnimatedRectangle")
Storyboard.SetTargetProperty(myDoubleAnimation, New PropertyPath(Rectangle.WidthProperty))
Dim myStoryboard As New Storyboard()
myStoryboard.Children.Add(myDoubleAnimation)
To/By
Si establece las propiedades To y By de una animación, se omite la propiedad By.
Consulte también
Timeline
Storyboard
Información general sobre animaciones
Información general sobre objetos Storyboard
Información general sobre animaciones de fotogramas clave
Información general sobre animaciones en trazados
Información general sobre animaciones personalizadas
Ejemplo de valores de destino de animación From, To y By
Información general sobre animaciones de
fotogramas clave
23/10/2019 • 35 minutes to read • Edit Online
Este tema es una introducción a las animaciones de fotogramas clave. Las animaciones de fotogramas clave
le permiten realizar animaciones con más de dos valores de destino y controlan el método de interpolación
de una animación.
Requisitos previos
Para entender esta introducción, debe conocer las animaciones y escalas de tiempo de Windows
Presentation Foundation (WPF ). Consulte Información general sobre animaciones para ver una
introducción a las animaciones. También resulta útil conocer las animaciones From/To/By. Para más
información, consulte la información general sobre animaciones From/To/By.
<Rectangle Fill="Blue"
Width="50" Height="50"
HorizontalAlignment="Left">
<Rectangle.RenderTransform>
<TranslateTransform
x:Name="MyAnimatedTranslateTransform"
X="0" Y="0" />
</Rectangle.RenderTransform>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseLeftButtonDown">
<BeginStoryboard>
<Storyboard>
<DoubleAnimationUsingKeyFrames
Storyboard.TargetName="MyAnimatedTranslateTransform"
Storyboard.TargetProperty="X"
Duration="0:0:10">
<LinearDoubleKeyFrame Value="0" KeyTime="0:0:0" />
<LinearDoubleKeyFrame Value="350" KeyTime="0:0:2" />
<LinearDoubleKeyFrame Value="50" KeyTime="0:0:7" />
<LinearDoubleKeyFrame Value="200" KeyTime="0:0:8" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</Border>
</Page>
Al igual que un From/To/By animación, una animación de fotogramas clave se puede aplicar a una
propiedad mediante el uso de un Storyboard en marcado y código o mediante el BeginAnimation método
en el código. También puede usar una animación de fotogramas clave para crear un AnimationClock y
aplicarla a una o varias propiedades. Para más información sobre los distintos métodos para aplicar
animaciones, consulte la Información general sobre técnicas de animación de propiedades.
<Rectangle Fill="Blue"
Width="50" Height="50"
HorizontalAlignment="Left">
<Rectangle.RenderTransform>
<TranslateTransform
x:Name="MyAnimatedTranslateTransform"
X="0" Y="0" />
</Rectangle.RenderTransform>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseLeftButtonDown">
<BeginStoryboard>
<Storyboard>
<DoubleAnimationUsingKeyFrames
Storyboard.TargetName="MyAnimatedTranslateTransform"
Storyboard.TargetProperty="X"
Duration="0:0:10">
<LinearDoubleKeyFrame Value="0" KeyTime="0:0:0" />
<LinearDoubleKeyFrame Value="350" KeyTime="0:0:2" />
<LinearDoubleKeyFrame Value="50" KeyTime="0:0:7" />
<LinearDoubleKeyFrame Value="200" KeyTime="0:0:8" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</Border>
</Page>
Métodos de interpolación
En las secciones anteriores se mencionó que algunas animaciones de fotogramas clave admiten varios
métodos de interpolación. La interpolación de una animación describe cómo una animación transiciona
entre los valores a lo largo de su duración. Si selecciona el tipo de fotograma clave usar con la animación,
puede definir el método de interpolación para ese segmento de fotogramas clave. Hay tres tipos de
métodos de interpolación distintos: lineal, discreta y spline.
Interpolación lineal
Con la interpolación lineal, la animación avanza a una velocidad constante de la duración del segmento. Por
ejemplo, si un segmento de fotogramas clave transiciona desde 0 a 10 durante 5 segundos, la animación
generará los valores siguientes en los momentos especificados:
0 0
1 2
TIEMPO VALOR DE SALIDA
2 4
3 6
4 8
4.25 8.5
4.5 9
5 10
Interpolación discreta
Con la interpolación discreta, la función de animación pasa de un valor al siguiente sin interpolación. Si un
segmento de fotogramas clave transiciona desde 0 a 10 durante 5 segundos, la animación generará los
valores siguientes en los momentos especificados:
0 0
1 0
2 0
3 0
4 0
4.25 0
4.5 0
5 10
Tenga en cuenta que la animación no cambia su valor de salida hasta el final mismo de la duración del
segmento.
La interpolación spline es más compleja. Esta interpolación se describe en la sección siguiente.
Interpolación spline
La interpolación spline se puede usar para lograr efectos de control de tiempo más realistas. Debido a que
las animaciones se usan a menudo para imitar los efectos que ocurren en el mundo real, es posible que los
desarrolladores necesiten un control detallado de la aceleración y la desaceleración de objetos y una
manipulación cercana de los segmentos de tiempo. Los fotogramas clave de spline le permiten animar con
la interpolación spline. Con otros fotogramas clave, especifica un Value y KeyTime. Con un fotograma clave
spline, también se especifica un KeySpline. El ejemplo siguiente muestra un fotograma clave de spline único
para un DoubleAnimationUsingKeyFrames. Tenga en cuenta el KeySpline propiedad; que es lo que hace un
fotograma clave spline difieren de los otros tipos de fotogramas clave.
<SplineDoubleKeyFrame Value="500" KeyTime="0:0:7" KeySpline="0.0,1.0 1.0,0.0" />
Un punto inicial, un punto final y dos puntos de control definen una curva Bézier cúbica. El KeySpline
propiedad de un fotograma clave de spline define los dos puntos de control de una curva de Bézier que se
extiende desde (0,0) a (1,1). El primer punto de control controla el factor de curva de la primera mitad de la
curva Bézier, mientras que el segundo punto de control, el factor de curva de la segunda mitad. La curva
resultante describe la tasa de cambio de ese fotograma clave de spline. Cuanto más inclinada sea la curva,
el fotograma clave cambia sus valores más rápidamente. A medida que la curva es cada vez más plana, el
fotograma clave cambia sus valores más lentamente.
Puede usar KeySpline para simular trayectorias físicas como pertenecientes a agua o que las bolas que o
aplique otros efectos de "salida lenta" y "lenta" a las animaciones de movimiento. Para obtener efectos de
interacción con el usuario, como el fundido en el fondo o el rebote del botón de control, podría aplicar la
interpolación spline para acelerar o ralentizar la tasa de cambio de una animación de una forma específica.
En el ejemplo siguiente se especifica un KeySpline de 0,1 1,0, lo que crea la siguiente curva Bézier.
Una curva spline clave con los puntos de control (0.0, 1.0) y (1.0, 0.0)
Este fotograma clave se anima rápidamente cuando comienza, disminuye la velocidad y vuelve a acelerarla
antes de finalizar.
En el ejemplo siguiente se especifica un KeySpline de 0.5,0.25 0.75,1.0, que crea la siguiente curva Bézier.
Una curva spline clave con los puntos de control (0.25, 0.5) y (0.75, 1.0)
La interpolación spline puede ser difícil de entender, por lo que puede resultar útil experimentar distintas
configuraciones. El ejemplo de animación de curva spline clave le permite cambiar los valores de curva
spline clave y ver el resultado que esto tiene en una animación.
Combinación de métodos de interpolación
Puede usar fotogramas clave con distintos tipos de interpolación en una animación de fotogramas clave
única. Cuando se encuentran dos animaciones de fotogramas clave con distintas interpolaciones, el método
de interpolación del segundo fotograma clave se usa para crear la transición desde el primer valor al
segundo.
En el ejemplo siguiente, un DoubleAnimationUsingKeyFrames se crea que usa la interpolación lineal, spline
y discreta.
<!-- This rectangle is animated using a key frame animation
with a combination of interpolation methods. -->
<Rectangle
Width="50"
Height="50"
Fill="Orange">
<Rectangle.RenderTransform>
<TranslateTransform
x:Name="ComboAnimatedTranslateTransform"
X="0" Y="0" />
</Rectangle.RenderTransform>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
Valores de porcentaje
Un valor de porcentaje especifica que el fotograma clave finaliza en algún porcentaje de la animación
Duration. En XAML, especifica el porcentaje como un número, seguido del símbolo % . En el código, usa el
FromPercent método y pásele un Double que indica el porcentaje. El valor debe ser mayor o igual que 0 y
menor o igual que 100 por ciento. En el ejemplo siguiente se muestra una animación con una duración de
10 segundos y 4 fotogramas clave cuyos tiempos clave están especificados como porcentajes.
El primer fotograma clave anima desde el valor base a 100 durante los primeros 3 segundos y
finaliza en 0:0:3.
El segundo fotograma clave anima desde 100 a 200. Se inicia cuando finaliza el primer fotograma
clave (a los 3 segundos) y se reproduce durante 5 segundos, finalizando en 0:0:8 (0.8 * 10 = 8).
El tercer fotograma clave anima desde 200 a 500. Se inicia cuando finaliza el segundo fotograma
clave (a los 8 segundos) y se reproduce durante 1 segundo, finalizando en 0:0:9 (0.9 * 10 = 9).
El cuarto fotograma clave anima desde 500 a 600. Se inicia cuando finaliza el tercer fotograma clave
(a los 9 segundos) y se reproduce durante 1 segundo, finalizando en 0:0:10 (1 * 10 = 10).
<!-- Identical animation behavior to the previous rectangle
but using percentage values for KeyTimes rather then TimeSpan. -->
<Rectangle Height="50" Width="50" Fill="Purple">
<Rectangle.RenderTransform>
<TranslateTransform x:Name="TranslateTransform02" X="10" Y="110" />
</Rectangle.RenderTransform>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimationUsingKeyFrames
Storyboard.TargetName="TranslateTransform02"
Storyboard.TargetProperty="X"
Duration="0:0:10"
RepeatBehavior="Forever">
Tenga en cuenta que, si el tiempo clave del último fotograma clave es Paced o Uniform, el tiempo clave
resuelto se establecerá en 100 por ciento. Si el primer fotograma clave de una animación de varios
fotogramas es Paced, el tiempo clave resuelto se establecerá en 0. (Si la colección de fotogramas clave solo
contiene un fotograma clave y es un fotograma clave Paced, el tiempo clave resuelto se establecerá en 100
por ciento).
Los distintos fotogramas clave dentro de una animación de fotogramas clave pueden usar distintos tipos de
tiempo clave.
Vea también
KeyTime
KeySpline
Timeline
Ejemplo de animación de curva Spline clave
Ejemplo de animación de fotogramas clave
Información general sobre animaciones
Información general sobre objetos Storyboard
Temas de procedimientos de fotogramas clave
Información general sobre comportamientos de control de tiempo
Funciones de aceleración
23/10/2019 • 6 minutes to read • Edit Online
Las funciones de aceleración le permiten aplicar fórmulas matemáticas personalizadas a las animaciones. Por
ejemplo, puede que quiera que un objeto rebote de forma realista o se comporte como si estuviera sobre un
muelle. Podría usar animaciones de fotogramas clave o incluso animaciones From/To/By para aproximarse a estos
efectos pero supondría bastante trabajo y la animación sería menos precisa que si usa un fórmula matemática.
Además de crear su propia función de aceleración personalizada heredando EasingFunctionBasede, puede usar
una de las diversas funciones de aceleración proporcionadas por el motor en tiempo de ejecución para crear
efectos comunes.
BackEase: Retira ligeramente el movimiento de una animación antes de que empiece a animarse en la ruta
de acceso indicada.
BounceEase: Crea un efecto de rebote.
CircleEase: Crea una animación que acelera y/o desacelera mediante una función circular.
CubicEase: Crea una animación que acelera y/o desacelera mediante la fórmula f(t) = t3.
ElasticEase: Crea una animación que se parece a un muelle que oscila hacia atrás y hacia delante hasta que
llegue al resto.
ExponentialEase: Crea una animación que acelera y/o desacelera mediante una fórmula exponencial.
PowerEase: Crea una animación que acelera y/o desacelera mediante la fórmula f(t) = tp , donde p es igual a
la Power propiedad.
QuadraticEase: Crea una animación que acelera y/o desacelera mediante la fórmula f(t) = t2.
QuarticEase: Crea una animación que acelera y/o desacelera mediante la fórmula f(t) = t4.
QuinticEase: Cree una animación que acelere y/o desacelera mediante la fórmula f(t) = t5.
SineEase: Crea una animación que acelera y/o desacelera mediante una fórmula de seno.
Para aplicar una función de aceleración a una animación, use EasingFunction la propiedad de la animación
especifique la función de aceleración que se va a aplicar a la animación. En el ejemplo siguiente se BounceEase
aplica una función de DoubleAnimation aceleración a un para crear un efecto de rebote.
<Rectangle Name="myRectangle" Width="200" Height="30" Fill="Blue">
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseDown">
<BeginStoryboard>
<Storyboard>
<Storyboard x:Name="myStoryboard">
<DoubleAnimation From="30" To="200" Duration="00:00:3"
Storyboard.TargetName="myRectangle"
Storyboard.TargetProperty="Height">
<DoubleAnimation.EasingFunction>
<BounceEase Bounces="2" EasingMode="EaseOut"
Bounciness="2" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
En el ejemplo anterior, la función de aceleración se aplicó a una animación From/To/By. También puede aplicar
estas funciones de aceleración a animaciones de fotogramas clave. En el ejemplo siguiente se muestra cómo usar
fotogramas clave con funciones de aceleración asociadas a ellos para crear una animación de un rectángulo que se
contrae hacia arriba, se ralentiza, se expande hacia abajo (como si cayera) y luego rebota hasta detenerse.
<!-- This keyframe animates the ellipse back down and makes
it bounce. -->
<EasingDoubleKeyFrame Value="200" KeyTime="00:00:06">
<EasingDoubleKeyFrame.EasingFunction>
<BounceEase Bounces="5" EasingMode="EaseOut"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
Puede usar la EasingMode propiedad para modificar el comportamiento de la función de aceleración, es decir,
cambiar el modo en que se interpola la animación. Hay tres posibles valores que puede proporcionar para
EasingMode:
EaseIn: La interpolación sigue la fórmula matemática asociada a la función de aceleración.
EaseOut: La interpolación sigue la interpolación del 100% menos el resultado de la fórmula asociada con la
función de aceleración.
EaseInOut: La interpolación EaseIn utiliza para la primera mitad de la animación EaseOut y para la segunda
mitad.
Los gráficos siguientes muestran los distintos valores de donde EasingMode f(x) representa el progreso de la
animación y t representa el tiempo.
BackEase
BounceEase
CircleEase
CubicEase
ElasticEase
ExponentialEase
PowerEase
QuadraticEase
QuarticEase
QuinticEase
SineEase
NOTE
Puede usar PowerEase para crear el mismo comportamiento que CubicEase, QuadraticEase, QuarticEasey QuinticEase
mediante la Power propiedad. Por ejemplo, si desea usar PowerEase para sustituir por CubicEase, especifique un Power valor
de 3.
Además de usar las funciones de aceleración que se incluyen en el tiempo de ejecución, puede crear sus propias
funciones personalizadas de aceleración heredando EasingFunctionBasede. En el ejemplo siguiente se muestra
cómo crear una función de aceleración simple personalizada. Puede agregar su propia lógica matemática para el
comportamiento de la función de aceleración invalidando el EaseInCore método.
namespace CustomEasingFunction
{
public class CustomSeventhPowerEasingFunction : EasingFunctionBase
{
public CustomSeventhPowerEasingFunction()
: base()
{
}
Namespace CustomEasingFunction
Public Class CustomSeventhPowerEasingFunction
Inherits EasingFunctionBase
Public Sub New()
MyBase.New()
End Sub
' Specify your own logic for the easing function by overriding
' the EaseInCore method. Note that this logic applies to the "EaseIn"
' mode of interpolation.
Protected Overrides Function EaseInCore(ByVal normalizedTime As Double) As Double
' applies the formula of time to the seventh power.
Return Math.Pow(normalizedTime, 7)
End Function
End Class
End Namespace
<Window x:Class="CustomEasingFunction.Window1"
xmlns:CustomEase="clr-namespace:CustomEasingFunction"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="500" Width="300">
<StackPanel>
<TextBlock Margin="10" TextWrapping="Wrap">Click on the rectangle to start the animation</TextBlock>
<StackPanel x:Name="LayoutRoot" Background="White">
<!-- You get the EasingMode property for free on your custom
easing function.-->
<CustomEase:CustomSeventhPowerEasingFunction EasingMode="EaseIn"/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</StackPanel>
</StackPanel>
</Window>
Información general sobre animaciones en trazados
23/10/2019 • 13 minutes to read • Edit Online
En este tema se presentan las animaciones de trazado, que permiten usar un trazado geométrico para generar
valores de salida. Las animaciones de trazado son útiles para mover y girar objetos a lo largo de trazados
complejos.
Requisitos previos
Para entender este tema, debe estar familiarizado con WPF las características de animaciones. Para obtener una
introducción a las características de animación, vea el información general sobre animaciones.
Debido a que usa un PathGeometry objeto para definir una animación de trazado, también debe estar
familiarizado con PathGeometry y los diferentes tipos de PathSegment objetos. Para obtener más información,
consulte el información general sobre geometría.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace SDKSample
{
/// <summary>
/// Shows how to animate an object along
/// a geometric path.
/// </summary>
public class MatrixAnimationUsingPathDoesRotateWithTangentExample : Page
{
public MatrixAnimationUsingPathDoesRotateWithTangentExample()
{
this.Margin = new Thickness(20);
// Create a button.
Button aButton = new Button();
aButton.MinWidth = 100;
aButton.Content = "A Button";
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Namespace SDKSample
''' <summary>
''' Shows how to animate an object along
''' a geometric path.
''' </summary>
Public Class MatrixAnimationUsingPathDoesRotateWithTangentExample
Inherits Page
End Sub
End Class
End Namespace
Para obtener más información sobre la sintaxis de ruta de acceso que se usa en el XAML ejemplo, consulte el
sintaxis de marcado de trazados información general. Para obtener un ejemplo completo, vea ejemplo de
animación de trazado.
Puede aplicar una animación de trazado a una propiedad utilizando un Storyboard en XAML y el código o
mediante el BeginAnimation método en el código. También puede usar una animación de trazado para crear un
AnimationClock y aplicarla a una o varias propiedades. Para obtener más información sobre los distintos
métodos para aplicar animaciones, vea técnicas de animación de información general sobre propiedades.
Un MatrixAnimationUsingPath genera Matrix los valores de sus PathGeometry. Cuando se usa con un
MatrixTransform, un MatrixAnimationUsingPath puede mover un objeto a lo largo de una ruta de acceso. Si
establece la DoesRotateWithTangent propiedad de la MatrixAnimationUsingPath a true , también gira el objeto
a lo largo de las curvas de la ruta de acceso.
Un PointAnimationUsingPath genera Point valores de las coordenadas x e y-de su PathGeometry. Mediante el
uso de un PointAnimationUsingPath para animar una propiedad que acepta Point valores, puede mover un
objeto a lo largo de una ruta de acceso. Un PointAnimationUsingPath no se puede girar objetos.
Un DoubleAnimationUsingPath genera Double los valores de sus PathGeometry. Estableciendo el Source
propiedad, puede especificar si el DoubleAnimationUsingPath usa la coordenada x, la coordenada y o el ángulo
de la ruta de acceso como salida. Puede usar un DoubleAnimationUsingPath para girar un objeto o moverlo a lo
largo del eje x o del eje y.
Los segmentos en una PathFigure se combinan en una sola forma geométrica, que usa el punto final de un
segmento como el punto inicial del segmento siguiente. El StartPoint propiedad de un PathFigure especifica el
punto desde el que se dibuja el primer segmento. Cada segmento posterior comienza en el punto final del
segmento anterior. Por ejemplo, una línea vertical desde 10,50 a 10,150 pueden definirse mediante el
establecimiento la StartPoint propiedad 10,50 y la creación de un LineSegment con un Point configuración de la
propiedad de 10,150 .
Para obtener más información acerca de PathGeometry objetos, vea el información general sobre geometría.
En XAML, también puede usar una sintaxis abreviada especial para establecer el Figures propiedad de un
PathGeometry. Para obtener más información, consulte sintaxis de marcado de trazados información general.
Para obtener más información sobre la sintaxis de ruta de acceso que se usa en el XAML ejemplo, consulte el
sintaxis de marcado de trazados información general.
Vea también
Ejemplo de animación de trazado
Sintaxis de marcado de trazados
Temas de procedimientos de animación de trazado
Información general sobre animaciones
Información general sobre técnicas de animación de propiedades
Información general sobre técnicas de animación
de propiedades
23/10/2019 • 15 minutes to read • Edit Online
En este tema se describen los enfoques diferentes para animar propiedades: guiones gráficos, animaciones
locales, relojes y animaciones por fotograma.
Requisitos previos
Para entender este tema, debe estar familiarizado con las características de animación básicas descritas en
Información general sobre animaciones.
EL GUIÓN
GRÁFICO SE
COMIENZA PLANTILLA DE PLANTILLA DE
UTILIZANDO... POR INSTANCIA ESTILO CONTROL DATOS EJEMPLO
Para obtener más información acerca de Storyboard objetos, vea el Storyboards Overview.
Animaciones locales
Las animaciones locales proporcionan una manera cómoda de animar una propiedad de dependencia de
cualquier Animatable objeto. Las animaciones locales se utilizan cuando se desea aplicar una sola animación a
una propiedad y no se necesita controlar interactivamente la animación después de iniciarse. A diferencia de
un Storyboard animación, una animación local puede animar un objeto que no está asociado con un
FrameworkElement o FrameworkContentElement. También no tiene que definir un NameScope para este tipo
de animación.
Las animaciones locales únicamente se pueden utilizar mediante código y no se pueden definir en estilos,
plantillas de control ni plantillas de datos. Una animación local no se puede controlar interactivamente una vez
iniciada.
Para animar mediante una animación local, complete los pasos siguientes.
1. Crear un AnimationTimeline objeto.
2. Use la BeginAnimation método del objeto que desea animar para aplicar el AnimationTimeline a la
propiedad que especifique.
El ejemplo siguiente muestra cómo animar el color de fondo y de ancho de un Button.
/*
*/
namespace Microsoft {
namespace Samples {
namespace Animation {
namespace LocalAnimations {
// Create the demonstration.
public ref class LocalAnimationExample : Page {
public:
LocalAnimationExample ()
{
WindowTitle = "Local Animation Example";
StackPanel^ myStackPanel = gcnew StackPanel();
myStackPanel->Margin = Thickness(20);
*/
using System;
using System.Windows;
using System.Windows.Navigation;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Controls;
namespace Microsoft.Samples.Animation.LocalAnimations
{
public LocalAnimationExample()
{
Imports System.Windows
Imports System.Windows.Navigation
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Imports System.Windows.Controls
Namespace Microsoft.Samples.Animation.LocalAnimations
Animaciones de reloj
Use Clock objetos cuando desea animar sin utilizar un Storyboard y desea crear árboles de control de tiempo
complejos o controlar interactivamente las animaciones después de iniciarse. Puede usar los objetos de reloj
para animar una propiedad de dependencia de cualquier Animatable objeto.
No puede usar Clock objetos controlan directamente a animar en estilos, plantillas o plantillas de datos. (Use
el sistema de animación y temporización realmente Clock objetos que se va a animar en estilos, plantillas de
control y plantillas de datos, pero deben crearlos Clock objetos para usted desde un Storyboard. Para obtener
más información sobre la relación entre Storyboard objetos y Clock objetos, vea el Animation and Timing
System Overview.)
Para aplicar una sola Clock a una propiedad, complete los pasos siguientes.
1. Crear un AnimationTimeline objeto.
2. Use la CreateClock método de la AnimationTimeline para crear un AnimationClock.
3. Use la ApplyAnimationClock método del objeto que desea animar para aplicar el AnimationClock a la
propiedad especificada.
El ejemplo siguiente muestra cómo crear un AnimationClock y aplicarlo a dos propiedades similares.
/*
This example shows how to create and apply
an AnimationClock.
*/
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
namespace Microsoft.Samples.Animation.TimingBehaviors
{
public class AnimationClockExample : Page
{
ScaleTransform myScaleTransform;
public AnimationClockExample()
{
myStackPanel.Children.Add(myButton);
this.Content = myStackPanel;
}
'
' This example shows how to create and apply
' an AnimationClock.
'
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Namespace Microsoft.Samples.Animation.TimingBehaviors
Public Class AnimationClockExample
Inherits Page
myStackPanel.Children.Add(myButton)
Content = myStackPanel
End Sub
' Create and apply and animation when the button is clicked.
Private Sub myButton_Clicked(sender As Object, e As RoutedEventArgs)
Para crear un árbol de control de tiempo y utilizarlo para animar propiedades, complete los pasos siguientes.
1. Use ParallelTimeline y AnimationTimeline objetos para crear el árbol de control de tiempo.
2. Use la CreateClock de la raíz ParallelTimeline para crear un ClockGroup.
3. Recorrer en iteración el Children de la ClockGroup y se aplican a su elemento secundario Clock objetos.
Para cada AnimationClock secundario, use la ApplyAnimationClock método del objeto que desea
animar para aplicar el AnimationClock a la propiedad especificada
Para más información acerca de los objetos de reloj, consulte Información general sobre sistemas de
temporización y animación.
Vea también
Información general sobre animaciones
Información general sobre objetos Storyboard
Información general sobre sistemas de control de tiempo y animación
Información general sobre las propiedades de dependencia
Información general sobre objetos Storyboard
08/01/2020 • 34 minutes to read • Edit Online
En este tema se muestra cómo usar objetos Storyboard para organizar y aplicar animaciones. Describe
cómo manipular interactivamente Storyboard objetos y describe la sintaxis de destinatarios de propiedades
indirectas.
Requisitos previos
Para entender este tema, debe estar familiarizado con los distintos tipos de animaciones y sus
características básicas. Para obtener una introducción a la animación, consulte Información general sobre
animaciones. También debe saber utilizar las propiedades asociadas. Para obtener más información sobre
las propiedades adjuntas, consulte Información general sobre propiedades asociadas.
EL GUIÓN
GRÁFICO SE
COMIENZA PLANTILLA DE PLANTILLA DE
UTILIZANDO... POR INSTANCIA ESTILO CONTROL DATOS EJEMPLO
En el ejemplo siguiente se usa un Storyboard para animar el Width de un elemento Rectangle y el Color de
una SolidColorBrush que se usa para pintar ese Rectangle.
<!-- This example shows how to animate with a storyboard.-->
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Microsoft.Samples.Animation.StoryboardsExample"
WindowTitle="Storyboards Example">
<StackPanel Margin="20">
<Rectangle Name="MyRectangle"
Width="100"
Height="100">
<Rectangle.Fill>
<SolidColorBrush x:Name="MySolidColorBrush" Color="Blue" />
</Rectangle.Fill>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle"
Storyboard.TargetProperty="Width"
From="100" To="200" Duration="0:0:1" />
<ColorAnimation
Storyboard.TargetName="MySolidColorBrush"
Storyboard.TargetProperty="Color"
From="Blue" To="Red" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</StackPanel>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Data;
using System.Windows.Shapes;
using System.Windows.Input;
namespace Microsoft.Samples.Animation
{
public class StoryboardsExample : Page
{
public StoryboardsExample()
{
this.WindowTitle = "Storyboards Example";
StackPanel myStackPanel = new StackPanel();
myStackPanel.Margin = new Thickness(20);
this.RegisterName(myRectangle.Name, myRectangle);
myRectangle.Width = 100;
myRectangle.Height = 100;
SolidColorBrush mySolidColorBrush = new SolidColorBrush(Colors.Blue);
this.RegisterName("MySolidColorBrush", mySolidColorBrush);
myRectangle.Fill = mySolidColorBrush;
myStackPanel.Children.Add(myRectangle);
this.Content = myStackPanel;
}
}
}
En las secciones siguientes se describen con más detalle las propiedades adjuntas TargetName y
TargetProperty.
Establecer como destino elementos de marco, elementos de
contenido de marco y elementos inmovilizables
En la sección anterior se menciona que, para que una animación encuentre su destino, debe conocer el
nombre del mismo y la propiedad que debe animar. Especificar la propiedad que se va a animar es sencillo:
simplemente establezca Storyboard.TargetProperty con el nombre de la propiedad que se va a animar. Para
especificar el nombre del objeto cuya propiedad desea animar, establezca la propiedad
Storyboard.TargetName en la animación.
Para que la propiedad TargetName funcione, el objeto de destino debe tener un nombre. Asignar un
nombre a un FrameworkElement o un FrameworkContentElement en XAML es diferente de asignar un
nombre a un objeto de Freezable.
Los elementos de marco son las clases que heredan de la clase FrameworkElement. Entre los ejemplos de
elementos de marco se incluyen Window, DockPanel, Buttony Rectangle. En esencia, todas las ventanas, los
paneles y los controles son elementos. Los elementos de contenido de marco son las clases que heredan de
la clase FrameworkContentElement. Algunos ejemplos de elementos de contenido de marco son
FlowDocument y Paragraph. Si no está seguro de si un tipo es un elemento de marco o un elemento de
contenido de marco, compruebe si tiene una propiedad Name. Si la tiene, probablemente sea un elemento
de marco o un elemento de contenido de marco. Para estar seguro, compruebe la sección de jerarquía de
herencia de su página de tipo.
Para habilitar el destino de un elemento de marco o un elemento de contenido de marco de trabajo en
XAML, establezca su propiedad Name. En el código, también debe usar el método RegisterName para
registrar el nombre del elemento con el elemento para el que ha creado un NameScope.
En el ejemplo siguiente, tomado del ejemplo anterior, se asigna el nombre MyRectangle un Rectangle, un
tipo de FrameworkElement.
<Rectangle Name="MyRectangle"
Width="100"
Height="100">
this.RegisterName(myRectangle.Name, myRectangle);
Una vez que tenga un nombre, puede animar una propiedad de ese elemento.
<DoubleAnimation
Storyboard.TargetName="MyRectangle"
Storyboard.TargetProperty="Width"
From="100" To="200" Duration="0:0:1" />
Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
Storyboard.SetTargetProperty(myDoubleAnimation,
new PropertyPath(Rectangle.WidthProperty));
Freezable tipos son las clases que heredan de la clase Freezable. Entre los ejemplos de Freezable se
incluyen SolidColorBrush, RotateTransformy GradientStop.
Para habilitar el destino de un Freezable por una animación en XAML, utilice la Directiva x:Name para
asignarle un nombre. En el código, se usa el método RegisterName para registrar su nombre en el
elemento para el que se ha creado un NameScope.
En el ejemplo siguiente se asigna un nombre a un objeto Freezable.
<ColorAnimation
Storyboard.TargetName="MySolidColorBrush"
Storyboard.TargetProperty="Color"
From="Blue" To="Red" Duration="0:0:1" />
Storyboard.SetTargetName(myColorAnimation, "MySolidColorBrush");
Storyboard.SetTargetProperty(myColorAnimation,
new PropertyPath(SolidColorBrush.ColorProperty));
Storyboard objetos utilizan ámbitos de nombres para resolver la propiedad TargetName. Para obtener más
información sobre los ámbitos de nombres de WPF, consulte Ámbitos de nombres XAML de WPF. Si se
omite la propiedad TargetName, la animación tiene como destino el elemento en el que se define o, en el
caso de los estilos, el elemento con estilo.
A veces no se puede asignar un nombre a un objeto Freezable. Por ejemplo, si un Freezable se declara
como recurso o se utiliza para establecer un valor de propiedad en un estilo, no se le puede asignar un
nombre. Al no tener nombre, no se puede establecer como destino directamente, pero sí de manera
indirecta. En las secciones siguientes se describe cómo utilizar el establecimiento indirecto de destinos.
<ColorAnimation
Storyboard.TargetName="Rectangle01"
Storyboard.TargetProperty="Fill.Color"
From="Blue" To="AliceBlue" Duration="0:0:1" />
DependencyProperty[] propertyChain =
new DependencyProperty[]
{Rectangle.FillProperty, SolidColorBrush.ColorProperty};
string thePath = "(0).(1)";
PropertyPath myPropertyPath = new PropertyPath(thePath, propertyChain);
Storyboard.SetTargetProperty(myColorAnimation, myPropertyPath);
Tenga en cuenta que, si la Freezable está inmovilizada, se realizará un clon y se animará el clon. Cuando
esto sucede, la propiedad HasAnimatedProperties del objeto original continúa devolviendo false , porque
el objeto original no se anima realmente. Para obtener más información sobre la clonación, vea información
general sobre objetos Freezable.
Además, tenga en cuenta que, al utilizar el establecimiento indirecto de propiedades de destino, es posible
establecer como destino objetos que no existen. Por ejemplo, puede suponer que el Background de un
botón determinado se ha establecido con un SolidColorBrush e intenta animar su color, cuando en realidad
se ha usado un LinearGradientBrush para establecer el fondo del botón. En estos casos, no se produce
ninguna excepción; la animación no tiene ningún efecto visible porque LinearGradientBrush no reacciona a
los cambios en la propiedad Color.
En las secciones siguientes se describe con mayor detalle la sintaxis de establecimiento indirecto de
propiedades de destino.
Establecer de manera indirecta una propiedad de destino de un objeto inmovilizable en XAML
Para establecer como destino una propiedad de un Freezable en XAML, use la sintaxis siguiente.
ElementPropertyName . FreezablePropertyName
Dónde
ElementPropertyName es la propiedad de la FrameworkElement la que se usa el Freezable que se
va a establecer y
FreezablePropertyName es la propiedad del Freezable que se va a animar.
En el código siguiente se muestra cómo animar el Color de una SolidColorBrush utilizada para establecer el
Fill de un elemento de rectángulo.
<Rectangle
Name="Rectangle01"
Height="100"
Width="100"
Fill="{StaticResource MySolidColorBrushResource}">
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="Rectangle01"
Storyboard.TargetProperty="Fill.Color"
From="Blue" To="AliceBlue" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
En ocasiones, es preciso establecer como destino un objeto inmovilizable contenido en una colección o
matriz.
Para establecer como destino un objeto inmovilizable contenido en una colección, se utiliza la sintaxis de
ruta de acceso siguiente.
<TransformGroup x:Key="MyTransformGroupResource"
x:Shared="False">
<ScaleTransform />
<RotateTransform />
</TransformGroup>
En el código siguiente se muestra cómo animar la propiedad Angle de la RotateTransform que se muestra
en el ejemplo anterior.
<Rectangle
Name="Rectangle02"
Height="100"
Width="100"
Fill="Blue"
RenderTransform="{StaticResource MyTransformGroupResource}">
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="Rectangle02"
Storyboard.TargetProperty="RenderTransform.Children[1].Angle"
From="0" To="360" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
Establecer de manera indirecta una propiedad de destino de un objeto inmovilizable mediante código
En el código, se crea un objeto PropertyPath. Al crear el PropertyPath, especifique un Path y
PathParameters.
Para crear PathParameters, cree una matriz de tipo DependencyProperty que contenga una lista de campos
de identificador de propiedad de dependencia. El primer campo de identificador es para la propiedad del
FrameworkElement o FrameworkContentElement que el Freezable se usa para establecer. El siguiente
campo de identificador representa la propiedad del Freezable de destino. Considérelo como una cadena de
propiedades que conecta el Freezable con el objeto FrameworkElement.
El siguiente es un ejemplo de una cadena de propiedades de dependencia que tiene como destino el Color
de una SolidColorBrush que se usa para establecer el Fill de un elemento de rectángulo.
DependencyProperty[] propertyChain =
new DependencyProperty[]
{Rectangle.FillProperty, SolidColorBrush.ColorProperty};
También debe especificar una Path. Una Path es una String que indica al Path cómo interpretar su
PathParameters. Se usa la siguiente sintaxis:
Dónde
OwnerPropertyArrayIndex es el índice de la matriz DependencyProperty que contiene el
identificador de la propiedad del objeto FrameworkElement que el Freezable se usa para establecer y
FreezablePropertyArrayIndex es el índice de la matriz DependencyProperty que contiene el
identificador de la propiedad que se va a usar como destino.
En el ejemplo siguiente se muestra el Path que acompañaría al PathParameters definido en el ejemplo
anterior.
DependencyProperty[] propertyChain =
new DependencyProperty[]
{Rectangle.FillProperty, SolidColorBrush.ColorProperty};
string thePath = "(0).(1)";
En el ejemplo siguiente se combina el código de los ejemplos anteriores para animar el Color de una
SolidColorBrush que se usa para establecer el Fill de un elemento de rectángulo.
// Create a name scope for the page.
NameScope.SetNameScope(this, new NameScope());
DependencyProperty[] propertyChain =
new DependencyProperty[]
{Rectangle.FillProperty, SolidColorBrush.ColorProperty};
string thePath = "(0).(1)";
PropertyPath myPropertyPath = new PropertyPath(thePath, propertyChain);
Storyboard.SetTargetProperty(myColorAnimation, myPropertyPath);
En ocasiones, es preciso establecer como destino un objeto inmovilizable contenido en una colección o
matriz. Por ejemplo, supongamos que un rectángulo tiene un recurso TransformGroup aplicado a su
propiedad RenderTransform y desea animar una de las transformaciones que contiene.
<TransformGroup x:Key="MyTransformGroupResource"
x:Shared="False">
<ScaleTransform />
<RotateTransform />
</TransformGroup>
Para establecer como destino una Freezable incluida en una colección, use la sintaxis de ruta de acceso
siguiente.
DependencyProperty[] propertyChain =
new DependencyProperty[]
{
Rectangle.RenderTransformProperty,
TransformGroup.ChildrenProperty,
RotateTransform.AngleProperty
};
string thePath = "(0).(1)[1].(2)";
PropertyPath myPropertyPath = new PropertyPath(thePath, propertyChain);
Storyboard.SetTargetProperty(myDoubleAnimation, myPropertyPath);
<Rectangle
Name="MyRectangle"
Width="100"
Height="100"
Fill="Blue">
</Rectangle>
<Button Name="BeginButton">Begin</Button>
<Button Name="PauseButton">Pause</Button>
<Button Name="ResumeButton">Resume</Button>
<Button Name="SkipToFillButton">Skip To Fill</Button>
<Button Name="StopButton">Stop</Button>
<StackPanel.Triggers>
<EventTrigger RoutedEvent="Button.Click" SourceName="BeginButton">
<BeginStoryboard Name="MyBeginStoryboard">
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle"
Storyboard.TargetProperty="(Rectangle.Opacity)"
From="1.0" To="0.0" Duration="0:0:5" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.Click" SourceName="PauseButton">
<PauseStoryboard BeginStoryboardName="MyBeginStoryboard" />
</EventTrigger>
<EventTrigger RoutedEvent="Button.Click" SourceName="ResumeButton">
<ResumeStoryboard BeginStoryboardName="MyBeginStoryboard" />
</EventTrigger>
<EventTrigger RoutedEvent="Button.Click" SourceName="SkipToFillButton">
<SkipStoryboardToFill BeginStoryboardName="MyBeginStoryboard" />
</EventTrigger>
<EventTrigger RoutedEvent="Button.Click" SourceName="StopButton">
<StopStoryboard BeginStoryboardName="MyBeginStoryboard" />
</EventTrigger>
</StackPanel.Triggers>
</StackPanel>
</Page>
NOTE
Todas las acciones interactivas realizadas en un Clocky, por tanto, también en un Storyboard se producirán en el
siguiente paso del motor de control de tiempo, que se producirá poco antes del siguiente procesamiento. Por
ejemplo, si usa el método Seek para saltar a otro punto de una animación, el valor de la propiedad no cambia al
instante, sino que el valor cambia en el siguiente paso del motor de control de tiempo.
En el ejemplo siguiente se muestra cómo aplicar y controlar animaciones mediante los métodos
interactivos de la clase Storyboard.
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 ControllableStoryboardExample()
{
// Create a rectangle.
Rectangle myRectangle = new Rectangle();
myRectangle.Name = "myRectangle";
//
// Create an animation and a storyboard to animate the
// rectangle.
//
DoubleAnimation myDoubleAnimation = new DoubleAnimation();
myDoubleAnimation.From = 1.0;
myDoubleAnimation.To = 0.0;
myDoubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(5000));
myDoubleAnimation.AutoReverse = true;
//
// Create some buttons to control the storyboard
// and a panel to contain them.
//
StackPanel buttonPanel = new StackPanel();
buttonPanel.Orientation = Orientation.Horizontal;
Button beginButton = new Button();
beginButton.Content = "Begin";
beginButton.Click += new RoutedEventHandler(beginButton_Clicked);
buttonPanel.Children.Add(beginButton);
Button pauseButton = new Button();
pauseButton.Content = "Pause";
pauseButton.Click += new RoutedEventHandler(pauseButton_Clicked);
buttonPanel.Children.Add(pauseButton);
Button resumeButton = new Button();
resumeButton.Content = "Resume";
resumeButton.Click += new RoutedEventHandler(resumeButton_Clicked);
buttonPanel.Children.Add(resumeButton);
Button skipToFillButton = new Button();
skipToFillButton.Content = "Skip to Fill";
skipToFillButton.Click += new RoutedEventHandler(skipToFillButton_Clicked);
buttonPanel.Children.Add(skipToFillButton);
Button setSpeedRatioButton = new Button();
setSpeedRatioButton.Content = "Triple Speed";
setSpeedRatioButton.Click += new RoutedEventHandler(setSpeedRatioButton_Clicked);
buttonPanel.Children.Add(setSpeedRatioButton);
Button stopButton = new Button();
stopButton.Content = "Stop";
stopButton.Click += new RoutedEventHandler(stopButton_Clicked);
buttonPanel.Children.Add(stopButton);
myStackPanel.Children.Add(buttonPanel);
this.Content = myStackPanel;
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Shapes
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Namespace SDKSample
'
' Create an animation and a storyboard to animate the
' rectangle.
'
Dim myDoubleAnimation As New DoubleAnimation()
myDoubleAnimation.From = 1.0
myDoubleAnimation.To = 0.0
myDoubleAnimation.Duration = New Duration(TimeSpan.FromMilliseconds(5000))
myDoubleAnimation.AutoReverse = True
'
' Create some buttons to control the storyboard
' and a panel to contain them.
'
Dim buttonPanel As New StackPanel()
buttonPanel.Orientation = Orientation.Horizontal
Dim beginButton As New Button()
beginButton.Content = "Begin"
AddHandler beginButton.Click, AddressOf beginButton_Clicked
buttonPanel.Children.Add(beginButton)
Dim pauseButton As New Button()
pauseButton.Content = "Pause"
AddHandler pauseButton.Click, AddressOf pauseButton_Clicked
buttonPanel.Children.Add(pauseButton)
Dim resumeButton As New Button()
resumeButton.Content = "Resume"
AddHandler resumeButton.Click, AddressOf resumeButton_Clicked
buttonPanel.Children.Add(resumeButton)
Dim skipToFillButton As New Button()
skipToFillButton.Content = "Skip to Fill"
AddHandler skipToFillButton.Click, AddressOf skipToFillButton_Clicked
buttonPanel.Children.Add(skipToFillButton)
Dim setSpeedRatioButton As New Button()
setSpeedRatioButton.Content = "Triple Speed"
AddHandler setSpeedRatioButton.Click, AddressOf setSpeedRatioButton_Clicked
buttonPanel.Children.Add(setSpeedRatioButton)
Dim stopButton As New Button()
stopButton.Content = "Stop"
AddHandler stopButton.Click, AddressOf stopButton_Clicked
buttonPanel.Children.Add(stopButton)
myStackPanel.Children.Add(buttonPanel)
Me.Content = myStackPanel
End Sub
End Sub
End Sub
End Sub
End Sub
End Sub
End Sub
End Class
End Namespace
Animar en un estilo
Puede utilizar Storyboard objetos para definir animaciones en un Style. Animar con un Storyboard en un
Style es similar a usar un Storyboard en otro lugar, con las tres excepciones siguientes:
No se especifica un TargetName; el Storyboard siempre tiene como destino el elemento al que se
aplica el Style. Para tener como destino objetos Freezable, debe usar el establecimiento indirecto de
destinos. Para obtener más información sobre el establecimiento indirecto de destinos, consulte la
sección de destinatarios indirectos .
No se puede especificar un SourceName para un EventTrigger o un Trigger.
No se pueden usar referencias de recursos dinámicos o expresiones de enlace de datos para
establecer Storyboard o valores de propiedad de animación. Esto se debe a que todo lo que hay
dentro de un Style debe ser seguro para subprocesos y el sistema de control de tiempo debe
FreezeStoryboard objetos para que sean seguros para subprocesos. No se puede inmovilizar un
Storyboard si éste o sus escalas de tiempo secundarias contienen referencias de recursos dinámicos
o expresiones de enlace de datos. Para obtener más información sobre la inmovilización y otras
características de Freezable, consulte la información general sobre objetos Freezable.
En XAML, no se pueden declarar controladores de eventos para eventos de Storyboard o de
animación.
Para ver un ejemplo en el que se muestra cómo definir un guion gráfico en un estilo, vea el ejemplo de
animar en un estilo .
Animar en un ControlTemplate
Puede utilizar Storyboard objetos para definir animaciones en un ControlTemplate. Animar con un
Storyboard en un ControlTemplate es similar a usar un Storyboard en otro lugar, con las dos excepciones
siguientes:
El TargetName solo puede hacer referencia a objetos secundarios de la ControlTemplate. Si no se
especifica TargetName, la animación tiene como destino el elemento al que se aplica el
ControlTemplate.
El SourceName para un EventTrigger o un Trigger solo puede hacer referencia a objetos secundarios
del ControlTemplate.
No se pueden usar referencias de recursos dinámicos o expresiones de enlace de datos para
establecer Storyboard o valores de propiedad de animación. Esto se debe a que todo lo que hay
dentro de un ControlTemplate debe ser seguro para subprocesos y el sistema de control de tiempo
debe FreezeStoryboard objetos para que sean seguros para subprocesos. No se puede inmovilizar
un Storyboard si éste o sus escalas de tiempo secundarias contienen referencias de recursos
dinámicos o expresiones de enlace de datos. Para obtener más información sobre la inmovilización y
otras características de Freezable, consulte la información general sobre objetos Freezable.
En XAML, no se pueden declarar controladores de eventos para eventos de Storyboard o de
animación.
Para ver un ejemplo en el que se muestra cómo definir un guion gráfico en un ControlTemplate, vea el
ejemplo de animar en un ControlTemplate .
Vea también
Información general sobre animaciones
Información general sobre técnicas de animación de propiedades
Información general sobre objetos Freezable
Información general sobre comportamientos de
control de tiempo
08/01/2020 • 15 minutes to read • Edit Online
En este tema se describen los comportamientos de control de tiempo de las animaciones y otros objetos de
Timeline.
Requisitos previos
Para entender este tema, debe estar familiarizado con las características de animación básicas. Para obtener más
información, vea información general sobre animaciones.
AnimationTimeline Clase base abstracta para los objetos Timeline que generan
valores de salida para animar propiedades.
Propiedad Duration
Como se ha mencionado previamente, un objeto Timeline representa un segmento de tiempo. La longitud de ese
segmento viene determinada por la Durationde la escala de tiempo. Cuando un objeto Timeline llega al final de
su duración, detiene la reproducción. Si el objeto Timeline tiene objetos Timeline secundarios, su reproducción
también se detiene. En el caso de una animación, el Duration especifica cuánto tiempo tarda la animación en
pasar de su valor inicial a su valor final. La duración de una escala de tiempo se denomina a veces su duración
simple, para distinguir entre la duración de una iteración única y la duración total de tiempo que se reproduce la
animación, incluidas las repeticiones. Puede especificar una duración mediante un valor de hora finito o los
valores especiales Automatic o Forever. La duración de una animación debe resolverse en un valor TimeSpan,
por lo que puede realizar la transición entre valores.
En el ejemplo siguiente se muestra un DoubleAnimation con un Duration de cinco segundos.
<DoubleAnimation
Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:5" />
Las escalas de tiempo de contenedor, como Storyboard y ParallelTimeline, tienen una duración predeterminada
de Automatic, lo que significa que finalizan automáticamente cuando su último elemento secundario deja de
reproducirse. En el ejemplo siguiente se muestra un Storyboard cuyo Duration se resuelve en cinco segundos, el
tiempo que se tardan todos sus objetos DoubleAnimation secundarios en completarse.
<Storyboard >
<DoubleAnimation
Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:5" />
<DoubleAnimation
Storyboard.TargetName="MyOtherRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:3" />
</Storyboard>
Al establecer el Duration de una escala de tiempo de contenedor en un valor de TimeSpan, puede forzar que se
reproduzca más o menos que sus objetos Timeline secundarios se reproduzcan. Si establece el Duration en un
valor menor que la longitud de los objetos Timeline secundarios de la escala de tiempo del contenedor, los
objetos secundarios Timeline dejarán de reproducirse cuando lo hace la escala de tiempo del contenedor. En el
ejemplo siguiente se establece el Duration de la Storyboard de los ejemplos anteriores en tres segundos. Como
resultado, la primera DoubleAnimation detiene el progreso transcurridos tres segundos, cuando ha animado el
ancho del rectángulo de destino hasta 60.
<Storyboard Duration="0:0:3">
<DoubleAnimation
Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:5" />
<DoubleAnimation
Storyboard.TargetName="MyOtherRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:3" />
</Storyboard>
Propiedad RepeatBehavior
La propiedad RepeatBehavior de una Timeline controla el número de veces que se repite su duración simple.
Con la propiedad RepeatBehavior, puede especificar el número de veces que se reproduce la escala de tiempo
(una iteración Count) o la duración total de tiempo que debe reproducirse (un Durationde repetición). En
cualquier caso, la animación pasa por tantas repeticiones de principio a fin como sean necesarias para completar
el recuento o la duración solicitados. De forma predeterminada, las escalas de tiempo tienen un recuento de
iteraciones de 1.0 , lo que significa que se reproducen una vez y no se repiten.
En el ejemplo siguiente se usa la propiedad RepeatBehavior para hacer que un DoubleAnimation se reproduzca
durante el doble de su duración simple mediante la especificación de un recuento de iteraciones.
<DoubleAnimation
Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:5"
RepeatBehavior="2x" />
En el ejemplo siguiente se usa la propiedad RepeatBehavior para hacer que el DoubleAnimation se reproduzca
durante la mitad de su duración simple.
<DoubleAnimation
Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:5"
RepeatBehavior="0.5x" />
Si establece la propiedad RepeatBehavior de una Timeline en Forever, la Timeline se repite hasta que se detiene
interactivamente o por el sistema de control de tiempo. En el ejemplo siguiente se usa la propiedad
RepeatBehavior para hacer que el DoubleAnimation se reproduzca indefinidamente.
<DoubleAnimation
Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:5"
RepeatBehavior="Forever" />
<DoubleAnimation
Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:5"
AutoReverse="True" />
Cuando se usa un valor Count para especificar el RepeatBehavior de un Timeline y la propiedad AutoReverse de
ese Timeline es true , una repetición única consta de una iteración de avance seguida de una iteración hacia
atrás. En el ejemplo siguiente se establece el RepeatBehavior del DoubleAnimation del ejemplo anterior en una
Count de dos. Como resultado, el DoubleAnimation se reproduce durante 20 segundos: avance durante cinco
segundos, hacia atrás durante cinco segundos, hacia adelante durante cinco segundos y, a continuación, hacia
atrás durante cinco segundos.
<DoubleAnimation
Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:5"
RepeatBehavior="2"
AutoReverse="True" />
Si una escala de tiempo de contenedor tiene objetos secundarios Timeline, se revierten cuando la escala de
tiempo del contenedor. Para obtener más ejemplos, vea especificar si una escala de tiempo se invierte
automáticamente.
Propiedad BeginTime
La propiedad BeginTime permite especificar Cuándo se inicia una escala de tiempo. El momento de inicio de un
objeto Timeline es relativo a su objeto Timeline primario. Un tiempo de inicio de cero segundos significa que el
objeto Timeline se inicia tan pronto lo hace su primario; cualquier otro valor crea un desfase entre el momento
en que se empieza a reproducir el Timeline primario y el momento en que lo hace el secundario. Por ejemplo, un
tiempo de inicio de dos segundos significa que el objeto Timeline empieza a reproducirse cuando su elemento
primario ha alcanzado un tiempo de dos segundos. De forma predeterminada, todos los objetos Timeline tienen
un tiempo de inicio de cero segundos. También puede establecer la hora de inicio de una escala de tiempo en
null , lo que impide que se inicie la escala de tiempo. En WPF, especifique NULL mediante la extensión de
marcado x:null.
Tenga en cuenta que la hora de inicio no se aplica cada vez que una escala de tiempo se repite debido a su
configuración RepeatBehavior. Si fuera a crear una animación con una BeginTime de 10 segundos y un
RepeatBehavior de Forever, se produciría un retraso de 10 segundos antes de que se reproduzca la animación
por primera vez, pero no para cada repetición sucesiva. Sin embargo, si se reinicia o repite el objeto Timeline
primario, se produciría el retraso de 10 segundos.
La propiedad BeginTime es útil para escalonar las escalas de tiempo. En el ejemplo siguiente se crea un
Storyboard que tiene dos objetos DoubleAnimation secundarios. La primera animación tiene una Duration de
cinco segundos y la segunda tiene una Duration de 3 segundos. En el ejemplo se establece el BeginTime del
segundo DoubleAnimation en 5 segundos, de modo que comience a reproducirse después de que finalice la
primera DoubleAnimation.
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:5"
BeginTime="0:0:0" />
<DoubleAnimation
Storyboard.TargetName="MyOtherRectangle" Storyboard.TargetProperty="Width"
From="0" To="100" Duration="0:0:3"
BeginTime="0:0:5" />
</Storyboard>
Propiedad FillBehavior
Cuando un Timeline alcanza el final de su duración total activa, la propiedad FillBehavior especifica si se detiene
o contiene su último valor. Una animación con una FillBehavior de HoldEnd "contiene" su valor de salida: la
propiedad que se anima conserva el último valor de la animación. Un valor de Stop hace que la animación deje
de afectar a su propiedad de destino una vez finalizada.
En el ejemplo siguiente se crea un Storyboard que tiene dos objetos DoubleAnimation secundarios. Ambos
objetos DoubleAnimation animan el Width de una Rectangle de 0 a 100. Los elementos Rectangle tienen valores
de Width no animados de 500 [píxeles independientes del dispositivo].
La propiedad FillBehavior del primer DoubleAnimation está establecida en HoldEnd, el valor
predeterminado. Como resultado, el ancho del rectángulo permanece en 100 una vez finalizada la
DoubleAnimation.
La propiedad FillBehavior del segundo DoubleAnimation está establecida en Stop. Como resultado, el
Width del segundo Rectangle vuelve a 500 después de que finalice la DoubleAnimation.
<Rectangle Name="MyRectangle"
Width="500" Height="100"
Opacity="1" Fill="Red">
</Rectangle>
<Rectangle Name="MyOtherRectangle"
Width="500" Height="100"
Opacity="1" Fill="Orange">
</Rectangle>
Vea también
Información general sobre animaciones
Información general sobre sistemas de control de tiempo y animación
Información general sobre eventos de control de tiempo
Temas "Cómo..."
Ejemplo del comportamiento del control de tiempo de la animación
Información general sobre eventos de control de
tiempo
23/10/2019 • 8 minutes to read • Edit Online
Este tema describe cómo utilizar los cinco eventos de control de tiempo disponible en Timeline y Clock objetos.
Requisitos previos
Para entender este tema, debe entender cómo crear y utilizar animaciones. Para empezar a trabajar con
animación, vea el información general sobre animaciones.
Hay varias maneras de animar propiedades en WPF:
Usar objetos storyboard (marcado y código): Puede usar Storyboard objetos para organizar y distribuir
animaciones a uno o varios objetos. Para obtener un ejemplo, vea animar una propiedad utilizando un
guión gráfico.
Mediante animaciones locales (solo código): Puede aplicar AnimationTimeline objetos directamente a
las propiedades que animan. Para obtener un ejemplo, vea Animar una propiedad sin utilizar un guión
gráfico.
Mediante relojes (solo código): Puede administrar la creación de un reloj explícitamente y distribuir los
relojes de animación personalmente. Para obtener un ejemplo, vea animar una propiedad usando un objeto
AnimationClock.
Dado que puede usar en la marcación y código, utilizan los ejemplos en esta introducción Storyboard objetos. Sin
embargo, los conceptos descritos pueden aplicarse a los otros métodos existentes para animar propiedades.
¿Qué es un reloj?
Un objeto Timeline, por sí mismo, realmente no hace nada más que describir un segmento de tiempo. Es la escala
de tiempo Clock objeto que hace el trabajo real: mantiene el estado de tiempo de ejecución relacionados con el
control de tiempo para la escala de tiempo. En la mayoría de los casos, como cuando se utilizan objetos
Storyboard, se crea automáticamente un reloj para dichos objetos. También puede crear un Clock explícitamente
mediante el CreateClock método. Para obtener más información acerca de Clock objetos, vea el Animation and
Timing System Overview.
myStoryboard.Stop(myRectangle);
En el ejemplo anterior, la segunda línea de código podría ejecutarse antes de que se detenga el objeto Storyboard.
Esto se debe a que la detención es una operación asincrónica. Al indicar a un objeto Timeline o Clock que se
detenga, se crea una "solicitud de detención" que no se procesa hasta el siguiente ciclo del motor de control de
tiempo.
Para ejecutar comandos una vez finalizada la reproducción de un objeto Timeline, utilice eventos de control de
tiempo. En el ejemplo siguiente, se utiliza un controlador de eventos para cambiar el color de un rectángulo al
detenerse el objeto Storyboard.
Para obtener un ejemplo más completo, vea los cambios de recibir notificación cuando un reloj de estado.
Eventos públicos
El Timeline y Clock clases proporcionan cinco eventos de temporización. En la tabla siguiente se enumeran estos
eventos y las condiciones que los desencadenan.
OPERACIÓN INTERACTIVA
EVENTO DESENCADENANTE OTROS DESENCADENADORES
RemoveRequested Quitar
Vea también
Información general sobre sistemas de control de tiempo y animación
Información general sobre animaciones
Información general sobre comportamientos de control de tiempo
Temas "Cómo..." de animación y control de tiempo
23/10/2019 • 2 minutes to read • Edit Online
Los temas siguientes muestran cómo usar el Windows Presentation Foundation (WPF ) sistema de animación y
temporización en sus aplicaciones.
En esta sección
Aumentar o reducir la velocidad de una animación
Acumular valores de animaciones durante la repetición de ciclos
Agregar un valor de salida de animación a un valor inicial de animación
Animar una propiedad utilizando un guión gráfico
Animar una propiedad sin utilizar un guión gráfico
Animar en un ControlTemplate
Animar en un estilo
Animar la opacidad de un elemento o pincel
Cambiar la velocidad de un reloj sin cambiar la velocidad de su escala de tiempo
Controlar un guión gráfico una vez iniciado usando métodos interactivos
Controlar una animación mediante From, To y By
Definir un ámbito de nombres
Recibir una notificación cuando cambia el estado de un reloj
Repetir una animación
Buscar un guión gráfico
Buscar guiones gráficos de forma sincrónica
Definir una duración para una animación
Establecer una propiedad después de animarla con un guión gráfico
Simplificar las animaciones mediante escalas de tiempo secundarias
Especificar HandoffBehavior entre animaciones de guión gráfico
Especificar el comportamiento de relleno de una escala de tiempo que ha llegado al final de su período de
actividad
Especificar si una escala de tiempo se invierte automáticamente
Activar una animación al cambiar el valor de una propiedad
Utilizar desencadenadores de eventos para controlar un guión gráfico después de su inicio
Referencia
Timeline
Storyboard
BeginStoryboard
Clock
System.Windows.Media.Animation
Secciones relacionadas
Gráficos y multimedia
Procedimiento Aumentar o reducir la velocidad de
una animación
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo realizar una animación acelerar y reducir la velocidad con el tiempo. En el
ejemplo siguiente, se animan los rectángulos varios por animaciones con diferentes AccelerationRatio y
DecelerationRatio configuración.
Ejemplo
<!-- This example shows how to use the AccelerationRatio and
DecelerationRatio properties of timelines
to make animations speed up or slow down as they progress. -->
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:SampleControls="SampleControls"
WindowTitle="Acceleration and Deceleration Example">
<StackPanel Margin="20">
<!-- Creates an animation that accelerates through 40% of its duration. -->
<DoubleAnimation
Storyboard.TargetName="acceleratedRectangle"
Storyboard.TargetProperty="(Rectangle.Width)"
AccelerationRatio="0.4" Duration="0:0:10" From="20" To="400" />
<!-- Creates an animation that decelerates through 60% of its duration. -->
<DoubleAnimation
Storyboard.TargetName="deceleratedRectangle"
Storyboard.TargetProperty="(Rectangle.Width)"
DecelerationRatio="0.6" Duration="0:0:10" From="20" To="400" />
<!-- Creates an animation that accelerates through 40% of its duration and
decelerates through the 60% of its duration. -->
<DoubleAnimation
Storyboard.TargetName="acceleratedAndDeceleratedRectangle"
Storyboard.TargetProperty="(Rectangle.Width)"
AccelerationRatio="0.4" DecelerationRatio="0.6" Duration="0:0:10" From="20" To="400" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Page>
Se ha omitido el código en este ejemplo. Para el código completo, vea el comportamiento de tiempo de
animación (C#) o comportamiento de tiempo de animación (Visual Basic) .
Procedimiento Acumular valores de animaciones
durante la repetición de ciclos
23/10/2019 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo usar el IsCumulative propiedad que se va a acumular valores de animaciones
entre ciclos que se repiten.
Ejemplo
Use el IsCumulative propiedad que se va a acumular los valores base de una animación entre ciclos que se repiten.
Por ejemplo, si establece una animación se repita 9 veces (RepeatBehavior = "9 x") y establezca la propiedad que
se va a animar entre 10 y 15 (From = 10 a = 15), la propiedad se anima de 10 a 15 durante el primer ciclo de 15 a
20 durante el ciclo de segundo , de 20 a 25 durante el ciclo de terceros y así sucesivamente. Por lo tanto, cada ciclo
de animación usa el valor final de la animación desde el ciclo de animación anterior como su valor base.
Puede usar el IsCumulative propiedad con animaciones más básicas y la mayoría de las animaciones de
fotogramas clave. Para obtener más información, consulte información general sobre animaciones y información
general sobre animaciones de fotogramas clave.
El ejemplo siguiente muestra este comportamiento al animar el ancho de cuatro rectángulos. El ejemplo:
Anima el primer rectángulo con DoubleAnimation y establece el IsCumulative propiedad true .
Anima el segundo rectángulo con DoubleAnimation y establece el IsCumulative propiedad en el valor
predeterminado de false .
Anima el tercer rectángulo con DoubleAnimationUsingKeyFrames y establece el IsCumulative propiedad
true .
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel Margin="20" >
<!-- This rectangle is animated with DoubleAnimation and IsCumulative set to "True". -->
<Rectangle Name="withIsCumulative"
Width="100" Height="20" Margin="12,0,0,5" Fill="#AA3333FF" HorizontalAlignment="Left" />
<!-- This rectangle is animated with DoubleAnimation and IsCumulative set to "False". -->
<Rectangle Name="withoutIsCumulative"
Width="100" Height="20" Margin="12,0,0,5" Fill="#AA3333FF" HorizontalAlignment="Left" />
<!-- This rectangle is animated with DoubleAnimationUsingKeyFrames and IsCumulative set to "True". -->
<Rectangle Name="withIsCumulativeUsingKeyFrames"
Width="100" Height="20" Margin="12,0,0,5" Fill="#AA3333FF" HorizontalAlignment="Left" />
<!-- This rectangle is animated with DoubleAnimationUsingKeyFrames and IsCumulative set to "False". -->
<Rectangle Name="withoutIsCumulativeUsingKeyFrames"
Width="100" Height="20" Margin="12,0,0,5" Fill="#AA3333FF" HorizontalAlignment="Left" />
<!-- DoubleAnimation with IsCumulative set to "True". Because IsCumulative is set to "True",
the base values of the animation will accumulate over repeat cycles. In this example, the
first iteration will be from 100 to 200, the second will be from 200 to 300, the third from
300 to 400, etc. -->
<DoubleAnimation
Storyboard.TargetName="withIsCumulative"
Storyboard.TargetProperty="Width"
RepeatBehavior="4x"
AutoReverse="True"
IsCumulative="True"
Duration="0:0:3" From="100" To="200" />
<!-- DoubleAnimation with IsCumulative set to "False". The starting value 100 pixels and repeat
cycles do not build on earlier ones. -->
<DoubleAnimation
Storyboard.TargetName="withoutIsCumulative"
Storyboard.TargetProperty="Width"
RepeatBehavior="4x"
AutoReverse="True"
IsCumulative="False"
Duration="0:0:3" From="100" To="200" />
<!-- DoubleAnimationUsingKeyFrames with IsCumulative set to "False". The base value of each
cycle
does not build on the last one. -->
<DoubleAnimationUsingKeyFrames
Storyboard.TargetName="withoutIsCumulativeUsingKeyFrames"
Storyboard.TargetProperty="Width"
RepeatBehavior="4x"
AutoReverse="True"
IsCumulative="False" >
<DoubleAnimationUsingKeyFrames.KeyFrames>
<LinearDoubleKeyFrame Value="100" KeyTime="0:0:0" />
<LinearDoubleKeyFrame Value="130" KeyTime="0:0:1" />
<SplineDoubleKeyFrame KeySpline="0.6,0.0 0.9,0.00" Value="200" KeyTime="0:0:3" />
</DoubleAnimationUsingKeyFrames.KeyFrames>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Page>
Vea también
Agregar un valor de salida de animación a un valor inicial de animación
Repetir una animación
Información general sobre animaciones
Información general sobre animaciones de fotogramas clave
Temas "Cómo..."
Procedimiento Agregar un valor de salida de
animación a un valor inicial de animación
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo agregar un valor de salida de animación a un valor inicial de animación.
Ejemplo
El IsAdditive propiedad especifica si desea que el valor de salida de una animación que se agrega al valor inicial
(valor base) de una propiedad animada. Puede usar el IsAdditive propiedad con animaciones más básicas y la
mayoría de las animaciones de fotogramas clave. Para obtener más información, consulte información general
sobre animaciones y información general sobre animaciones de fotogramas clave.
El ejemplo siguiente muestra el efecto de usar el DoubleAnimation.IsAdditive propiedad con DoubleAnimation y
el uso de la DoubleAnimationUsingKeyFrames.IsAdditive propiedad con DoubleAnimationUsingKeyFrames.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel Margin="20" >
<!-- This rectangle is animated with DoubleAnimation and IsAdditive set to "True". -->
<Rectangle Name="withIsAdditive"
Width="100" Height="20" Margin="12,0,0,5" Fill="#AA3333FF" HorizontalAlignment="Left" />
<!-- This rectangle is animated with DoubleAnimation and IsAdditive set to "False". -->
<Rectangle Name="withoutIsAdditive"
Width="100" Height="20" Margin="12,0,0,5" Fill="#AA3333FF" HorizontalAlignment="Left" />
<!-- This rectangle is animated with DoubleAnimationUsingKeyFrames and IsAdditive set to "True". -->
<Rectangle Name="withIsAdditiveUsingKeyFrames"
Width="100" Height="20" Margin="12,0,0,5" Fill="#AA3333FF" HorizontalAlignment="Left" />
<!-- This rectangle is animated with DoubleAnimationUsingKeyFrames and IsAdditive set to "False". -->
<Rectangle Name="withoutIsAdditiveUsingKeyFrames"
Width="100" Height="20" Margin="12,0,0,5" Fill="#AA3333FF" HorizontalAlignment="Left" />
<!-- DoubleAnimation with IsAdditive set to "True". Because IsAdditive is set to "True" the
actual starting value of the animation is equal to the sum of the default starting
value of 100 (From="100)and the animation output value of 100 (From="100" To="200")
Therefore
the animation begins at 200 pixels. Notice that each time the button is clicked and the
animation is initiated, the animation starting value builds upon the preceeding ending
value. -->
<DoubleAnimation
Storyboard.TargetName="withIsAdditive"
Storyboard.TargetProperty="Width"
Duration="0:0:3" From="100" To="200" IsAdditive="True" />
<!-- DoubleAnimation with IsAdditive set to "False". The starting value is the default starting
value of 100 pixels and subsequent animations do not build on earlier ones. -->
<DoubleAnimation
<DoubleAnimation
Storyboard.TargetName="withoutIsAdditive"
Storyboard.TargetProperty="Width"
Duration="0:0:3" From="100" To="200" IsAdditive="False" />
<!-- DoubleAnimationUsingKeyFrames with IsAdditive set to "False". The starting value is the
default starting value of 100 pixels and subsequent animations do not build on earlier
ones. -->
<DoubleAnimationUsingKeyFrames
Storyboard.TargetName="withoutIsAdditiveUsingKeyFrames"
Storyboard.TargetProperty="Width"
IsAdditive="False" >
<DoubleAnimationUsingKeyFrames.KeyFrames>
<LinearDoubleKeyFrame Value="100" KeyTime="0:0:0" />
<LinearDoubleKeyFrame Value="130" KeyTime="0:0:1" />
<SplineDoubleKeyFrame KeySpline="0.6,0.0 0.9,0.00" Value="200" KeyTime="0:0:3" />
</DoubleAnimationUsingKeyFrames.KeyFrames>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Page>
Vea también
Acumular valores de animaciones durante la repetición de ciclos
Información general sobre animaciones
Información general sobre animaciones de fotogramas clave
Temas de procedimientos de temporización y animación
Cómo: Animar una propiedad utilizando un guión
gráfico
08/01/2020 • 8 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un Storyboard para animar propiedades. Para animar una propiedad
mediante un Storyboard, cree una animación para cada propiedad que desee animar y cree también un
Storyboard que contenga las animaciones.
El tipo de propiedad determina el tipo de animación que se va a utilizar. Por ejemplo, para animar una
propiedad que toma Double valores, utilice un DoubleAnimation. Las propiedades adjuntas TargetName y
TargetProperty especifican el objeto y la propiedad a la que se aplica la animación.
Para iniciar un guion gráfico en Lenguaje XAML (Extensible Application Markup Language), use una acción de
BeginStoryboard y una EventTrigger. El EventTrigger inicia la acción de BeginStoryboard cuando se produce el
evento especificado por su propiedad RoutedEvent. La acción BeginStoryboard inicia el Storyboard.
En el ejemplo siguiente se utiliza Storyboard objetos para animar dos controles Button. Para que el primer
cambio de botón tenga el mismo tamaño, se anima su Width. Para hacer que el segundo botón cambie de color,
se usa la propiedad Color del SolidColorBrush para establecer la Background del botón que está animado.
Ejemplo
<!-- StoryboardExample.xaml
Uses storyboards to animate properties. -->
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="Animate Properties with Storyboards">
<Border Background="White">
<StackPanel Margin="30" HorizontalAlignment="Left" MinWidth="500">
<!-- The color of the brush used to paint this button is animated. -->
<Button Height="30" Width="200"
HorizontalAlignment="Left">Another Button
<Button.Background>
<SolidColorBrush x:Name="myAnimatedBrush" Color="Blue" />
</Button.Background>
<Button.Triggers>
NOTE
Aunque las animaciones pueden tener como destino un objeto FrameworkElement, como un Control o Panel, y un objeto
Freezable, como un Brush o Transform, solo los elementos del marco tienen una propiedad Name. Para asignar un
nombre a un elemento inmovilizable para que pueda servir de destino para una animación, utilice x:Name (Directiva),
como se muestra en el ejemplo anterior.
Si utiliza código, debe crear un NameScope para un FrameworkElement y registrar los nombres de los objetos
que desea animar con ese FrameworkElement. Para iniciar las animaciones en el código, utilice una acción de
BeginStoryboard con un EventTrigger. Opcionalmente, puede usar un controlador de eventos y el método
Begin de Storyboard. En el siguiente ejemplo, se muestra cómo utilizar el método Begin.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace Microsoft.Samples.Animation.AnimatingWithStoryboards
{
public StoryboardExample()
{
// Create a name scope for the page.
NameScope.SetNameScope(this, new NameScope());
//
// Create and animate the first button.
//
// Create a button.
Button myWidthAnimatedButton = new Button();
myWidthAnimatedButton.Height = 30;
myWidthAnimatedButton.Width = 200;
myWidthAnimatedButton.HorizontalAlignment = HorizontalAlignment.Left;
myWidthAnimatedButton.Content = "A Button";
// Register the name with the page to which the button belongs.
this.RegisterName(myWidthAnimatedButton.Name, myWidthAnimatedButton);
myStackPanel.Children.Add(myWidthAnimatedButton);
//
// Create and animate the second button.
//
myStackPanel.Children.Add(myColorAnimatedButton);
this.Content = myStackPanel;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Namespace SDKSample
' Uses a storyboard to animate the properties
' of two buttons.
Public Class StoryboardExample
Inherits Page
'
' Create and animate the first button.
'
' Register the name with the page to which the button belongs.
Me.RegisterName(myWidthAnimatedButton.Name, myWidthAnimatedButton)
myStackPanel.Children.Add(myWidthAnimatedButton)
'
' Create and animate the second button.
'
myStackPanel.Children.Add(myColorAnimatedButton)
Me.Content = myStackPanel
End Sub
myWidthAnimatedButtonStoryboard.Begin(myWidthAnimatedButton)
End Sub
myColorAnimatedButtonStoryboard.Begin(myColorAnimatedButton)
End Sub
End Class
End Namespace
Para más información sobre animaciones y guiones gráficos, vea Información general sobre animaciones.
Si utiliza código, no se limita a utilizar objetos de Storyboard para animar propiedades. Para más información y
ejemplos, vea Animar una propiedad sin utilizar un guión gráfico y Animar una propiedad usando un objeto
AnimationClock.
Procedimiento Animar una propiedad sin usar un
guión gráfico
23/10/2019 • 4 minutes to read • Edit Online
En este ejemplo se muestra una manera de aplicar una animación a una propiedad sin Storyboardusar.
NOTE
Esta funcionalidad no está disponible en Lenguaje XAML (Extensible Application Markup Language). Para información
sobre cómo animar una propiedad en XAML, vea Animar una propiedad utilizando un guión gráfico.
Para aplicar una animación local a una propiedad, use el BeginAnimation método. Este método toma dos
parámetros: un DependencyProperty que especifica la propiedad que se va a animar y la animación que se va a
aplicar a esa propiedad.
Ejemplo
En el ejemplo siguiente se muestra cómo animar el ancho y el color Buttonde fondo de un.
/*
*/
namespace Microsoft {
namespace Samples {
namespace Animation {
namespace LocalAnimations {
// Create the demonstration.
public ref class LocalAnimationExample : Page {
public:
LocalAnimationExample ()
{
WindowTitle = "Local Animation Example";
StackPanel^ myStackPanel = gcnew StackPanel();
myStackPanel->Margin = Thickness(20);
*/
using System;
using System.Windows;
using System.Windows.Navigation;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Controls;
namespace Microsoft.Samples.Animation.LocalAnimations
{
public LocalAnimationExample()
{
Imports System.Windows
Imports System.Windows.Navigation
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Imports System.Windows.Controls
Namespace Microsoft.Samples.Animation.LocalAnimations
Vea también
AnimationTimeline
BeginAnimation
System.Windows.Media.Animation
Storyboard
Información general sobre técnicas de animación de propiedades
Información general sobre animaciones
Procedimiento Animar en un ControlTemplate
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo usar Storyboard, EventTrigger, y Trigger objetos que se va a animar dentro de
un ControlTemplate.
Ejemplo
<!-- ControlStoryboardExample.xaml
Uses storyboards to animate properties with a ControlTemplate. -->
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="Animate Properties with Storyboards">
<Page.Resources>
<ControlTemplate x:Key="MyControlTemplate"
TargetType="{x:Type ContentControl}">
<Border
Margin="{TemplateBinding Padding}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}">
<Border Name="innerBorder" Padding="10">
<Border.Background>
<SolidColorBrush x:Name="innerBorderBackgroundBrush"
Color="White" />
</Border.Background>
<Grid Name="contentPanel">
<Grid.Background>
<SolidColorBrush x:Name="contentPanelBrush" Color="White" />
</Grid.Background>
<ContentPresenter
Margin="10"
Content="{TemplateBinding Content}"
TextBlock.Foreground="{TemplateBinding Foreground}" />
</Grid>
</Border>
</Border>
<ControlTemplate.Triggers>
</Page.Resources>
<Border Background="White">
<StackPanel Margin="30" HorizontalAlignment="Left" MinWidth="500">
</StackPanel>
</Border>
</Page>
Para obtener más información acerca de cómo animar las propiedades con guiones gráficos, vea Storyboards
Overview.
Vea también
ControlTemplate
Cómo animar en un estilo
27/01/2020 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo animar las propiedades dentro de un estilo. Al animar dentro de un estilo, solo
se puede destinar directamente el elemento de marco para el que se define el estilo. Para establecer como destino
un objeto Freezable, debe "punto inactivo" desde una propiedad del elemento con estilo.
En el ejemplo siguiente, se definen varias animaciones dentro de un estilo y se aplican a un Button. Cuando el
usuario mueve el mouse sobre el botón, lo atenúa de forma repetida y viceversa. Cuando el usuario mueve el
mouse fuera del botón, se vuelve completamente opaco. Al hacer clic en el botón, el color de fondo cambia de
naranja a blanco y viceversa. Dado que el SolidColorBrush que se usa para pintar el botón no se puede destinar
directamente, se obtiene acceso a él mediante el uso de puntos hacia abajo desde la propiedad Background del
botón.
Ejemplo
<!-- StyleStoryboardsExample.xaml
This example shows how to create storyboards in a style. -->
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="Storyboards in Styles Example" Background="White">
<Page.Resources>
<!-- Returns the button's opacity to 1 when the mouse leaves. -->
<EventTrigger RoutedEvent="Button.MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="(Button.Opacity)"
To="1" Duration="0:0:0.1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<!-- Changes the button's color when clicked.
Notice that the animation can't target the
SolidColorBrush used to paint the button's background
directly. The brush must be accessed through the button's
Background property. -->
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
From="Orange" To="White" Duration="0:0:0.1" AutoReverse="True" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Page.Resources>
<StackPanel Margin="20">
<Button Style="{StaticResource MyButtonStyle}">Click Me</Button>
</StackPanel>
</Page>
Tenga en cuenta que al animar dentro de un estilo, es posible tener como destino objetos que no existen. Por
ejemplo, suponga que el estilo usa un SolidColorBrush para establecer la propiedad de fondo de un botón, pero
en algún momento se invalida el estilo y el fondo del botón se establece con un LinearGradientBrush. Al intentar
animar el SolidColorBrush no se producirá una excepción; la animación simplemente producirá un error de forma
silenciosa.
Para obtener más información sobre la sintaxis de destino de guion gráfico, vea la información general sobre los
guiones gráficos. Para obtener más información acerca de la animación, consulte información general sobre
animaciones. Para obtener más información sobre los estilos, vea el estilo y la plantilla.
Procedimiento Animar la opacidad de un elemento o
pincel
23/10/2019 • 3 minutes to read • Edit Online
Para hacer que un elemento de marco se desvanezca y salga de la vista, puede Opacity animar su propiedad o
puede Opacity animar la Brush propiedad de (o pinceles) que se usa para pintarla. Animar la opacidad del
elemento hace que esta y sus elementos secundarios se muestreen y salgan de la vista, pero la animación del
pincel que se usa para pintar el elemento le permite ser más selectivo sobre qué parte del elemento se atenúa. Por
ejemplo, podría animar la opacidad de un pincel que se usa para pintar el fondo de un botón. Esto haría que el
fondo del botón se desvanecera y fuera de la vista, mientras que el texto se quedaba totalmente opaco.
NOTE
Animar Brushdeun proporciona ventajas de rendimiento sobre la Opacity animación de la propiedad de un elemento. Opacity
En el ejemplo siguiente, se animan dos botones para que se atenúen y desaparecen de la vista. La opacidad de la
primera Button se anima desde 1.0 hasta 0.0 Duration cinco segundos. El segundo botón también se anima,
pero la opacidad del SolidColorBrush que se usa para pintar Background su está animada en lugar de la opacidad
del botón completo. Cuando se ejecuta el ejemplo, el primer botón se atenúa completamente y se aleja de la vista,
mientras que solo el fondo del segundo botón se atenúa y sale de la vista. Su texto y borde permanecen totalmente
opacos.
Ejemplo
<!-- OpacityAnimationExample.xaml
This example shows how to animate the opacity of objects,
making them fade in and out of view. -->
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="Opacity Animation Example" Background="White">
<StackPanel Margin="20">
El código se ha omitido en este ejemplo. En el ejemplo completo también se muestra cómo animar la opacidad
Color de un LinearGradientBrushdentro de un. Para obtener el ejemplo completo, vea el ejemplo de animación de
la opacidad de un elemento.
Procedimiento Cambiar la velocidad de un reloj sin
cambiar la velocidad de su escala de tiempo
23/10/2019 • 4 minutes to read • Edit Online
Un ClockController del objeto SpeedRatio propiedad le permite cambiar la velocidad de un Clock sin alterar el
SpeedRatio el reloj de Timeline. En el ejemplo siguiente, un ClockController se usa para modificar de forma
interactiva el SpeedRatio de un reloj. El CurrentGlobalSpeedInvalidated eventos y el reloj CurrentGlobalSpeed
propiedad se usa para mostrar la velocidad del reloj actual global cada vez que su interactivo SpeedRatio se
cambia.
Ejemplo
/*
This example shows how to interactively control
the speed of a clock
*/
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
namespace Microsoft.Samples.Animation.TimingBehaviors
{
public class ClockControllerSpeedRatioExample : Page
{
public ClockControllerSpeedRatioExample()
{
StackPanel mainPanel = new StackPanel();
//
// Create some controls the enable the user to
// interactively control the SpeedRatio of the clock.
//
StackPanel speedRatioDetailsPanel = new StackPanel();
speedRatioDetailsPanel.Margin = new Thickness(0,20,0,20);
speedRatioDetailsPanel.Orientation = Orientation.Horizontal;
Label speedRatioLabel = new Label();
speedRatioLabel.Content = "Speed Ratio:";
speedRatioDetailsPanel.Children.Add(speedRatioLabel);
mainPanel.Children.Add(speedRatioDetailsPanel);
this.Content = mainPanel;
}
currentGlobalSpeedTextBlock.Text =
myControllableClock.CurrentGlobalSpeed.ToString()
+ " Event triggered at: "
+ DateTime.Now.ToString();
}
'
' This example shows how to interactively control
' the speed of a clock
'
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Namespace Microsoft.Samples.Animation.TimingBehaviors
Public Class ClockControllerSpeedRatioExample
Inherits Page
'
' Create some controls the enable the user to
' interactively control the SpeedRatio of the clock.
'
Dim speedRatioDetailsPanel As New StackPanel With {
.Margin = New Thickness(0, 20, 0, 20),
.Orientation = Orientation.Horizontal
.Orientation = Orientation.Horizontal
}
Dim speedRatioLabel As New Label With {
.Content = "Speed Ratio:"
}
speedRatioDetailsPanel.Children.Add(speedRatioLabel)
mainPanel.Children.Add(speedRatioDetailsPanel)
Content = mainPanel
End Sub
End Sub
End Sub
End Sub
End Class
End Namespace
Procedimiento Controlar un guión gráfico después
de su inicio
23/10/2019 • 6 minutes to read • Edit Online
En este ejemplo se muestra cómo usar el código para Storyboard controlar una después de haberse iniciado. Para
controlar un guion gráfico XAMLen, Trigger use TriggerAction los objetos y; para obtener un ejemplo, vea usar
desencadenadores de eventos para controlar un guión gráfico después de su inicio.
Para iniciar un guion gráfico, use su Begin método, que distribuye las animaciones del guión gráfico a las
propiedades que animan e inicia el guión gráfico.
Para que se pueda controlar un guión gráfico, use Begin el método y especifique true como el segundo
parámetro. Después, puede usar los métodos interactivos del guión gráfico para pausar, reanudar, buscar, detener,
acelerar o ralentizar el guión gráfico, o bien avanzar hasta su período de relleno. A continuación se muestra una
lista de los métodos interactivos del guión gráfico:
Pause: Pausa el guion gráfico.
Resume: Reanuda un guion gráfico en pausa.
SetSpeedRatio: Establece la velocidad interactiva del guión gráfico.
Seek: Busca el guion gráfico en la ubicación especificada.
SeekAlignedToLastTick: Busca el guión gráfico en la ubicación especificada. A diferencia del Seek método,
esta operación se procesa antes del siguiente paso.
SkipToFill: Hace avanzar el guión gráfico hasta su período de relleno, si tiene uno.
Stop: Detiene el guion gráfico.
En el ejemplo siguiente, se usan varios métodos de guion gráfico para controlar interactivamente un guión gráfico.
NOTE
Para ver un ejemplo de cómo controlar un guión gráfico mediante desencadenadores con, consulte XAML usar
desencadenadores de eventos para controlar un guión gráfico después de su inicio.
Ejemplo
/*
This example shows how to control
a storyboard after it has started.
*/
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
namespace Microsoft.Samples.Animation.TimingBehaviors
{
public partial class ControlStoryboardExample : Page
{
public ControlStoryboardExample()
{
// Create a rectangle.
Rectangle myRectangle = new Rectangle();
myRectangle.Width = 100;
myRectangle.Height = 20;
myRectangle.Margin = new Thickness(12,0,0,5);
myRectangle.Fill = new SolidColorBrush(Color.FromArgb(170, 51, 51, 255));
myRectangle.HorizontalAlignment = HorizontalAlignment.Left;
myStackPanel.Children.Add(myRectangle);
//
// Create an animation and a storyboard to animate the
// rectangle.
//
DoubleAnimation myDoubleAnimation =
new DoubleAnimation(100, 500, new Duration(TimeSpan.FromSeconds(5)));
Storyboard.SetTargetName(myDoubleAnimation, "myRectangle");
Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(Rectangle.WidthProperty));
myStoryboard = new Storyboard();
myStoryboard.Children.Add(myDoubleAnimation);
//
// Create some buttons to control the storyboard
// and a panel to contain them.
//
StackPanel buttonPanel = new StackPanel();
buttonPanel.Orientation = Orientation.Horizontal;
Button beginButton = new Button();
beginButton.Content = "Begin";
beginButton.Click += new RoutedEventHandler(beginButton_Clicked);
buttonPanel.Children.Add(beginButton);
Button pauseButton = new Button();
pauseButton.Content = "Pause";
pauseButton.Click +=new RoutedEventHandler(pauseButton_Clicked);
buttonPanel.Children.Add(pauseButton);
Button resumeButton = new Button();
resumeButton.Content = "Resume";
resumeButton.Click +=new RoutedEventHandler(resumeButton_Clicked);
buttonPanel.Children.Add(resumeButton);
Button skipToFillButton = new Button();
skipToFillButton.Content = "Skip to Fill";
skipToFillButton.Click +=new RoutedEventHandler(skipToFillButton_Clicked);
buttonPanel.Children.Add(skipToFillButton);
Button setSpeedRatioButton = new Button();
setSpeedRatioButton.Content = "Triple Speed";
setSpeedRatioButton.Click +=new RoutedEventHandler(setSpeedRatioButton_Clicked);
buttonPanel.Children.Add(setSpeedRatioButton);
buttonPanel.Children.Add(setSpeedRatioButton);
Button stopButton = new Button();
stopButton.Content = "Stop";
stopButton.Click +=new RoutedEventHandler(stopButton_Clicked);
buttonPanel.Children.Add(stopButton);
myStackPanel.Children.Add(buttonPanel);
this.Content = myStackPanel;
}
'
' This example shows how to control
' a storyboard after it has started.
'
'
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Namespace Microsoft.Samples.Animation.TimingBehaviors
Partial Public Class ControlStoryboardExample
Inherits Page
Private ReadOnly myStoryboard As Storyboard
'
' Create an animation and a storyboard to animate the
' rectangle.
'
Dim myDoubleAnimation As New DoubleAnimation(100, 500, New Duration(TimeSpan.FromSeconds(5)))
Storyboard.SetTargetName(myDoubleAnimation, "myRectangle")
Storyboard.SetTargetProperty(myDoubleAnimation, New PropertyPath(Rectangle.WidthProperty))
myStoryboard = New Storyboard()
myStoryboard.Children.Add(myDoubleAnimation)
'
' Create some buttons to control the storyboard
' and a panel to contain them.
'
Dim buttonPanel As New StackPanel With {
.Orientation = Orientation.Horizontal
}
Dim beginButton As New Button With {
.Content = "Begin"
}
AddHandler beginButton.Click, AddressOf beginButton_Clicked
buttonPanel.Children.Add(beginButton)
Dim pauseButton As New Button With {
.Content = "Pause"
}
AddHandler pauseButton.Click, AddressOf pauseButton_Clicked
buttonPanel.Children.Add(pauseButton)
Dim resumeButton As New Button With {
.Content = "Resume"
}
AddHandler resumeButton.Click, AddressOf resumeButton_Clicked
buttonPanel.Children.Add(resumeButton)
Dim skipToFillButton As New Button With {
.Content = "Skip to Fill"
}
AddHandler skipToFillButton.Click, AddressOf skipToFillButton_Clicked
buttonPanel.Children.Add(skipToFillButton)
Dim setSpeedRatioButton As New Button With {
.Content = "Triple Speed"
.Content = "Triple Speed"
}
AddHandler setSpeedRatioButton.Click, AddressOf setSpeedRatioButton_Clicked
buttonPanel.Children.Add(setSpeedRatioButton)
Dim stopButton As New Button With {
.Content = "Stop"
}
AddHandler stopButton.Click, AddressOf stopButton_Clicked
buttonPanel.Children.Add(stopButton)
myStackPanel.Children.Add(buttonPanel)
Content = myStackPanel
End Sub
End Sub
End Sub
End Sub
End Sub
End Sub
End Sub
End Class
End Namespace
Vea también
Utilizar desencadenadores de eventos para controlar un guión gráfico después de su inicio
Cómo: Controlar una animación mediante From, To y
By
20/02/2020 • 4 minutes to read • Edit Online
Una "from/to/by" o "Basic Animation" crea una transición entre dos valores de destino (consulte información
general sobre animaciones para ver una introducción a los diferentes tipos de animaciones). Para establecer los
valores de destino de una animación básica, utilice sus propiedades From, Toy By. En la tabla siguiente se resume
cómo se pueden usar las propiedades From, Toy By juntas o por separado para determinar los valores de destino
de una animación.
NOTE
No establezca la propiedad To y la propiedad By en la misma animación.
Para usar otros métodos de interpolación o animar entre más de dos valores de destino, use una animación de
fotogramas clave. Consulte información General sobre animaciones de fotogramas clave para obtener más
información.
Para obtener información sobre cómo aplicar varias animaciones a una sola propiedad, vea información general
sobre animaciones de fotogramas clave.
En el ejemplo siguiente se muestran los distintos efectos de establecer las propiedades To, Byy From en las
animaciones.
Ejemplo
<!-- This example shows the different effects of setting
<!-- This example shows the different effects of setting
To, By, and From properties on animations. -->
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel Margin="20">
Consulte también
Información general sobre animaciones
Información general sobre animaciones de fotogramas clave
Ejemplo de valores de destino de animación From, To y By
Procedimiento Definir un ámbito de nombres
23/10/2019 • 3 minutes to read • Edit Online
Para animar con Storyboard en código, debe crear un NameScope y registre los nombres de los objetos de destino
con el elemento que posee ese ámbito de nombres. En el ejemplo siguiente, un NameScope se crea para
myMainPanel . Dos botones, button1 y button2 , se agregan a la pantalla y sus nombres registrados. Varias
animaciones y un Storyboard se crean. Del guión gráfico Begin método se usa para iniciar las animaciones.
Dado que button1 , button2 , y myMainPanel todas comparten el mismo ámbito de nombres, se puede utilizar
cualquiera de ellos con el Storyboard Begin método para iniciar las animaciones.
Ejemplo
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace Microsoft.Samples.Animation.AnimatingWithStoryboards
{
public ScopeExample()
{
this.Background = Brushes.White;
myMainPanel = new StackPanel();
myMainPanel.Background = Brushes.Orange;
DoubleAnimation button2WidthAnimation =
new DoubleAnimation(300, 200, new Duration(TimeSpan.FromSeconds(5)));
Storyboard.SetTargetName(button2WidthAnimation, button2.Name);
Storyboard.SetTargetProperty(button2WidthAnimation, new PropertyPath(Button.WidthProperty));
DoubleAnimation heightAnimationWithoutTarget =
new DoubleAnimation(300, 200, new Duration(TimeSpan.FromSeconds(5)));
Storyboard.SetTargetProperty(heightAnimationWithoutTarget, new
PropertyPath(FrameworkElement.HeightProperty));
this.Content = myMainPanel;
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Namespace Microsoft.Samples.Animation.AnimatingWithStoryboards
Me.Background = Brushes.White
myMainPanel = New StackPanel()
' Create a name scope for the stackpanel.
NameScope.SetNameScope(myMainPanel, New NameScope())
myMainPanel.Background = Brushes.Orange
Me.Content = myMainPanel
End Sub
End Sub
End Sub
End Class
End Namespace
Vea también
Animar una propiedad utilizando un guión gráfico
Información general sobre animaciones
Procedimiento Recibir una notificación cuando
cambia el estado de un reloj
23/10/2019 • 3 minutes to read • Edit Online
Un reloj CurrentStateInvalidated evento tiene lugar cuando su CurrentState deja de ser válido, por ejemplo,
cuando se inicia o detiene el reloj. Puede registrarse para este evento con directamente mediante un Clock, o bien
puede registrar con un Timeline.
En el ejemplo siguiente, un Storyboard y dos DoubleAnimation objetos se utilizan para animar el ancho de dos
rectángulos. El CurrentStateInvalidated eventos se usan para realizar escuchas de los cambios de estado de reloj.
Ejemplo
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Microsoft.Samples.Animation.TimingBehaviors.StateExample"
Background="LightGray">
<StackPanel Margin="20">
<TextBlock
Name="ParentTimelineStateTextBlock"></TextBlock>
<TextBlock
Name="Animation1StateTextBlock"></TextBlock>
<Rectangle
Name="Rectangle01"
Width="100" Height="50" Fill="Orange" />
<TextBlock Name="Animation2StateTextBlock"></TextBlock>
<Rectangle
Name="Rectangle02"
Width="100" Height="50" Fill="Gray" />
</StackPanel>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace Microsoft.Samples.Animation.TimingBehaviors
{
Animation1StateTextBlock.Text +=
myClock.Parent.CurrentTime.ToString() + ":"
+ myClock.CurrentState.ToString() + " ";
}
Namespace Microsoft.Samples.Animation.TimingBehaviors
En la siguiente ilustración muestra los distintos Estados de las animaciones se especifica como la escala de tiempo
primaria (guión gráfico) progresa.
La siguiente tabla muestra las horas en que Animation1del CurrentStateInvalidated desencadena el evento:
Tiempo 1 10 19 21 30 39
(segundos)
Tiempo 1 9 11 19 21 29 31 39
(segundo
s)
En este ejemplo se muestra cómo usar el RepeatBehavior propiedad de un Timeline con el fin de controlar el
comportamiento de repetición de una animación.
Ejemplo
El RepeatBehavior propiedad de un Timeline controla el número de veces que una animación repite su duración
simple. Mediante el uso de RepeatBehavior, puede especificar que un Timeline se repite durante un determinado
número de veces (un número de iteraciones) o durante un período de tiempo especificado. En cualquier caso, la
animación pasa por tantas ejecuciones de principio a fin que necesita para rellenar el número solicitado o la
duración.
De forma predeterminada, las escalas de tiempo tienen un número de repeticiones de 1,0, lo que significa que se
reproducen una vez y no se repiten. Sin embargo, si establece la RepeatBehavior propiedad de un Timeline a
Forever, la escala de tiempo se repite indefinidamente.
El ejemplo siguiente muestra cómo usar el RepeatBehavior propiedad para controlar el comportamiento de
repetición de una animación. El ejemplo se anima la Width propiedad cinco rectángulos con cada rectángulo con
un tipo diferente del comportamiento de repetición.
<!-- RepeatBehaviorExample.xaml
This example shows how to use the RepeatBehavior property to make a timeline repeat. -->
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="RepeatBehavior Example">
<Border HorizontalAlignment="Stretch">
<StackPanel Margin="20">
<StackPanel.Triggers>
<EventTrigger SourceName="restartButton" RoutedEvent="Button.Click">
<BeginStoryboard Name="myBeginStoryboard">
<Storyboard>
<!-- Create an animation that repeats for four seconds. As a result, the
animation repeats twice. -->
<DoubleAnimation
Storyboard.TargetName="FourSecondsRepeatingRectangle"
Storyboard.TargetProperty="Width"
From="50" To="300" Duration="0:0:2" RepeatBehavior="0:0:4" />
<!-- Create an animation that repeats 0.5 times. The resulting animation
plays for one second, half of its Duration. It animates from 50 to 150. -->
<DoubleAnimation
Storyboard.TargetName="HalfRepeatingRectangle"
Storyboard.TargetProperty="Width"
From="50" To="300" Duration="0:0:2" RepeatBehavior="0.5x" />
<!-- Create an animation that repeats for one second. The resulting animation
plays for one second, half of its Duration. It animates from 50 to 150. -->
<DoubleAnimation
Storyboard.TargetName="OneSecondRepeatingRectangle"
Storyboard.TargetProperty="Width"
From="50" To="300" Duration="0:0:2" RepeatBehavior="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger SourceName="stopButton" RoutedEvent="Button.Click">
<StopStoryboard BeginStoryboardName="myBeginStoryboard" />
</EventTrigger>
</StackPanel.Triggers>
</StackPanel>
</StackPanel>
</Border>
</Page>
Para obtener un ejemplo completo, vea ejemplo de comportamiento de control de tiempo de animación.
Vea también
Acumular valores de animaciones durante la repetición de ciclos
Especificar si una escala de tiempo se invierte automáticamente
Temas de procedimientos de temporización y animación
Información general sobre animaciones
Ejemplo del comportamiento del control de tiempo de la animación
Procedimiento Buscar un guión gráfico
23/10/2019 • 2 minutes to read • Edit Online
El ejemplo siguiente muestra cómo usar el Seek método de un Storyboard para saltar a alguna posición en una
animación de guión gráfico.
Ejemplo
A continuación se muestra el marcado XAML para el ejemplo.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.SeekStoryboardExample">
<StackPanel Margin="20" >
<Rectangle Name="myRectangle"
Width="10" Height="20" Fill="#AA3333FF" HorizontalAlignment="Left" >
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard Name="myBeginStoryboard">
<Storyboard Name="myStoryboard" Duration="0:0:4">
<DoubleAnimation
Storyboard.TargetName="myRectangle"
Storyboard.TargetProperty="Width"
Duration="0:0:4" From="10" To="500"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
<!-- Use this slider to seek to different points of the Storyboard Duration
(in milliseconds). -->
<Slider Name="SeekSlider" ValueChanged="OnSliderValueChanged" Height="Auto"
Width="500" Minimum="0" Maximum="4000" HorizontalAlignment="Left" />
</StackPanel>
</Page>
Ejemplo
El siguiente es el código utilizado con el código XAML anterior.
using System;
using System.Media;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Animation;
namespace SDKSample
{
// Use the value of the slider to seek to a duration value of the Storyboard (in milliseconds).
myStoryboard.Seek(myRectangle, new TimeSpan(0, 0, 0, 0, sliderValue), TimeSeekOrigin.BeginTime);
}
}
}
Imports System.Media
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media.Animation
Namespace SDKSample
' Use the value of the slider to seek to a duration value of the Storyboard (in milliseconds).
myStoryboard.Seek(myRectangle, New TimeSpan(0, 0, 0, 0, sliderValue), TimeSeekOrigin.BeginTime)
End Sub
End Class
End Namespace
Vea también
Buscar guiones gráficos de forma sincrónica
Procedimiento Buscar guiones gráficos de forma
sincrónica
23/10/2019 • 2 minutes to read • Edit Online
El ejemplo siguiente muestra cómo usar el SeekAlignedToLastTick método de un Storyboard para buscar alguna
posición en una animación de guión gráfico de forma sincrónica.
Ejemplo
A continuación se muestra el marcado XAML para el ejemplo.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.SeekStoryboardSynchronouslyExample">
<StackPanel Margin="20" >
<Rectangle Name="myRectangle"
Width="10" Height="20" Fill="#AA3333FF" HorizontalAlignment="Left" >
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard Name="myBeginStoryboard">
<Storyboard Name="myStoryboard" Duration="0:0:4">
<DoubleAnimation
Storyboard.TargetName="myRectangle"
Storyboard.TargetProperty="Width"
Duration="0:0:4" From="10" To="500"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
<!-- Use this slider to seek to different points of the Storyboard Duration
(in milliseconds). -->
<Slider Name="SeekSlider" ValueChanged="OnSliderValueChanged" Height="Auto"
Width="500" Minimum="0" Maximum="4000" HorizontalAlignment="Left" />
<!-- TextBlock displays the current time position of the Storyboard in milliseconds. -->
<TextBlock Name="PositionTextBlock"/>
</StackPanel>
</Page>
Ejemplo
El siguiente es el código utilizado con el código XAML anterior.
using System;
using System.Media;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Animation;
namespace SDKSample
{
Imports System.Media
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media.Animation
Namespace SDKSample
End Namespace
Procedimiento Definir una duración para una
animación
23/10/2019 • 3 minutes to read • Edit Online
Un Timeline representa un segmento de tiempo y la longitud de ese segmento viene determinada por la escala de
tiempo Duration. Cuando un Timeline llega al final de su duración, detiene la reproducción. Si el Timeline tiene
objetos Timeline secundarios, detener la reproducción. En el caso de una animación, la Duration especifica cuánto
tiempo tarda la animación en la transición desde su valor inicial hasta su valor final.
Puede especificar un Duration con una hora específica y finita o los valores especiales Automatic o Forever.
Duración de una animación siempre debe ser un valor de tiempo, porque una animación siempre debe tener una
longitud definida, finita, de lo contrario, la animación no sabría cómo realizar la transición entre sus valores de
destino. Escalas de tiempo contenedoras (TimelineGroup objetos), como Storyboard y ParallelTimeline, tienen una
duración predeterminada de Automatic, lo que significa que finalizan automáticamente cuando detiene la
reproducción de su último miembro secundario.
En el siguiente color de ejemplo, el ancho, alto y el relleno de un Rectangle está animada. Las duraciones están
establecidas en escalas de tiempo de animación y el contenedor resultante en los efectos de animación como
controlar la velocidad de una animación percibida y reemplazar la duración de objetos Timeline secundarios con la
duración de un objeto contenedor.
Ejemplo
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel Margin="20">
<!-- Animates the rectangle fill to yellow and width to 300. -->
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<!-- This ParallelTimeline has overriden its default duration of "Automatic" with
a finite duration of half a second. This will force this Timeline to end after half a
second even though its child Timelines have a longer duration (2 and 4 seconds respectively).
This cuts off the animation prematurely and the rectangle's fill will not go all the way to
yellow nor will the rectangle width get all the way to 300. Again, the default duration of a
ParallelTimeline is "Automatic" so if you remove the finite duration, the ParallelTimeline
will wait for its child timelines to end before it ends. -->
<!-- Note: To specify a finite time in XAML, use the syntax of "days:hours:seconds". As
mentioned,
this ParallelTimeline has a duration of half a second. -->
<ParallelTimeline Duration="0:0:0.5">
<!-- For Animation Timelines like DoubleAnimation, the duration is one factor that
determines the rate at which an animation appears to progress. For example, the
DoubleAnimation
below that animates the rectangle height will complete in only one second while the animation
that animates the width willwill complete in 2 seconds which is relatively fast compared to
the DoubleAnimation
which animates the rectangle width over 4 seconds. -->
<DoubleAnimation
Storyboard.TargetName="myRectangle"
Storyboard.TargetProperty="Height"
To="300" Duration="0:0:1" />
<DoubleAnimation
Storyboard.TargetName="myRectangle"
Storyboard.TargetProperty="Width"
To="300" Duration="0:0:4" />
<ColorAnimation
Storyboard.TargetName="MyAnimatedBrush"
Storyboard.TargetProperty="Color"
To="Yellow" Duration="0:0:2" />
</ParallelTimeline>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</StackPanel>
</Page>
Vea también
Duration
Información general sobre animaciones
Procedimiento Establecer una propiedad después de
animarla con un guión gráfico
23/10/2019 • 4 minutes to read • Edit Online
En algunos casos, es posible que parece que no se puede cambiar el valor de una propiedad después de que se
ha animado.
Ejemplo
En el ejemplo siguiente, un Storyboard sirve para animar el color de un SolidColorBrush. El guión gráfico se
desencadena cuando se hace clic en el botón. El Completed se controla el evento para que el programa recibe
una notificación cuando el ColorAnimation se complete.
<Button
Content="Animate and Then Set Example 1">
<Button.Background>
<SolidColorBrush x:Name="Button1BackgroundBrush"
Color="Red" />
</Button.Background>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="Button1BackgroundBrush"
Storyboard.TargetProperty="Color"
From="Red" To="Yellow" Duration="0:0:5"
FillBehavior="HoldEnd"
Completed="setButton1BackgroundBrushColor" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
Ejemplo
Después de la ColorAnimation finalice, el programa intenta cambiar el color del pincel a azul.
<Button
Content="Animate and Then Set Example 2">
<Button.Background>
<SolidColorBrush x:Name="Button2BackgroundBrush"
Color="Red" />
</Button.Background>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="Button2BackgroundBrush"
Storyboard.TargetProperty="Color"
From="Red" To="Yellow" Duration="0:0:5"
FillBehavior="Stop"
Completed="setButton2BackgroundBrushColor" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<Button
Name="Button3"
Content="Animate and Then Set Example 3">
<Button.Background>
<SolidColorBrush x:Name="Button3BackgroundBrush"
Color="Red" />
</Button.Background>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard Name="MyBeginStoryboard">
<Storyboard x:Name="MyStoryboard">
<ColorAnimation
Storyboard.TargetName="Button3BackgroundBrush"
Storyboard.TargetProperty="Color"
From="Red" To="Yellow" Duration="0:0:5"
FillBehavior="HoldEnd"
Completed="setButton3BackgroundBrushColor" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
Esta técnica también funciona para las animaciones sin guiones gráficos.
Vea también
FillBehavior
Storyboard.Remove
RemoveStoryboard
Información general sobre animaciones
Información general sobre técnicas de animación de propiedades
Procedimiento Simplificar las animaciones mediante
escalas de tiempo secundarias
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo simplificar animaciones utilizando secundarios ParallelTimeline objetos. Un
Storyboard es un tipo de Timeline que proporciona información de destino para las escalas de tiempo contiene.
Use un Storyboard para proporcionar información, incluida la información de objeto y propiedad de destino de la
escala de tiempo.
Para iniciar una animación, utilice uno o varios ParallelTimeline objetos como elementos secundarios anidados de
un Storyboard. Estos ParallelTimeline objetos pueden contener otras animaciones y por lo tanto, pueden
encapsular mejor las secuencias de temporización de animaciones complejas. Por ejemplo, si está animando un
TextBlock y varias formas en el mismo Storyboard, puede separar las animaciones para los TextBlock y las formas y
ponerlas todas en otro ParallelTimeline. Dado que cada ParallelTimeline tiene su propio BeginTime y todos los
elementos secundarios de la ParallelTimeline empiezan en relación con esto BeginTime, se encapsula mejor la
temporización.
El ejemplo siguiente anima dos partes de texto ( TextBlock objetos) desde dentro del mismo Storyboard. Un
ParallelTimeline encapsula las animaciones de uno de los TextBlock objetos.
Nota de rendimiento: Aunque puede anidar Storyboard escalas de tiempo dentro de otras, ParallelTimelineson
más apropiadas para la anidación porque requieren menos sobrecarga. (El Storyboard clase hereda de la
ParallelTimeline clase.)
Ejemplo
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas >
<!-- TextBlock with text "ParallelTimelines are..." that gets animated. -->
<TextBlock Name="FirstTextBlock" Canvas.Top="30" Canvas.Left="300" FontSize="24" >
ParallelTimelines are...
<TextBlock.RenderTransform>
<TransformGroup>
<SkewTransform x:Name="FirstTextBlockSkew" CenterX="25" CenterY="25" AngleX="0" AngleY="0" />
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
<!-- Event Trigger that controls all animations on the page. -->
<Canvas.Triggers>
<EventTrigger RoutedEvent="Canvas.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- "ParallelTimelines are..." fades into view. -->
<DoubleAnimation Storyboard.TargetName="FirstTextBlock"
Storyboard.TargetProperty="Opacity" Duration="0:0:2" From="0" To="1" />
<!-- This ParallelTimeline contains all the animations for the TextBlock with the text
"Useful" in it. This ParallelTimeline begins 4 seconds after the Storyboard timeline begins and
all child
animations begin relative to this parent timeline. -->
<ParallelTimeline BeginTime="0:0:4">
Vea también
Información general sobre animaciones
Especificar HandoffBehavior entre animaciones de guión gráfico
Procedimiento Especificar HandoffBehavior entre
animaciones de guión gráfico
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo especificar el comportamiento de entrega entre animaciones de guión gráfico. El
HandoffBehavior propiedad de BeginStoryboard especifica cómo las animaciones nuevas interactúan con otras
existentes que ya se han aplicado a una propiedad.
Ejemplo
El ejemplo siguiente crea dos botones que aumentan cuando se mueve el cursor del mouse sobre ellos y
disminuyen de tamaño cuando el cursor se mueve inmediatamente. Si un botón del mouse y, a continuación,
quitar rápidamente el cursor, la segunda animación se aplicará antes de que finalice la primera de ellas. Es si se
superponen dos animaciones como esta, que puede ver la diferencia entre el HandoffBehavior valores de
Compose y SnapshotAndReplace. Un valor de Compose combina las animaciones superpuestas causando una
transición más suave entre animaciones, mientras que un valor de SnapshotAndReplace hace que la nueva
animación reemplace inmediatamente la animación que anteriormente se superponen.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<!-- This Style specifies mouseover and mouseout behaviors. The button gets larger when
the cursor moves over it and smaller when the cursor moves away. Note that the same Properties
(ScaleX and ScaleY) are being targeted by both animations. The BeginStoryboard for each animation
uses a HandoffBehavior of "Compose" which causes the old animation to interpolate more gradually into
the new one. -->
<Style x:Key="ButtonWithCompose" TargetType="{x:Type Button}">
<Setter Property="Button.RenderTransform">
<Setter.Value>
<ScaleTransform CenterX="50" CenterY="50" ScaleX="1" ScaleY="1" />
</Setter.Value>
</Setter>
<Style.Triggers>
<EventTrigger RoutedEvent="Mouse.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard >
<Storyboard>
<DoubleAnimation Duration="0:0:2" Storyboard.TargetProperty="RenderTransform.ScaleX" To="3"
/>
<DoubleAnimation Duration="0:0:2" Storyboard.TargetProperty="RenderTransform.ScaleY" To="3"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard HandoffBehavior="Compose">
<Storyboard>
<DoubleAnimation Duration="0:0:2" Storyboard.TargetProperty="RenderTransform.ScaleX" />
<DoubleAnimation Duration="0:0:2" Storyboard.TargetProperty="RenderTransform.ScaleY" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Style>
<!-- For this button style, BeginStoryboard uses the default HandoffBehavior of "SnapShotAndReplace" -->
<Style x:Key="ButtonWithSnapShotAndReplace" TargetType="{x:Type Button}">
<Setter Property="Button.RenderTransform">
<Setter.Value>
<ScaleTransform CenterX="50" CenterY="50" ScaleX="1" ScaleY="1" />
</Setter.Value>
</Setter>
<Style.Triggers>
<EventTrigger RoutedEvent="Mouse.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard >
<Storyboard>
<DoubleAnimation Duration="0:0:2" Storyboard.TargetProperty="RenderTransform.ScaleX" To="3"
/>
<DoubleAnimation Duration="0:0:2" Storyboard.TargetProperty="RenderTransform.ScaleY" To="3"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:2" Storyboard.TargetProperty="RenderTransform.ScaleX" />
<DoubleAnimation Duration="0:0:2" Storyboard.TargetProperty="RenderTransform.ScaleY" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Page.Resources>
<Canvas>
<Button Style="{StaticResource ButtonWithSnapShotAndReplace}" Canvas.Top="200" Canvas.Left="200"
Width="100" Height="100">
SnapShotAndReplace
</Button>
<Button Style="{StaticResource ButtonWithCompose}" Canvas.Top="200" Canvas.Left="400" Width="100"
Height="100">
Compose
</Button>
</Canvas>
</Page>
Vea también
BeginStoryboard
HandoffBehavior
Información general sobre animaciones
Temas de procedimientos de temporización y animación
Procedimiento Especificar el comportamiento de
relleno de una escala de tiempo que ha llegado al
final de su período de actividad
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo especificar el FillBehavior para la inactiva Timeline de una propiedad animada.
Ejemplo
El FillBehavior propiedad de un Timeline determina lo que ocurre en el valor de una propiedad animada cuando
no se está animada, es decir, cuando el Timeline está inactivo, pero su elemento primario Timeline está dentro de
su activo o el período de espera. ¿Por ejemplo, se seguirá una propiedad animada final de su valor después de la
animación finaliza, o lo hace volver al valor que tenía antes de inicia la animación?
En el ejemplo siguiente se usa un DoubleAnimation para animar la Width de dos rectángulos. Cada rectángulo usa
otra Timeline objeto.
Una Timeline tiene un FillBehavior que se establece en Stop, lo que hace que el ancho del rectángulo se va a volver
a su no animado valor cuando la Timeline finaliza. El otro Timeline tiene un FillBehavior de HoldEnd, lo que hace
que el ancho permanezca en su extremo valor cuando la Timeline finaliza.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<StackPanel Margin="20">
<Border Background="#99FFFFFF">
<TextBlock Margin="20">
This example shows how the FillBehavior property determines how an animation behaves
after it reaches the end of its duration.
</TextBlock>
</Border>
<TextBlock>FillBehavior="Deactivate"</TextBlock>
<Rectangle Name="deactiveAnimationRectangle" Width="20" Height="20" Fill="#AA3333FF"
HorizontalAlignment="Left" >
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<!-- The animated rectangle's width reverts back to its non-animated value
after the animation ends. -->
<DoubleAnimation
Storyboard.TargetName="deactiveAnimationRectangle"
Storyboard.TargetProperty="Width"
From="100" To="400" Duration="0:0:2" FillBehavior="Stop" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
<!-- The animated rectangle's width remains at its end value after the
animation ends. -->
<DoubleAnimation Storyboard.TargetName="holdEndAnimationRectangle"
Storyboard.TargetProperty="Width"
From="100" To="400" Duration="0:0:2" FillBehavior="HoldEnd" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</StackPanel>
</Page>
Vea también
DoubleAnimation
Width
Timeline
FillBehavior
Stop
HoldEnd
Información general sobre animaciones
Temas de procedimientos de temporización y animación
Procedimiento Especificar si una escala de tiempo se
invierte automáticamente
23/10/2019 • 2 minutes to read • Edit Online
Una escala de tiempo AutoReverse propiedad determina si reproduce en orden inverso después de completar una
iteración de avance. El ejemplo siguiente muestra varias animaciones con duración idéntico y los valores de
destino, pero con diferentes AutoReverse configuración. Para demostrar cómo el AutoReverse propiedad se
comporta con diferentes RepeatBehavior , algunas animaciones están configurados para repetir. La última
animación se muestra cómo el AutoReverse propiedad funciona en escalas de tiempo anidadas.
Ejemplo
<!-- AutoReverseExample.xaml
This example shows how to use the AutoReverse property to make a timeline
play backwards at the end of each iteration.
Several rectangles are animated by DoubleAnimations with
identical durations and target values, but with different
AutoReverse and RepeatBehavior settings.-->
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="AutoReverse Example">
<StackPanel Margin="20">
<Rectangle Name="autoReverseRectangle"
Width="100" Height="20" Fill="Blue" />
<Rectangle Name="autoReverseRectangleWithRepeats"
Width="100" Height="20" Fill="Blue" />
<Rectangle Name="complexAutoReverseExample"
Width="100" Height="20" Fill="Blue" />
<!-- Create an animation that automatically reverses at the end of each iteration.
This animation plays for a total of 4 seconds. -->
<DoubleAnimation Storyboard.TargetName="autoReverseRectangle"
Storyboard.TargetProperty="Width"
Duration="0:0:2" From="100" To="400" AutoReverse="True" />
<!-- Create an animation that automatically reverses at the end of each iteration.
Set the animation to repeat twice. As a result, then animation plays forward,
Set the animation to repeat twice. As a result, then animation plays forward,
the backward, then forward, and then backward again.
This animation plays for a total of 8 seconds. -->
<DoubleAnimation Storyboard.TargetName="autoReverseRectangleWithRepeats"
Storyboard.TargetProperty="Width"
Duration="0:0:2" From="100" To="400" AutoReverse="True" RepeatBehavior="2x" />
<!-- Set the parent timeline's AutoReverse property to True and set the animation's
RepeatBehavior to 2x. As a result, the animation plays forward twice and then
backwards twice.
This animation plays for a total of 8 seconds. -->
<ParallelTimeline AutoReverse="True">
<DoubleAnimation
Storyboard.TargetName="complexAutoReverseExample"
Storyboard.TargetProperty="Width"
Duration="0:0:2" From="100" To="400" RepeatBehavior="2x" />
</ParallelTimeline>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Page>
Procedimiento Activar una animación al cambiar el
valor de una propiedad
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un Trigger para iniciar un Storyboard cuando cambia un valor de
propiedad. Puede usar un Trigger dentro de un Style, ControlTemplate, o DataTemplate.
Ejemplo
En el ejemplo siguiente se usa un Trigger para animar la Opacity de un Button cuando su IsMouseOver propiedad
pasa a ser true .
<!-- PropertyTriggerExample.xaml
Shows how to use property triggers to start animations. -->
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="Animate Properties with Storyboards">
<Page.Resources>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity"
To="1" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity"
To="0.25" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
</Trigger>
</Style.Triggers>
</Style>
</Page.Resources>
<StackPanel Margin="20">
</StackPanel>
</Page>
Las animaciones aplicadas por la propiedad Trigger se comportan los objetos en un modo más complejo que
EventTrigger animaciones o animaciones a usar Storyboard métodos. Se "continúan" con animaciones definida
por otros Trigger objetos, pero se crean con EventTrigger y animaciones activadas por métodos.
Vea también
Trigger
Información general sobre técnicas de animación de propiedades
Información general sobre objetos Storyboard
Procedimiento Usar desencadenadores de eventos
para controlar un guión gráfico después de su inicio
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo controlar Storyboard una después de iniciarse. Para iniciar Storyboard
XAMLmediante, use BeginStoryboard, que distribuye las animaciones a los objetos y propiedades que se animan
y, a continuación, inicia el guión gráfico. Si asigna BeginStoryboard un nombre mediante la especificación de su
Name propiedad, lo convierte en un guión gráfico controlable. Después, puede controlar interactivamente el
guión gráfico una vez que se inicia.
Use las siguientes acciones de guion gráfico EventTrigger junto con objetos para controlar un guion gráfico.
PauseStoryboard: Pausa el guion gráfico.
ResumeStoryboard: Reanuda un guion gráfico en pausa.
SetStoryboardSpeedRatio: Cambia la velocidad del guion gráfico.
SkipStoryboardToFill: Hace avanzar un guión gráfico hasta el final de su período de relleno, si tiene uno.
StopStoryboard: Detiene el guion gráfico.
RemoveStoryboard: Quita el guión gráfico, liberando recursos.
Ejemplo
En el ejemplo siguiente se usan acciones de guion gráfico controlables para controlar interactivamente un guión
gráfico.
NOTE
Para ver un ejemplo de cómo controlar un guión gráfico mediante código, vea controlar un guión gráfico después de
comenzar a usar sus métodos interactivos.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="Controlling a Storyboard" >
<StackPanel Margin="20" >
<Button Name="BeginButton">Begin</Button>
<Button Name="PauseButton">Pause</Button>
<Button Name="ResumeButton">Resume</Button>
<Button Name="SeekButton">Seek</Button>
<Button Name="SkipToFillButton">Skip To Fill</Button>
<Button Name="SetSpeedRatioButton">Triple Speed</Button>
<Button Name="StopButton">Stop</Button>
<StackPanel.Triggers>
<!-- Begin the Storyboard -->
<EventTrigger RoutedEvent="Button.Click" SourceName="BeginButton">
<BeginStoryboard Name="MyBeginStoryboard">
<Storyboard >
<DoubleAnimation
Storyboard.TargetName="myRectangle"
Storyboard.TargetProperty="Width"
Duration="0:0:5" From="100" To="500" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<!-- Seek one second into the storyboard's active period. -->
<EventTrigger RoutedEvent="Button.Click" SourceName="SeekButton">
<SeekStoryboard
BeginStoryboardName="MyBeginStoryboard"
Offset="0:0:1" Origin="BeginTime" />
</EventTrigger>
Vea también
ResumeStoryboard
SetStoryboardSpeedRatio
SkipStoryboardToFill
PauseStoryboard
StopStoryboard
SeekStoryboard
Controlar un guión gráfico una vez iniciado usando métodos interactivos
Información general sobre animaciones
Información general sobre objetos Storyboard
Temas "Cómo..." de relojes
23/10/2019 • 2 minutes to read • Edit Online
Los temas siguientes describen cómo usar un Clock objeto para mantener la información de estado de tiempo
para un Timeline.
En esta sección
Animar una propiedad usando un objeto AnimationClock
Controlar interactivamente un reloj
Buscar un reloj de forma sincrónica
Referencia
Clock
Storyboard
System.Windows.Media.Animation
Timeline
Secciones relacionadas
Información general sobre animaciones
Información general sobre objetos Storyboard
Procedimiento Animar una propiedad mediante un
objeto AnimationClock
23/10/2019 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo usar Clock objetos que se va a animar una propiedad.
Hay tres maneras de animar una propiedad de dependencia:
Crear un AnimationTimeline y asociarlo a esa propiedad mediante el uso de un Storyboard.
Utilice el objeto BeginAnimation método para aplicar una sola AnimationTimeline a una propiedad de
destino.
Crear un AnimationClock desde un AnimationTimeline y aplicarla a una propiedad.
Storyboard los objetos y el BeginAnimation método le permiten animar propiedades sin crear ni distribuir los
relojes directamente (para obtener ejemplos, vea animar una propiedad utilizando un guión gráfico y animar una
propiedad sin Utilizar un guión gráfico); los relojes se crean y distribuyen automáticamente.
Ejemplo
El ejemplo siguiente muestra cómo crear un AnimationClock y aplicarlo a dos propiedades similares.
/*
This example shows how to create and apply
an AnimationClock.
*/
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
namespace Microsoft.Samples.Animation.TimingBehaviors
{
public class AnimationClockExample : Page
{
ScaleTransform myScaleTransform;
public AnimationClockExample()
{
myStackPanel.Children.Add(myButton);
this.Content = myStackPanel;
}
'
' This example shows how to create and apply
' an AnimationClock.
'
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Namespace Microsoft.Samples.Animation.TimingBehaviors
Public Class AnimationClockExample
Inherits Page
myStackPanel.Children.Add(myButton)
Content = myStackPanel
End Sub
' Create and apply and animation when the button is clicked.
Private Sub myButton_Clicked(sender As Object, e As RoutedEventArgs)
Para obtener un ejemplo que muestra cómo controlar interactivamente un Clock después de iniciarse, vea
controlar interactivamente un reloj.
Vea también
Animar una propiedad utilizando un guión gráfico
Animar una propiedad sin utilizar un guión gráfico
Información general sobre técnicas de animación de propiedades
Procedimiento Controlar interactivamente un reloj
23/10/2019 • 7 minutes to read • Edit Online
La Clock propiedad de ClockController un objeto permite iniciar, pausar, reanudar, buscar, avanzar el reloj hasta su
período de relleno y detener el reloj interactivamente. Solo se puede controlar interactivamente el reloj raíz de un
árbol de control de tiempo.
NOTE
Hay otras maneras de controlar interactivamente animaciones que no requieren que trabaje directamente con los relojes:
también puede usar guiones gráficos. Los guiones gráficos se admiten tanto en el marcado como en el código. Para obtener
un ejemplo, vea animar una propiedad mediante un guión gráfico o la información general sobre animaciones.
En el ejemplo siguiente, se usan varios botones para controlar interactivamente un reloj de animación.
Ejemplo
/*
This example shows how to interactively control
a root clock.
*/
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
namespace Microsoft.Samples.Animation.TimingBehaviors
{
public class ClockControllerExample : Page
{
public ClockControllerExample()
{
StackPanel mainPanel = new StackPanel();
// Create a DoubleAnimation to
// animate its width.
DoubleAnimation widthAnimation =
new DoubleAnimation(
100,
500,
new Duration(TimeSpan.FromSeconds(5)));
//
// Create some buttons to control the clock.
//
//
// Create some controls the enable the user to
// seek the clock.
//
this.Content = mainPanel;
}
try {
// Disable the seek button until the user enters another value.
seekButton.IsEnabled = false;
}
}
'
' This example shows how to interactively control
' a root clock.
'
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Namespace Microsoft.Samples.Animation.TimingBehaviors
Public Class ClockControllerExample
Inherits Page
'
'
' Create some buttons to control the clock.
'
'
' Create some controls the enable the user to
' seek the clock.
'
Content = mainPanel
End Sub
Try
' Disable the seek button until the user enters another value.
seekButton.IsEnabled = False
End Try
End Sub
End Sub
End Sub
End Class
End Namespace
Vea también
Animar una propiedad utilizando un guión gráfico
Información general sobre animaciones
Procedimiento Buscar un reloj de forma sincrónica
23/10/2019 • 7 minutes to read • Edit Online
Use el SeekAlignedToLastTick método para buscar un reloj de hasta un momento determinado de forma
sincrónica. En el ejemplo siguiente se muestra tanto el Seek y SeekAlignedToLastTick métodos de un
ClockController.
En este ejemplo se muestra cómo buscar un Clock; para obtener un ejemplo que muestra cómo buscar un guión
gráfico, vea buscar un guión gráfico de forma sincrónica .
Ejemplo
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
using System.Xml;
using System.Configuration;
namespace SDKSample
{
/// <summary>
/// Shows how to interactively control a clock.
/// </summary>
public SeekAlignedToLastTickExample()
{
// Create a rectangle.
myRectangle = new Rectangle();
myRectangle.Width = 100;
myRectangle.Height = 20;
myRectangle.Margin = new Thickness(12,0,0,5);
myRectangle.Fill = new SolidColorBrush(Color.FromArgb(170, 51, 51, 255));
myRectangle.HorizontalAlignment = HorizontalAlignment.Left;
myStackPanel.Children.Add(myRectangle);
//
// Create an animation and a storyboard to animate the
// rectangle.
//
DoubleAnimation myDoubleAnimation =
DoubleAnimation myDoubleAnimation =
new DoubleAnimation(100, 500, new Duration(TimeSpan.FromSeconds(60)));
myClock = myDoubleAnimation.CreateClock();
myRectangle.ApplyAnimationClock(Rectangle.WidthProperty, myClock);
myClock.Controller.Stop();
//
// Create some buttons to control the storyboard
// and a panel to contain them.
//
StackPanel buttonPanel = new StackPanel();
buttonPanel.Orientation = Orientation.Horizontal;
Button beginButton = new Button();
beginButton.Content = "Begin";
beginButton.Click += new RoutedEventHandler(beginButton_Clicked);
buttonPanel.Children.Add(beginButton);
Button pauseButton = new Button();
pauseButton.Content = "Pause";
pauseButton.Click +=new RoutedEventHandler(pauseButton_Clicked);
buttonPanel.Children.Add(pauseButton);
Button resumeButton = new Button();
resumeButton.Content = "Resume";
resumeButton.Click +=new RoutedEventHandler(resumeButton_Clicked);
buttonPanel.Children.Add(resumeButton);
Button skipToFillButton = new Button();
skipToFillButton.Content = "Skip to Fill";
skipToFillButton.Click +=new RoutedEventHandler(skipToFillButton_Clicked);
buttonPanel.Children.Add(skipToFillButton);
Button setSpeedRatioButton = new Button();
setSpeedRatioButton.Content = "Triple Speed";
setSpeedRatioButton.Click +=new RoutedEventHandler(setSpeedRatioButton_Clicked);
buttonPanel.Children.Add(setSpeedRatioButton);
Button stopButton = new Button();
stopButton.Content = "Stop";
stopButton.Click +=new RoutedEventHandler(stopButton_Clicked);
buttonPanel.Children.Add(stopButton);
Button removeButton = new Button();
removeButton.Content = "Remove";
removeButton.Click +=new RoutedEventHandler(removeButton_Clicked);
buttonPanel.Children.Add(removeButton);
myStackPanel.Children.Add(buttonPanel);
myStackPanel.Children.Add(seekPanel);
this.Content = myStackPanel;
myClock.Controller.Begin();
}
try {
currentTimeIndicator.Text = myClock.CurrentTime.ToString();
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Imports System.Data
Imports System.Xml
Imports System.Configuration
Namespace SDKSample
''' <summary>
''' Shows how to interactively control a clock.
''' </summary>
'
' Create an animation and a storyboard to animate the
' rectangle.
'
Dim myDoubleAnimation As New DoubleAnimation(100, 500, New Duration(TimeSpan.FromSeconds(60)))
myClock = myDoubleAnimation.CreateClock()
myRectangle.ApplyAnimationClock(Rectangle.WidthProperty, myClock)
myClock.Controller.Stop()
'
' Create some buttons to control the storyboard
' and a panel to contain them.
'
Dim buttonPanel As New StackPanel()
buttonPanel.Orientation = Orientation.Horizontal
Dim beginButton As New Button()
beginButton.Content = "Begin"
AddHandler beginButton.Click, AddressOf beginButton_Clicked
buttonPanel.Children.Add(beginButton)
Dim pauseButton As New Button()
pauseButton.Content = "Pause"
AddHandler pauseButton.Click, AddressOf pauseButton_Clicked
buttonPanel.Children.Add(pauseButton)
Dim resumeButton As New Button()
resumeButton.Content = "Resume"
AddHandler resumeButton.Click, AddressOf resumeButton_Clicked
buttonPanel.Children.Add(resumeButton)
Dim skipToFillButton As New Button()
skipToFillButton.Content = "Skip to Fill"
AddHandler skipToFillButton.Click, AddressOf skipToFillButton_Clicked
buttonPanel.Children.Add(skipToFillButton)
Dim setSpeedRatioButton As New Button()
setSpeedRatioButton.Content = "Triple Speed"
AddHandler setSpeedRatioButton.Click, AddressOf setSpeedRatioButton_Clicked
buttonPanel.Children.Add(setSpeedRatioButton)
Dim stopButton As New Button()
stopButton.Content = "Stop"
AddHandler stopButton.Click, AddressOf stopButton_Clicked
buttonPanel.Children.Add(stopButton)
Dim removeButton As New Button()
removeButton.Content = "Remove"
removeButton.Content = "Remove"
AddHandler removeButton.Click, AddressOf removeButton_Clicked
buttonPanel.Children.Add(removeButton)
myStackPanel.Children.Add(buttonPanel)
myStackPanel.Children.Add(seekPanel)
Me.Content = myStackPanel
myClock.Controller.Begin()
End Sub
End Sub
End Sub
End Sub
End Sub
End Sub
End Sub
Catch ex As FormatException
MessageBox.Show("Invalid TimeSpan value.")
seekDestination.Focus()
End Try
End Sub
Try
Catch ex As FormatException
MessageBox.Show("Invalid TimeSpan value.")
seekDestination.Focus()
End Try
End Sub
currentTimeIndicator.Text = myClock.CurrentTime.ToString()
End Sub
End Class
End Namespace
Temas "Cómo..." de animaciones de fotogramas
clave
23/10/2019 • 2 minutes to read • Edit Online
Los temas de esta sección muestran cómo usar animaciones de fotogramas clave para animar a más de dos
valores de propiedad y controlar la interpolación.
En esta sección
Animar un objeto mediante fotogramas clave
Animar un objeto Boolean mediante fotogramas clave
Animar un objeto Double mediante fotogramas clave
Animar un objeto Matrix mediante fotogramas clave
Animar un punto mediante fotogramas clave
Animar la geometría de un rectángulo mediante fotogramas clave
Animar un objeto String mediante fotogramas clave
Animar un color mediante fotogramas clave
Animar los cambios de tamaño mediante fotogramas clave
Animar el grosor de un borde mediante fotogramas clave
Controlar la temporización de animaciones de fotogramas clave
Referencia
DoubleAnimationUsingKeyFrames
Storyboard
KeyTime
Vea también
Gráficos y multimedia
Información general sobre animaciones
Información general sobre animaciones de fotogramas clave
Procedimiento Animar un objeto mediante
fotogramas clave
23/10/2019 • 3 minutes to read • Edit Online
En este ejemplo se muestra cómo animar un objeto, que en este ejemplo Background es la propiedad Page de un
control, mediante fotogramas clave.
Ejemplo
En el ejemplo siguiente se ObjectAnimationUsingKeyFrames usa la clase para animar los Background cambios de
color Page de la propiedad de un control. La animación de ejemplo cambia a un pincel de fondo diferente a
intervalos regulares. Esta animación usa la DiscreteObjectKeyFrame clase para crear tres fotogramas clave
diferentes. La animación utiliza fotogramas clave de la siguiente manera:
1. Al final del primer segundo, anima una instancia de la LinearGradientBrush clase. En esta sección del
ejemplo se aplica un degradado lineal al color de fondo para que el color pase de amarillo a rojo.
2. Al final del siguiente segundo, anima una instancia de la RadialGradientBrush clase. En esta sección del
ejemplo se aplica un degradado radial al color de fondo para que el color pase de blanco a azul a negro.
3. Al final del tercer segundo, anima una instancia de la DrawingBrush clase. En esta sección del ejemplo se
aplica un patrón de tablero de ajedrez al fondo.
4. La animación comienza de nuevo y se repite indefinidamente.
NOTE
DiscreteObjectKeyFramees el único tipo de fotograma clave que se puede utilizar con ObjectAnimationUsingKeyFrames la
clase. Fotogramas DiscreteObjectKeyFrame clave, como crear cambios súbitos en valores, es decir, los cambios de color de
este ejemplo se producen repentinamente.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<Page.Triggers>
<EventTrigger RoutedEvent="Page.Loaded">
<BeginStoryboard>
<Storyboard>
Para consultar el ejemplo completo, vea Ejemplo de animación mediante fotogramas clave.
Vea también
ObjectAnimationUsingKeyFrames
Background
Page
DiscreteObjectKeyFrame
LinearGradientBrush
RadialGradientBrush
DrawingBrush
Información general sobre animaciones de fotogramas clave
Temas de procedimientos de fotogramas clave
Procedimiento Animar un objeto Boolean mediante
fotogramas clave
23/10/2019 • 5 minutes to read • Edit Online
En este ejemplo se muestra cómo animar el valor de propiedad booleana de una Button control mediante
fotogramas clave.
Ejemplo
En el ejemplo siguiente se usa el BooleanAnimationUsingKeyFrames clase se va a animar el IsEnabled propiedad
de un Button control. Todos los fotogramas clave en este ejemplo utilizan una instancia de la
DiscreteBooleanKeyFrame clase. Los fotogramas clave discretos como DiscreteBooleanKeyFrame crean saltos
súbitos entre los valores, es decir, el movimiento de la animación es brusco.
namespace Microsoft.Samples.KeyFrameExamples
{
public class BooleanAnimationUsingKeyFramesExample : Page
{
public BooleanAnimationUsingKeyFramesExample()
{
Title = "BooleanAnimationUsingKeyFrames Example";
Background = Brushes.White;
Margin = new Thickness(20);
myStackPanel.Children.Add(myButton);
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Imports System.Windows.Media
Namespace Microsoft.Samples.KeyFrameExamples
Public Class BooleanAnimationUsingKeyFramesExample
Inherits Page
Public Sub New()
Title = "BooleanAnimationUsingKeyFrames Example"
Background = Brushes.White
Margin = New Thickness(20)
myStackPanel.Children.Add(myButton)
Content = myStackPanel
End Sub
End Class
End Namespace
<!-- Demonstrates a BooleanAnimationUsingKeyFrames. The animation is used to
animate the IsEnabled property of a button. -->
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowTitle="KeyFrameBoolean Animation Example">
<TextBlock>
Click the button to animate its IsEnabled property with a
BooleanAnimationUsingKeyFrames animation.
</TextBlock>
<!-- All the key frames below are DiscreteBooleanKeyFrames. Discrete key frames create
sudden "jumps" between values (no interpolation). Only discrete key frames can be used
for Boolean key frame animations. -->
<DiscreteBooleanKeyFrame Value="False" KeyTime="0:0:0" />
<DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:1" />
<DiscreteBooleanKeyFrame Value="False" KeyTime="0:0:2" />
<DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:3" />
<DiscreteBooleanKeyFrame Value="False" KeyTime="0:0:3.5" />
<DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:4" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Page>
Para consultar el ejemplo completo, vea Ejemplo de animación mediante fotogramas clave.
Vea también
BooleanAnimationUsingKeyFrames
IsEnabled
Button
Información general sobre animaciones de fotogramas clave
Temas de procedimientos de fotogramas clave
Procedimiento Animar un objeto Double mediante
fotogramas clave
23/10/2019 • 7 minutes to read • Edit Online
En este ejemplo se muestra cómo animar el valor de una propiedad que toma un Double mediante fotogramas
clave.
Ejemplo
En el ejemplo siguiente se mueve un rectángulo por una pantalla. El ejemplo se usa el
DoubleAnimationUsingKeyFrames clase se va a animar el X propiedad de un TranslateTransform aplicado a un
Rectangle. Esta animación, que se repite indefinidamente, utiliza tres fotogramas clave de la manera siguiente:
1. Durante los primeros tres segundos, utiliza una instancia de la LinearDoubleKeyFrame clase para mover el
rectángulo a lo largo de una ruta de acceso a un ritmo constante desde su posición inicial hasta la posición
500. Los fotogramas clave lineales como LinearDoubleKeyFrame crean una transición lineal suave entre
valores.
2. Al final del cuarto segundo, utiliza una instancia de la DiscreteDoubleKeyFrame clase para mover el
rectángulo a la posición siguiente. Los fotogramas clave discretos como DiscreteDoubleKeyFrame crean
saltos súbitos entre los valores. En este ejemplo, el rectángulo está en la posición inicial y aparece de pronto
en la posición 500.
3. En los dos últimos segundos, utiliza una instancia de la SplineDoubleKeyFrame clase para devolver el
rectángulo a su posición inicial. Los fotogramas clave spline como SplineDoubleKeyFrame crean una
transición variable entre los valores según el valor de la KeySpline propiedad. En este ejemplo, el rectángulo
comienza a moverse despacio y se acelera exponencialmente hacia el final del segmento temporal.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Media;
namespace Microsoft.Samples.KeyFrameExamples
{
/// <summary>
/// This example shows how to use the DoubleAnimationUsingKeyFrames class to
/// animate the position of an object.
/// Key frame animations enable you to create complex animations
/// by specifying multiple destination values
/// and controlling the animation's interpolation method.
/// </summary>
public class AltDoubleAnimationUsingKeyFramesExample : Page
{
public AltDoubleAnimationUsingKeyFramesExample()
{
Title = "DoubleAnimationUsingKeyFrames Example";
Background = Brushes.White;
Margin = new Thickness(20);
// Create a TranslateTransform to
// move the rectangle.
TranslateTransform animatedTranslateTransform =
new TranslateTransform();
aRectangle.RenderTransform = animatedTranslateTransform;
// Create a DoubleAnimationUsingKeyFrames to
// animate the TranslateTransform.
DoubleAnimationUsingKeyFrames translationAnimation
= new DoubleAnimationUsingKeyFrames();
translationAnimation.Duration = TimeSpan.FromSeconds(6);
Content = containerCanvas;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Imports System.Windows.Media
Namespace Microsoft.Samples.KeyFrameExamples
''' <summary>
''' This example shows how to use the DoubleAnimationUsingKeyFrames class to
''' animate the position of an object.
''' Key frame animations enable you to create complex animations
''' by specifying multiple destination values
''' and controlling the animation's interpolation method.
''' </summary>
Public Class AltDoubleAnimationUsingKeyFramesExample
Inherits Page
Public Sub New()
Title = "DoubleAnimationUsingKeyFrames Example"
Background = Brushes.White
Margin = New Thickness(20)
' Animate from 500 (the value of the previous key frame)
' to 400 at 4 seconds using discrete interpolation.
' Because the interpolation is discrete, the rectangle will appear
' to "jump" from 500 to 400.
translationAnimation.KeyFrames.Add(New DiscreteDoubleKeyFrame(400,
KeyTime.FromTimeSpan(TimeSpan.FromSeconds(4)))) ' KeyTime - Target value (KeyValue)
' Animate from 400 (the value of the previous key frame) to 0
' over two seconds, starting at 4 seconds (the key time of the
' last key frame) and ending at 6 seconds.
translationAnimation.KeyFrames.Add(New SplineDoubleKeyFrame(0,
KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6)), New KeySpline(0.6,0.0,0.9,0.0))) ' KeySpline - KeyTime -
Target value (KeyValue)
Content = containerCanvas
End Sub
End Class
End Namespace
<!-- This example shows how to use the DoubleAnimationUsingKeyFrames to
animate the position of an object.
Key frame animations enable you to create complex animations
by specifying multiple destination values
and controlling the animation's interpolation method.
-->
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DoubleAnimationUsingKeyFrames Example"
Background="White" Margin="20">
<Canvas Width="610" Height="300">
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
Para consultar el ejemplo completo, vea Ejemplo de animación mediante fotogramas clave.
Para mantener la coherencia con otros ejemplos de animación, las versiones de código de este ejemplo utiliza un
Storyboard objeto al que aplicar el DoubleAnimationUsingKeyFrames. Como alternativa, al aplicar una animación
única en código, es más fácil de usar el BeginAnimation método en lugar de usar un Storyboard. Para obtener un
ejemplo, vea Animar una propiedad sin utilizar un guión gráfico.
Vea también
DoubleAnimationUsingKeyFrames
Rectangle
LinearDoubleKeyFrame
DiscreteDoubleKeyFrame
SplineDoubleKeyFrame
Información general sobre animaciones de fotogramas clave
Temas de procedimientos de fotogramas clave
Procedimiento Animar un objeto Matrix mediante
fotogramas clave
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo animar la Matrix propiedad de una MatrixTransform mediante fotogramas clave.
Ejemplo
En el ejemplo siguiente se MatrixAnimationUsingKeyFrames usa la clase para Matrix animar la
MatrixTransformpropiedad de un. En el ejemplo se MatrixTransform usa el objeto para transformar la apariencia y
la Buttonposición de.
Esta animación usa la DiscreteMatrixKeyFrame clase para crear dos fotogramas clave y hace lo siguiente con ellos:
1. Anima la primera Matrix durante los primeros 0,2 segundos. En el ejemplo se M11 cambian M12 las
propiedades y Matrixde. Este cambio hace que el botón se estire y se convierta en sesgado. En el ejemplo
también se OffsetX cambian OffsetY las propiedades y para que el botón cambie de posición.
2. Anima el segundo Matrix a 1,0 segundos. El botón se mueve a otra posición mientras el botón deja de
sesgarse o ajustarse.
3. Repite la animación indefinidamente.
NOTE
Los fotogramas clave que DiscreteMatrixKeyFrame se derivan del objeto crean saltos súbitos entre los valores, es decir, el
movimiento de la animación es entrecortado.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MatrixAnimationUsingPath Example">
<StackPanel Margin="20">
<Canvas HorizontalAlignment="Left" Width="340" Height="240" >
</Button.Triggers>
</Button>
</Canvas>
</StackPanel>
</Page>
Para consultar el ejemplo completo, vea Ejemplo de animación mediante fotogramas clave.
Vea también
Matrix
MatrixTransform
Información general sobre animaciones de fotogramas clave
Temas de procedimientos de fotogramas clave
Procedimiento Animar un punto mediante
fotogramas clave
23/10/2019 • 6 minutes to read • Edit Online
En este ejemplo se muestra cómo usar el PointAnimationUsingKeyFrames clase para animar un Point.
Ejemplo
En el ejemplo siguiente se mueve una elipse a lo largo de un trazado triangular. El ejemplo se usa el
PointAnimationUsingKeyFrames clase se va a animar el Center propiedad de un EllipseGeometry. Esta animación
utiliza tres fotogramas clave de la siguiente manera:
1. Durante el primer medio segundo, utiliza una instancia de la LinearPointKeyFrame clase para mover la
elipse a lo largo de una ruta de acceso a un ritmo constante desde su posición inicial. Los fotogramas clave
lineales como LinearPointKeyFrame crean una interpolación lineal suave entre valores.
2. Durante el fin de la siguiente medio segundo, utiliza una instancia de la DiscretePointKeyFrame clase para
mover repentinamente la elipse a lo largo de la ruta de acceso a la siguiente posición. Los fotogramas clave
discretos como DiscretePointKeyFrame crean saltos súbitos entre los valores.
3. Durante los dos últimos segundos, utiliza una instancia de la SplinePointKeyFrame clase para devolver la
elipse a su posición inicial. Los fotogramas clave spline como SplinePointKeyFrame crean una transición
variable entre los valores según los valores de la KeySpline propiedad. En este ejemplo, la animación
comienza despacio y se acelera exponencialmente hacia el final del segmento temporal.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Media;
namespace Microsoft.Samples.KeyFrameExamples
{
/// <summary>
/// This example shows how to use the PointAnimationUsingKeyFrames class
/// to animate the position of an object.
/// </summary>
public class PointAnimationUsingKeyFramesExample : Page
{
public PointAnimationUsingKeyFramesExample()
{
Title = "PointAnimationUsingKeyFrames Example";
Background = Brushes.White;
Margin = new Thickness(20);
// Create an EllipseGeometry.
EllipseGeometry myAnimatedEllipseGeometry =
new EllipseGeometry(new Point(200,100), 15, 15);
// Create a PointAnimationUsingKeyFrames to
// animate the EllipseGeometry.
PointAnimationUsingKeyFrames centerPointAnimation
= new PointAnimationUsingKeyFrames();
centerPointAnimation.Duration = TimeSpan.FromSeconds(5);
// Animate from (400,300) (the value of the previous key frame) to (200,100)
// over two seconds, starting at 1 second (the key time of the
// last key frame) and ending at 3 seconds.
centerPointAnimation.KeyFrames.Add(
new SplinePointKeyFrame(
new Point(200, 100), // Target value (KeyValue)
KeyTime.FromTimeSpan(TimeSpan.FromSeconds(3)), // KeyTime
new KeySpline(0.6, 0.0, 0.9, 0.0) // KeySpline
)
);
Content = containerCanvas;
Content = containerCanvas;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Imports System.Windows.Media
Namespace Microsoft.Samples.KeyFrameExamples
''' <summary>
''' This example shows how to use the PointAnimationUsingKeyFrames class
''' to animate the position of an object.
''' </summary>
Public Class PointAnimationUsingKeyFramesExample
Inherits Page
Public Sub New()
Title = "PointAnimationUsingKeyFrames Example"
Background = Brushes.White
Margin = New Thickness(20)
' Animate from (100,300) (the value of the previous key frame)
' to (400,300) at 1 second using discrete interpolation.
' Because the interpolation is discrete, the ellipse will appear
' to "jump" to (400,300) at 1 second.
centerPointAnimation.KeyFrames.Add(New DiscretePointKeyFrame(New Point(400, 300),
KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1)))) ' KeyTime - Target value (KeyValue)
' Animate from (400,300) (the value of the previous key frame) to (200,100)
' over two seconds, starting at 1 second (the key time of the
' last key frame) and ending at 3 seconds.
centerPointAnimation.KeyFrames.Add(New SplinePointKeyFrame(New Point(200, 100),
centerPointAnimation.KeyFrames.Add(New SplinePointKeyFrame(New Point(200, 100),
KeyTime.FromTimeSpan(TimeSpan.FromSeconds(3)), New KeySpline(0.6, 0.0, 0.9, 0.0))) ' KeySpline - KeyTime -
Target value (KeyValue)
Content = containerCanvas
End Sub
End Class
End Namespace
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="White" Margin="20">
<Canvas Width="400" Height="400">
<Path Fill="Blue">
<Path.Data>
<!-- Over the first half second, Using a LinearPointKeyFrame, the ellipse
moves steadily from its starting position along the first line of the
trianglar path. -->
<LinearPointKeyFrame
KeyTime="0:0:0.5"
Value="100,300" />
Para consultar el ejemplo completo, vea Ejemplo de animación mediante fotogramas clave.
Para mantener la coherencia con otros ejemplos de animación, las versiones de código de este ejemplo utiliza un
Storyboard objeto al que aplicar el PointAnimationUsingKeyFrames. Sin embargo, al aplicar una animación única
en código, resulta más fácil de usar el BeginAnimation método en lugar de usar un Storyboard. Para obtener un
ejemplo, vea Animar una propiedad sin utilizar un guión gráfico.
Vea también
PointAnimationUsingKeyFrames
EllipseGeometry.Center
EllipseGeometry
Información general sobre animaciones de fotogramas clave
Temas de procedimientos de fotogramas clave
Procedimiento Animar la geometría de un rectángulo
mediante fotogramas clave
23/10/2019 • 6 minutes to read • Edit Online
En este ejemplo se muestra cómo animar la Rect propiedad de un RectangleGeometry mediante fotogramas clave.
Ejemplo
En el ejemplo siguiente se usa el RectAnimationUsingKeyFrames clase se va a animar el Rect propiedad de un
RectangleGeometry. Esta animación utiliza tres fotogramas clave de la siguiente manera:
1. Durante los primeros dos segundos, utiliza una instancia de la LinearRectKeyFrame clase para animar un
cambio gradual en la posición, ancho y alto de un rectángulo. Los fotogramas clave lineales como
LinearRectKeyFrame crean una transición lineal suave entre valores.
2. Durante el fin de la siguiente medio segundo, utiliza una instancia de la DiscreteRectKeyFrame clase para
reducir de repente el alto del rectángulo. Los fotogramas clave discretos como DiscreteRectKeyFrame crean
cambios súbitos entre los valores, es decir, la reducción del alto se produce de forma rápida y brusca.
3. Durante los dos últimos segundos, utiliza una instancia de la SplineRectKeyFrame clase para cambiar el
rectángulo a su tamaño y posición originales. Los fotogramas clave spline como SplineRectKeyFrame crean
una transición variable entre los valores según los valores de la KeySpline propiedad. En este ejemplo, el
cambio comienza despacio y se acelera exponencialmente hacia el final del segmento temporal.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Media;
namespace Microsoft.Samples.KeyFrameExamples
{
/// <summary>
/// This example shows how to use the RectAnimationUsingKeyFrames class to
/// animate the position and size of a rectangle.
/// Key frame animations enable you to create complex animations
/// by specifying multiple destination values
/// and controlling the animation's interpolation method.
/// </summary>
public class RectAnimationUsingKeyFramesExample : Page
{
public RectAnimationUsingKeyFramesExample()
{
Title = "RectAnimationUsingKeyFrames Example";
Background = Brushes.White;
Margin = new Thickness(20);
myStackPanel.Children.Add(myPath);
// Create a RectAnimationUsingKeyFrames to
// animate the RectangleGeometry.
RectAnimationUsingKeyFrames rectAnimation
= new RectAnimationUsingKeyFrames();
rectAnimation.Duration = TimeSpan.FromSeconds(6);
// In the final 2 seconds of the animation, go back to the starting position, width, and height.
// Spline key frames like SplineRectKeyFrame creates a variable transition between values
depending
// on the KeySpline property. In this example, the animation starts off slow but toward the end of
// the time segment, it speeds up exponentially.
rectAnimation.KeyFrames.Add(
new SplineRectKeyFrame(
new Rect(0, 200, 100, 100), // Target value (KeyValue)
KeyTime.FromTimeSpan(TimeSpan.FromSeconds(4.5)), // KeyTime
new KeySpline(0.6, 0.0, 0.9, 0.0) // KeySpline
)
);
Content = myStackPanel;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Imports System.Windows.Media
Namespace Microsoft.Samples.KeyFrameExamples
''' <summary>
''' This example shows how to use the RectAnimationUsingKeyFrames class to
''' animate the position and size of a rectangle.
''' Key frame animations enable you to create complex animations
''' by specifying multiple destination values
''' and controlling the animation's interpolation method.
''' </summary>
Public Class RectAnimationUsingKeyFramesExample
Inherits Page
Public Sub New()
Title = "RectAnimationUsingKeyFrames Example"
Background = Brushes.White
Margin = New Thickness(20)
myStackPanel.Children.Add(myPath)
' Animate position, width, and height in first 2 seconds. LinearRectKeyFrame creates
' a smooth, linear animation between values.
rectAnimation.KeyFrames.Add(New LinearRectKeyFrame(New Rect(600,50,200,50),
KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2)))) ' KeyTime - Target value (KeyValue)
' In the next half second, change height to 10. DiscreteRectKeyFrame creates a
' sudden "jump" between values.
rectAnimation.KeyFrames.Add(New DiscreteRectKeyFrame(New Rect(600, 50, 200, 10),
KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2.5)))) ' KeyTime - Target value (KeyValue)
' In the final 2 seconds of the animation, go back to the starting position, width, and height.
' Spline key frames like SplineRectKeyFrame creates a variable transition between values depending
' on the KeySpline property. In this example, the animation starts off slow but toward the end of
' the time segment, it speeds up exponentially.
rectAnimation.KeyFrames.Add(New SplineRectKeyFrame(New Rect(0, 200, 100, 100),
KeyTime.FromTimeSpan(TimeSpan.FromSeconds(4.5)), New KeySpline(0.6, 0.0, 0.9, 0.0))) ' KeySpline - KeyTime -
Target value (KeyValue)
Content = myStackPanel
End Sub
End Class
End Namespace
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ThicknessAnimationUsingKeyFrames Example">
<!-- Animate the Rect property of the RectangleGeometry which causes the
rectangle to animate its position as well as its width and height. -->
<RectAnimationUsingKeyFrames
Storyboard.TargetName="myRectangleGeometry"
Storyboard.TargetProperty ="Rect"
Duration="0:0:6" FillBehavior="HoldEnd" RepeatBehavior="Forever">
<!-- Animate position, width, and height in first 2 seconds. LinearRectKeyFrame creates
a smooth, linear animation between values. -->
<LinearRectKeyFrame Value="600,50,200,50" KeyTime="0:0:2" />
<!-- In the next half second, change height to 10. DiscreteRectKeyFrame creates a
sudden "jump" between values. -->
<DiscreteRectKeyFrame Value="600,50,200,10" KeyTime="0:0:2.5" />
<!-- In the final 2 seconds of the animation, go back to the starting position, width, and
height.
Spline key frames like SplineRectKeyFrame creates a variable transition between values
depending
on the KeySpline property. In this example, the animation starts off slow but toward the end
of
the time segment, it speeds up exponentially.-->
<SplineRectKeyFrame Value="0,200,100,100" KeyTime="0:0:4.5" KeySpline="0.6,0.0 0.9,0.00" />
</RectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Path.Triggers>
</Path>
</StackPanel>
</Page>
Para consultar el ejemplo completo, vea Ejemplo de animación mediante fotogramas clave.
Vea también
RectangleGeometry
Rect
RectAnimationUsingKeyFrames
Información general sobre animaciones de fotogramas clave
Temas de procedimientos de fotogramas clave
Procedimiento Animar un objeto String mediante
fotogramas clave
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo animar una cadena, que en este ejemplo es el Content propiedad de un Button
control mediante fotogramas clave.
Ejemplo
En el ejemplo siguiente se usa el StringAnimationUsingKeyFrames clase se va a animar el Content propiedad de
un Button.
Todos los fotogramas clave en este ejemplo utilizan una instancia de la DiscreteStringKeyFrame clase porque una
animación de cadena que se crea con fotogramas clave solo puede usar fotogramas clave discretos. Los
fotogramas clave discretos como DiscreteStringKeyFrame crean saltos súbitos entre los valores, es decir, los
cambios realizados en la animación se producen rápidamente y no son sutiles.
<!-- Demonstrates the StringAnimationUsingKeyFrames class. A StringAnimationUsingKeyFrames is used to
animate the TextContent property of a Text element. -->
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Microsoft.Samples.KeyFrameExamples.StringAnimationUsingKeyFramesExample"
Name="myRootElement"
WindowTitle="StringAnimationUsingKeyFrames Example">
<StackPanel HorizontalAlignment="Center">
<Button Name="myAnimatedButton" Margin="200"
FontSize="16pt" FontFamily="Verdana">Some Text
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<StringAnimationUsingKeyFrames
Storyboard.TargetName="myAnimatedButton" Storyboard.TargetProperty="(Button.Content)"
Duration="0:0:8" FillBehavior="HoldEnd">
<!-- All the key frames below are DiscreteStringKeyFrames. Discrete key frames create
sudden "jumps" between values (no interpolation). Only discrete key frames can be used
for String key frame animations. -->
<DiscreteStringKeyFrame Value="" KeyTime="0:0:0" />
<DiscreteStringKeyFrame Value="A" KeyTime="0:0:1" />
<DiscreteStringKeyFrame Value="An" KeyTime="0:0:1.5" />
<DiscreteStringKeyFrame Value="Ani" KeyTime="0:0:2" />
<DiscreteStringKeyFrame Value="Anim" KeyTime="0:0:2.5" />
<DiscreteStringKeyFrame Value="Anima" KeyTime="0:0:3" />
<DiscreteStringKeyFrame Value="Animat" KeyTime="0:0:3.5" />
<DiscreteStringKeyFrame Value="Animate" KeyTime="0:0:4" />
<DiscreteStringKeyFrame Value="Animated" KeyTime="0:0:4.5" />
<DiscreteStringKeyFrame Value="Animated " KeyTime="0:0:5" />
<DiscreteStringKeyFrame Value="Animated T" KeyTime="0:0:5.5" />
<DiscreteStringKeyFrame Value="Animated Te" KeyTime="0:0:6" />
<DiscreteStringKeyFrame Value="Animated Tex" KeyTime="0:0:6.5" />
<DiscreteStringKeyFrame Value="Animated Text" KeyTime="0:0:7" />
</StringAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Page>
Para consultar el ejemplo completo, vea Ejemplo de animación mediante fotogramas clave.
Vea también
StringAnimationUsingKeyFrames
Content
Button
DiscreteStringKeyFrame
Información general sobre animaciones de fotogramas clave
Temas de procedimientos de fotogramas clave
Procedimiento Animar un color mediante fotogramas
clave
23/10/2019 • 7 minutes to read • Edit Online
En este ejemplo se muestra cómo animar la Color de un SolidColorBrush mediante fotogramas clave.
Ejemplo
En el ejemplo siguiente se usa el ColorAnimationUsingKeyFrames clase se va a animar el Color propiedad de un
SolidColorBrush. Esta animación utiliza tres fotogramas clave de la siguiente manera:
1. Durante los primeros dos segundos, utiliza una instancia de la LinearColorKeyFrame clase para cambiar
gradualmente el color de verde a rojo. Los fotogramas clave lineales como LinearColorKeyFrame crean una
transición lineal suave entre valores.
2. Durante el fin de la siguiente medio segundo, utiliza una instancia de la DiscreteColorKeyFrame clase para
cambiar rápidamente el color de rojo a amarillo. Los fotogramas clave discretos como
DiscreteColorKeyFrame crean cambios súbitos entre los valores, es decir, el cambio de color en esta parte
de la animación se produce de forma rápida y brusca.
3. Durante los dos últimos segundos, utiliza una instancia de la SplineColorKeyFrame clase vuelvan a cambiar
el color, esta vez de amarillo a verde. Los fotogramas clave spline como SplineColorKeyFrame crean una
transición variable entre los valores según los valores de la KeySpline propiedad. En este ejemplo, el cambio
de color comienza despacio y se acelera exponencialmente hacia el final del segmento temporal.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Media;
namespace Microsoft.Samples.KeyFrameExamples
{
public class ColorAnimationUsingKeyFramesExample : Page
{
public ColorAnimationUsingKeyFramesExample()
{
Title = "BooleanAnimationUsingKeyFrames Example";
Background = Brushes.White;
Margin = new Thickness(20);
// Create a ColorAnimationUsingKeyFrames to
// animate the BorderBrush property of the Button.
ColorAnimationUsingKeyFrames colorAnimation
= new ColorAnimationUsingKeyFrames();
colorAnimation.Duration = TimeSpan.FromSeconds(6);
// In the final 2 seconds of the animation, go from yellow back to green. SplineColorKeyFrame
// creates a variable transition between values depending on the KeySpline property. In this
example,
// the animation starts off slow but toward the end of the time segment, it speeds up
exponentially.
colorAnimation.KeyFrames.Add(
new SplineColorKeyFrame(
greenColor, // Target value (KeyValue)
KeyTime.FromTimeSpan(TimeSpan.FromSeconds(4.5)), // KeyTime
new KeySpline(0.6, 0.0, 0.9, 0.0) // KeySpline
)
);
Content = myStackPanel;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Imports System.Windows.Media
Namespace Microsoft.Samples.KeyFrameExamples
Public Class ColorAnimationUsingKeyFramesExample
Inherits Page
Public Sub New()
Title = "BooleanAnimationUsingKeyFrames Example"
Background = Brushes.White
Margin = New Thickness(20)
' In the final 2 seconds of the animation, go from yellow back to green. SplineColorKeyFrame
' creates a variable transition between values depending on the KeySpline property. In this
example,
' the animation starts off slow but toward the end of the time segment, it speeds up
exponentially.
colorAnimation.KeyFrames.Add(New SplineColorKeyFrame(greenColor,
KeyTime.FromTimeSpan(TimeSpan.FromSeconds(4.5)), New KeySpline(0.6, 0.0, 0.9, 0.0))) ' KeySpline - KeyTime -
Target value (KeyValue)
Content = myStackPanel
End Sub
End Class
End Namespace
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ThicknessAnimationUsingKeyFrames Example">
<!-- Animate from green to red using a linear key frame, from red to
yellow using a discrete key frame, and from yellow back to green with
a spline key frame. This animation repeats forever. -->
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="Color"
Storyboard.TargetName="MyAnimatedBrush"
Duration="0:0:6" FillBehavior="HoldEnd" RepeatBehavior="Forever">
<ColorAnimationUsingKeyFrames.KeyFrames>
<!-- In the final 2 seconds of the animation, go from yellow back to green.
SplineColorKeyFrame
creates a variable transition between values depending on the KeySpline property. In this
example,
the animation starts off slow but toward the end of the time segment, it speeds up
exponentially.-->
<SplineColorKeyFrame Value="Green" KeyTime="0:0:4.5" KeySpline="0.6,0.0 0.9,0.00" />
</ColorAnimationUsingKeyFrames.KeyFrames>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Border.Triggers>
<TextBlock>
This example shows how to use the ColorAnimationUsingKeyFrames to create
an animation on the BorderBrush property of a Border.
</TextBlock>
</Border>
</StackPanel>
</Page>
Para consultar el ejemplo completo, vea Ejemplo de animación mediante fotogramas clave.
Vea también
Color
SolidColorBrush
ColorAnimationUsingKeyFrames
Información general sobre animaciones de fotogramas clave
Temas de procedimientos de fotogramas clave
Procedimiento Animar los cambios de tamaño
mediante fotogramas clave
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo animar los cambios del tamaño mediante fotogramas clave.
Ejemplo
En el ejemplo siguiente se usa el SizeAnimationUsingKeyFrames clase se va a animar el Size propiedad de un
ArcSegment. Esta animación utiliza tres fotogramas clave de la siguiente manera:
1. Durante el primer medio segundo de la animación, usa una instancia de la LinearSizeKeyFrame clase para
aumentar gradualmente el tamaño del arco. Los fotogramas clave lineales como LinearSizeKeyFrame crean
una transición lineal suave entre valores.
2. Al final de la siguiente medio segundo, utiliza una instancia de la DiscreteSizeKeyFrame clase, de repente,
aumentar el tamaño del arco. Los fotogramas clave discretos como DiscreteSizeKeyFrame crean saltos
súbitos entre los valores, es decir, los cambios de tamaño se producen de repente y no son sutiles.
3. A través de los dos últimos segundos, utiliza una instancia de la SplineSizeKeyFrame clase para aumentar el
tamaño del arco. Los fotogramas clave spline como SplineSizeKeyFrame crean una transición variable entre
los valores según los valores de la KeySpline propiedad. En este ejemplo, el tamaño del arco aumenta
lentamente al principio y va aumentando exponencialmente hacia el final del segmento temporal.
<!-- This example shows how to use the SizeAnimationUsingKeyFrames to animate the
size of an ArcSegment. -->
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<!-- Create an arc on the screen that animates its size when it loads. -->
<Path Stroke="Black" StrokeThickness="2" >
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure StartPoint="100,200">
<PathFigure.Segments>
<PathSegmentCollection>
<ArcSegment x:Name="myArcSegment" Size="90,80"
SweepDirection="Clockwise" Point="500,200" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
<Path.Triggers>
<EventTrigger RoutedEvent="Path.Loaded">
<BeginStoryboard Name="myBeginStoryBoard">
<Storyboard>
</SizeAnimationUsingKeyFrames.KeyFrames>
</SizeAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Path.Triggers>
</Path>
</Canvas>
</Page>
Para consultar el ejemplo completo, vea Ejemplo de animación mediante fotogramas clave.
Vea también
SizeAnimationUsingKeyFrames
Size
ArcSegment
LinearSizeKeyFrame
DiscreteSizeKeyFrame
SplineSizeKeyFrame
Información general sobre animaciones de fotogramas clave
Temas de procedimientos de fotogramas clave
Procedimiento Animar el grosor de un borde
mediante fotogramas clave
23/10/2019 • 2 minutes to read • Edit Online
Ejemplo
En el ejemplo siguiente se usa el ThicknessAnimationUsingKeyFrames clase se va a animar el BorderThickness
propiedad de un Border. Esta animación utiliza tres fotogramas clave de la siguiente manera:
1. Durante el primer medio segundo, utiliza una instancia de la LinearThicknessKeyFrame clase para aumentar
gradualmente el grosor del borde. El ejemplo se utiliza LinearThicknessKeyFrame para crear un aumento
lineal suavizado entre los valores.
2. Al final de la siguiente medio segundo, utiliza una instancia de la DiscreteThicknessKeyFrame clase para
aumentar de repente el grosor del borde. Los fotogramas clave discretos como los derivan de
DiscreteThicknessKeyFrame crean saltos súbitos entre los valores, es decir, el movimiento de la animación
es brusco.
3. Durante los dos últimos segundos, utiliza una instancia de la SplineThicknessKeyFrame clase para reducir el
grosor del borde. Los fotogramas clave spline como los derivan de SplineThicknessKeyFrame crean una
transición variable entre los valores según los valores de la KeySpline propiedad. En este fotograma clave, la
animación se inicia lentamente y se va acelerando de forma exponencial hacia el final del segmento
temporal.
<!-- This example shows how to use the ThicknessAnimationUsingKeyFrames to create
an animation on the BorderThickness property of a Border. -->
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Microsoft.Samples.KeyFrameExamples.ThicknessAnimationUsingKeyFramesExample"
Name="myRootElement"
WindowTitle="ThicknessAnimationUsingKeyFrames Example">
</ThicknessAnimationUsingKeyFrames.KeyFrames>
</ThicknessAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Border.Triggers>
<TextBlock>
This example shows how to use the ThicknessAnimationUsingKeyFrames to create
an animation on the BorderThickness property of a Border.
</TextBlock>
</Border>
</StackPanel>
</Page>
Para consultar el ejemplo completo, vea Ejemplo de animación mediante fotogramas clave.
Vea también
LinearThicknessKeyFrame
DiscreteThicknessKeyFrame
SplineThicknessKeyFrame
Información general sobre animaciones de fotogramas clave
Temas de procedimientos de fotogramas clave
Animar el valor del grosor de un borde
Procedimiento Controlar la temporización de
animaciones de fotogramas clave
23/10/2019 • 12 minutes to read • Edit Online
En este ejemplo se muestra cómo controlar la temporización de fotogramas clave dentro de una animación de
fotogramas clave. Al igual que otras animaciones, animaciones de fotogramas clave tienen una Duration
propiedad. Además de especificar la duración de una animación, deberá especificar qué parte de esa duración se
asigna a cada uno de los fotogramas clave. Para asignar el tiempo, especifica un KeyTime para cada fotograma
clave en la animación.
El KeyTime para cada fotograma clave especifica cuando finaliza (no especificar el período de tiempo se reproduce
un fotograma clave). Puede especificar un KeyTime como un TimeSpan valor, como un porcentaje o como el
Uniform o Paced valor especial.
Ejemplo
En el ejemplo siguiente se usa un DoubleAnimationUsingKeyFrames para animar un rectángulo en la pantalla. Los
tiempos clave de los fotogramas clave se establecen con TimeSpan valores.
/*
This Rectangle is animated with KeyTimes using TimeSpan Values.
It moves horizontally to 100 in the first 3 seconds, 100 to 300 in
the next second, and 300 to 500 in the last 6 seconds.
*/
// Create a DoubleAnimationUsingKeyFrames
// to animate the transform.
DoubleAnimationUsingKeyFrames transformAnimation =
new DoubleAnimationUsingKeyFrames();
transformAnimation.Duration = TimeSpan.FromSeconds(10);
El ejemplo siguiente muestra una animación que es idéntica, salvo que los tiempos clave de los fotogramas clave
se establecen con valores de porcentaje.
/*
This rectangle moves horizontally to 100 in the first 3 seconds,
100 to 300 in the next second, and 300 to 500 in the last 6 seconds.
*/
// Create a DoubleAnimationUsingKeyFrames
// to animate the transform.
DoubleAnimationUsingKeyFrames transformAnimation =
new DoubleAnimationUsingKeyFrames();
transformAnimation.Duration = TimeSpan.FromSeconds(10);
/*
This rectangle is animated with KeyTimes using Uniform values.
Goes to 100 in the first 3.3 seconds, 100 to
300 in the next 3.3 seconds, 300 to 500 in the last 3.3 seconds.
*/
// Create a DoubleAnimationUsingKeyFrames
// to animate the transform.
DoubleAnimationUsingKeyFrames transformAnimation =
new DoubleAnimationUsingKeyFrames();
transformAnimation.Duration = TimeSpan.FromSeconds(10);
/*
KeyTime properties are expressed with values of Uniform. When a key time is set to
"Uniform" the total allotted time of the animation is divided evenly between key frames.
In this example, the total duration of the animation is ten seconds and there are four
key frames each of which are set to "Uniform", therefore, the duration of each key frame
is 3.3 seconds (10/3).
*/
// Animate to 100.
transformAnimation.KeyFrames.Add(
new LinearDoubleKeyFrame(100, KeyTime.Uniform));
// Animate to 300.
transformAnimation.KeyFrames.Add(
new LinearDoubleKeyFrame(300, KeyTime.Uniform));
// Animate to 500.
transformAnimation.KeyFrames.Add(
new LinearDoubleKeyFrame(500, KeyTime.Uniform));
'
' KeyTime properties are expressed with values of Uniform. When a key time is set to
' "Uniform" the total allotted time of the animation is divided evenly between key frames.
' In this example, the total duration of the animation is ten seconds and there are four
' key frames each of which are set to "Uniform", therefore, the duration of each key frame
' is 3.3 seconds (10/3).
'
<!-- KeyTime properties are expressed with values of Uniform. When a key time is set to
"Uniform" the total allotted time of the animation is divided evenly between key frames.
In this example, the total duration of the animation is ten seconds and there are four
key frames each of which are set to "Uniform", therefore, the duration of each key frame
is 3.3 seconds (10/3). -->
<LinearDoubleKeyFrame Value="100" KeyTime="Uniform" />
<LinearDoubleKeyFrame Value="300" KeyTime="Uniform" />
<LinearDoubleKeyFrame Value="500" KeyTime="Uniform" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
// Create a DoubleAnimationUsingKeyFrames
// to animate the transform.
DoubleAnimationUsingKeyFrames transformAnimation =
new DoubleAnimationUsingKeyFrames();
transformAnimation.Duration = TimeSpan.FromSeconds(10);
/*
Use Paced values when a constant rate is desired.
The time allocated to a key frame with a KeyTime of "Paced" is
determined by the time allocated to the other key frames of the animation. This time is
calculated to attempt to give a "paced" or "constant velocity" for the animation.
*/
// Animate to 100.
transformAnimation.KeyFrames.Add(
new LinearDoubleKeyFrame(100, KeyTime.Paced));
// Animate to 300.
transformAnimation.KeyFrames.Add(
new LinearDoubleKeyFrame(300, KeyTime.Paced));
// Animate to 500.
transformAnimation.KeyFrames.Add(
new LinearDoubleKeyFrame(500, KeyTime.Paced));
'
' Use Paced values when a constant rate is desired.
' The time allocated to a key frame with a KeyTime of "Paced" is
' determined by the time allocated to the other key frames of the animation. This time is
' calculated to attempt to give a "paced" or "constant velocity" for the animation.
'
Por motivos de simplicidad, las versiones de código de este ejemplo usan animaciones locales, no guiones gráficos,
porque se aplica solo a una animación única a una sola propiedad, pero se pueden modificar los ejemplos para
usar guiones gráficos en su lugar. Para obtener un ejemplo que muestra cómo declarar un guión gráfico en el
código, consulte animar una propiedad utilizando un guión gráfico.
Para consultar el ejemplo completo, vea Ejemplo de animación mediante fotogramas clave. Para obtener más
información acerca de las animaciones de fotogramas clave, consulte el información general sobre animaciones de
fotogramas clave.
Vea también
Información general sobre animaciones de fotogramas clave
Información general sobre animaciones
Temas "Cómo..."
Temas "Cómo..." de animación de trazado
23/10/2019 • 2 minutes to read • Edit Online
Los temas de esta sección muestran cómo animar un objeto a lo largo de una ruta de acceso.
En esta sección
Animación de un objeto a lo largo de un trazado (animación doble)
Animación de un objeto a lo largo de un trazado (animación en punto)
Animación de un objeto a lo largo de un trazado (animación de matriz)
Animar un objeto a lo largo de un trazado (animación en matriz con acumulación de desplazamiento)
Girar un objeto utilizando un trazado geométrico (animación en matriz)
Girar un objeto utilizando un trazado geométrico
Referencia
PathAnimationSource
Storyboard
Vea también
Gráficos y multimedia
Información general sobre animaciones
Información general sobre animaciones de fotogramas clave
Cómo: Animar un objeto a lo largo de una
trayectoria (animación doble)
20/02/2020 • 5 minutes to read • Edit Online
En este ejemplo se muestra cómo usar la clase DoubleAnimationUsingPath para trasladar un objeto a lo largo de
un trazado definido por un PathGeometry.
Ejemplo
En el ejemplo siguiente se usan dos objetos DoubleAnimationUsingPath para desplace un rectángulo a lo largo de
un trazado geométrico:
La primera DoubleAnimationUsingPath anima el X de la TranslateTransform aplicada al rectángulo. Hace
que el rectángulo se mueva horizontalmente a lo largo del trazado.
El segundo DoubleAnimationUsingPath anima el Y de la TranslateTransform aplicada al rectángulo. Hace
que el rectángulo se mueva verticalmente a lo largo del trazado.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions">
<Page.Resources>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Path.Loaded">
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever">
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace SDKSample
{
// Create a rectangle.
Rectangle aRectangle = new Rectangle();
aRectangle.Width = 30;
aRectangle.Height = 30;
aRectangle.Fill = Brushes.Blue;
aRectangle.RenderTransform = animatedTranslateTransform;
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Namespace SDKSample
aRectangle.RenderTransform = animatedTranslateTransform
End Sub
End Class
End Namespace
Consulte también
Información general sobre animaciones
Temas de procedimientos de animación de trazado
Cómo: Animar un objeto a lo largo de un trazado
(animación en punto)
20/02/2020 • 4 minutes to read • Edit Online
En este ejemplo se muestra cómo utilizar un objeto PointAnimationUsingPath para animar un Point a lo largo de
un trazado curvo.
Ejemplo
En el ejemplo siguiente se mueve una EllipseGeometry a lo largo de un trazado definido por un PathGeometry. La
propiedad Center de la geometría de elipse, que toma un valor Point, especifica su posición; para desplace la
geometría de la elipse, anime su propiedad Center. En el ejemplo se usa un PointAnimationUsingPath para animar
la propiedad Center del objeto EllipseGeometry.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions">
<Canvas Width="400" Height="400">
<!-- The EllipseGemetry specifies the shape and position of the Ellipse. The
Center property is animated, causing the Ellipse to animate across the screen-->
<EllipseGeometry x:Name="MyAnimatedEllipseGeometry"
Center="10,100" RadiusX="15" RadiusY="15" />
</Path.Data>
<Path.Triggers>
<EventTrigger RoutedEvent="Path.Loaded">
<BeginStoryboard Name="MyBeginStoryboard">
<Storyboard>
using System;
using System.Windows;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace SDKSample
{
public PointAnimationUsingPathExample()
{
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Namespace SDKSample
End Class
End Namespace
Consulte también
Ejemplo de animación de trazado
Información general sobre animaciones
Temas de procedimientos de animación de trazado
Cómo: Animar un objeto a lo largo de una
trayectoria (animación de matriz)
20/02/2020 • 4 minutes to read • Edit Online
En este ejemplo se muestra cómo usar la clase MatrixAnimationUsingPath para animar un objeto a lo largo de un
trazado definido por un PathGeometry.
Ejemplo
En el ejemplo siguiente se anima un objeto a lo largo de un trazado haciendo lo siguiente:
Aplica un MatrixTransform al objeto para moverlo.
Define la ruta de acceso mediante un PathGeometry.
Crea un MatrixAnimationUsingPath y lo usa para animar la propiedad Matrix de la MatrixTransform. El
MatrixAnimationUsingPath toma el PathGeometry y lo utiliza para generar valores Matrix.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions" Margin="20">
<Canvas Width="400" Height="400">
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace SDKSample
{
/// <summary>
/// Shows how to animate an object along
/// a geometric path.
/// </summary>
public class MatrixAnimationUsingPathExample : Page
{
public MatrixAnimationUsingPathExample()
{
this.Margin = new Thickness(20);
// Create a button.
Button aButton = new Button();
aButton.MinWidth = 100;
aButton.Content = "A Button";
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Namespace SDKSample
''' <summary>
''' Shows how to animate an object along
''' a geometric path.
''' </summary>
Public Class MatrixAnimationUsingPathExample
Inherits Page
End Sub
End Class
End Namespace
Para obtener el ejemplo completo, consulte ejemplo de animación de trazado. Para obtener más información
sobre las rutas de acceso geométricas, vea información general sobre geometría.
Consulte también
Información general sobre animaciones
Ejemplo de animación de trazado
Temas de procedimientos de animación de trazado
Cómo: Animar un objeto a lo largo de un trazado
(animación en matriz con acumulación de
desplazamiento)
20/02/2020 • 5 minutes to read • Edit Online
En este ejemplo se muestra cómo usar la clase MatrixAnimationUsingPath para animar un objeto a lo largo de un
trazado y hacer que la animación acumule sus valores de desplazamiento a medida que se repite.
Ejemplo
En el ejemplo siguiente se usa el objeto MatrixAnimationUsingPath para animar la propiedad Matrix de un
MatrixTransform aplicado a un botón. Como resultado, un botón se mueve a lo largo de un trazado curvo.
Además, en el ejemplo se establece la propiedad IsOffsetCumulative en true , lo que hace que el desplazamiento
de la matriz animada se acumule a medida que se repite la animación. Dado que el desplazamiento se acumula, el
botón se aleja por la pantalla cuando se repite la animación, en lugar de restablecerse a la posición inicial.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Margin="20"
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions">
</Button>
</Canvas>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace SDKSample
{
/// <summary>
/// Shows how to use the MatrixAnimationUsingPath.IsOffsetCumulative
/// property to make a MatrixAnimatioinUsingPath accumulate
/// its values when it repeats.
/// </summary>
public class MatrixAnimationUsingPathExampleOffsetCumulative : Page
{
public MatrixAnimationUsingPathExampleOffsetCumulative()
{
this.Margin = new Thickness(20);
// Create a button.
Button aButton = new Button();
aButton.MinWidth = 100;
aButton.Content = "A Button";
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Namespace SDKSample
''' <summary>
''' Shows how to use the MatrixAnimationUsingPath.IsOffsetCumulative
''' property to make a MatrixAnimatioinUsingPath accumulate
''' its values when it repeats.
''' </summary>
Public Class MatrixAnimationUsingPathExampleOffsetCumulative
Inherits Page
End Sub
End Class
End Namespace
Tenga en cuenta que, aunque la propiedad IsOffsetCumulative hace que los valores de desplazamiento se
acumulen en las repeticiones, no hace que se acumulen los valores de rotación. Para que se acumulen los valores
de rotación, establezca las propiedades DoesRotateWithTangent y IsAngleCumulative de la animación en true .
Para obtener el ejemplo completo, consulte ejemplo de animación de trazado. Para ver un ejemplo en el que se
muestra cómo animar un valor Matrix a lo largo de un trazado sin acumulación de desplazamiento, vea animar un
objeto a lo largo de un trazado (animación en matriz).
Consulte también
Información general sobre animaciones
Temas de procedimientos de animación de trazado
Procedimiento Girar un objeto mediante un trazado
geométrico (animación en matriz)
23/10/2019 • 5 minutes to read • Edit Online
En este ejemplo se muestra cómo usar un MatrixAnimationUsingPath y un MatrixTransform para girar (pivotar)
un objeto a lo largo de un trazado geométrico definido por un PathGeometry objeto.
Ejemplo
En el ejemplo siguiente se usa el MatrixAnimationUsingPath objeto que se va a animar el Matrix propiedad de un
MatrixTransform. El MatrixTransform se aplica a un botón y hace que se mueva a lo largo de un trazado curvo.
Dado que el DoesRotateWithTangent propiedad está establecida en true , el rectángulo gira a lo largo de la
tangente de la ruta de acceso.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions" Margin="20">
<Canvas Width="400" Height="400">
using System;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace SDKSample
{
/// <summary>
/// Shows how to animate an object along
/// a geometric path.
/// </summary>
public class MatrixAnimationUsingPathDoesRotateWithTangentExample : Page
{
public MatrixAnimationUsingPathDoesRotateWithTangentExample()
{
this.Margin = new Thickness(20);
// Create a button.
Button aButton = new Button();
aButton.MinWidth = 100;
aButton.Content = "A Button";
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Namespace SDKSample
''' <summary>
''' Shows how to animate an object along
''' a geometric path.
''' </summary>
Public Class MatrixAnimationUsingPathDoesRotateWithTangentExample
Inherits Page
End Sub
End Class
End Namespace
Vea también
Información general sobre animaciones
Temas de procedimientos de animación de trazado
Ejemplo de animación de trazado
Procedimiento Girar un objeto mediante un trazado
geométrico
23/10/2019 • 7 minutes to read • Edit Online
En este ejemplo se muestra cómo girar (pivotar) un objeto a lo largo de un trazado geométrico definido por un
PathGeometry objeto.
Ejemplo
El ejemplo siguiente utiliza tres DoubleAnimationUsingPath objetos que se va a mover un rectángulo a lo largo de
un trazado geométrico.
La primera DoubleAnimationUsingPath anima un RotateTransform que se aplica al rectángulo. La
animación genera valores de ángulo. Hace que el rectángulo gire (pivote) a lo largo de los contornos del
trazado.
Los otros dos objetos animan la X y Y valores de un TranslateTransform que se aplica al rectángulo. Hacen
que el rectángulo se mueva horizontal y verticalmente a lo largo del trazado.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions">
<Page.Resources>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Path.Loaded">
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever" AutoReverse="True" >
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace SDKSample
{
public RotateAnimationUsingPathExample()
{
// Create a rectangle.
Rectangle aRectangle = new Rectangle();
aRectangle.Width = 30;
aRectangle.Height = 30;
aRectangle.Fill = Brushes.Blue;
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Namespace SDKSample
End Sub
End Class
End Namespace
Otra manera de girar un objeto utilizando un trazado geométrico es usar un MatrixAnimationUsingPath de objeto
y establecer su DoesRotateWithTangent propiedad true . Para obtener más información y un ejemplo, vea girar
un objeto utilizando un trazado geométrico (animación en matriz).
Para obtener un ejemplo completo, vea ejemplo de animación de trazado.
Vea también
Información general sobre animaciones
Ejemplo de animación de trazado
Temas de procedimientos de animación de trazado
Información general sobre multimedia
29/10/2019 • 13 minutes to read • Edit Online
Las características multimedia de Windows Presentation Foundation (WPF ) le permiten integrar audio y vídeo en
las aplicaciones para mejorar la experiencia del usuario. En este tema se presentan las características multimedia
de WPF.
API multimedia
Las clases MediaElement y MediaPlayer se utilizan para presentar contenido de audio o vídeo. Estas clases se
pueden controlar de manera interactiva o mediante un reloj. Estas clases pueden usar en el control de Microsoft
Windows Media Player 10 para la reproducción multimedia. La clase que se usa depende del escenario.
MediaElement es un UIElement compatible con el diseño y se puede consumir como el contenido de muchos
controles. También se puede usar en Lenguaje XAML (Extensible Application Markup Language) y en el código.
por otro lado, MediaPlayerestá diseñado para Drawing objetos y carece de compatibilidad con el diseño. Los
medios cargados con un MediaPlayer solo se pueden presentar mediante un VideoDrawing o interactuando
directamente con un DrawingContext. no se puede usar MediaPlayer en XAML.
Para más información sobre los objetos de dibujo y el contexto de dibujo, consulte Información general sobre
objetos Drawing.
NOTE
Al distribuir elementos multimedia con la aplicación, no puede usar un archivo multimedia como recurso del proyecto. En el
archivo de proyecto, debe establecer en su lugar el tipo de elemento multimedia en Content y establecer
CopyToOutputDirectory en PreserveNewest o Always .
Para entender la reproducción multimedia en Windows Presentation Foundation (WPF ), es preciso entender los
distintos modos en que se pueden reproducir los elementos multimedia. Tanto MediaElement como MediaPlayer
se pueden usar en dos modos de medios diferentes, el modo independiente y el modo de reloj. El modo
multimedia viene determinado por la propiedad Clock. Cuando Clock se null , el objeto multimedia está en
modo independiente. Cuando el Clock no es null, el objeto multimedia está en modo de reloj. De manera
predeterminada, los objetos multimedia están en modo independiente.
Modo independiente
En el modo independiente, el contenido multimedia controla la reproducción multimedia. El modo independiente
habilita las opciones siguientes:
Los Uri del medio se pueden especificar directamente.
La reproducción multimedia se puede controlar directamente.
Las propiedades Position y SpeedRatio del elemento multimedia se pueden modificar.
Los elementos multimedia se cargan estableciendo la propiedad Source del objeto MediaElement o llamando al
método Open del objeto MediaPlayer.
Para controlar la reproducción multimedia en el modo independiente, se pueden usar los métodos de control del
objeto multimedia. Los métodos de control disponibles son Play, Pause, Closey Stop. Por MediaElement, el control
interactivo que usa estos métodos solo está disponible cuando el LoadedBehavior está establecido en Manual.
Estos métodos no están disponible cuando el objeto multimedia está en el modo de reloj.
Consulte Control de un MediaElement (Reproducir, Pausar, Detener, Volumen y Velocidad) para ver un ejemplo
del modo independiente.
Modo de reloj
En el modo de reloj, una MediaTimeline controla la reproducción multimedia. El modo de reloj tiene las
características siguientes:
El Uri del elemento multimedia se establece indirectamente a través de un MediaTimeline.
El reloj puede controlar la reproducción multimedia. No se pueden usar los métodos de control del objeto
multimedia.
Los elementos multimedia se cargan estableciendo la propiedad Source de un objeto MediaTimeline,
creando el reloj desde la escala de tiempo y asignando el reloj al objeto multimedia. Los elementos
multimedia también se cargan de esta manera cuando una MediaTimeline dentro de un Storyboard tiene
como destino una MediaElement.
Para controlar la reproducción multimedia en el modo de reloj, se deben usar los métodos de control de
ClockController. Un ClockController se obtiene de la propiedad ClockController de la MediaClock. Si intenta usar
los métodos de control de un objeto MediaElement o MediaPlayer mientras está en modo de reloj, se producirá
una InvalidOperationException.
Consulte Información general sobre animaciones para más información sobre los relojes y las escalas de tiempo.
Consulte Control de un control MediaElement mediante un guión gráfico para ver un ejemplo del modo de reloj.
Clase MediaElement
Agregar medios a una aplicación es tan sencillo como agregar un control de MediaElement al interfaz de usuario
(UI) de la aplicación y proporcionar un Uri al medio que desea incluir. Todos los tipos de medios admitidos por
Microsoft Windows Media Player 10 se admiten en Windows Presentation Foundation (WPF ). En el ejemplo
siguiente se muestra un uso simple del MediaElement en Lenguaje XAML (Extensible Application Markup
Language).
En este ejemplo, el elemento multimedia se reproduce automáticamente en cuanto se carga. Cuando el elemento
multimedia termina de reproducirse se cierra y se liberan todos los recursos multimedia (incluso la memoria de
vídeo). Éste es el comportamiento predeterminado del objeto MediaElement y se controla mediante las
propiedades LoadedBehavior y UnloadedBehavior.
Control de MediaElement
Las propiedades LoadedBehavior y UnloadedBehavior controlan el comportamiento de la MediaElement cuando
IsLoaded es true o false , respectivamente. El MediaState las propiedades se establecen para que afecten al
comportamiento de la reproducción multimedia. Por ejemplo, la LoadedBehavior predeterminada es Play y se
Closela UnloadedBehavior predeterminada. Esto significa que, tan pronto como se carga el MediaElement y se
completa el prelanzamiento, el medio comienza a reproducirse. Cuando se completa la reproducción, el elemento
multimedia se cierra y se liberan todos los recursos multimedia.
Las propiedades LoadedBehavior y UnloadedBehavior no son la única manera de controlar la reproducción
multimedia. En el modo de reloj, el reloj puede controlar el MediaElement y los métodos de control interactivos
tienen control cuando se Manualla LoadedBehavior. MediaElement controla esta competición para el control
mediante la evaluación de las siguientes prioridades.
1. UnloadedBehaviorOperador Vigente cuando el elemento multimedia está descargado. Esto garantiza que
todos los recursos multimedia se liberan de forma predeterminada, incluso cuando un MediaClock está
asociado a la MediaElement.
2. MediaClockOperador En contexto, cuando el contenido multimedia tiene una Clock. Si el medio se
descarga, el MediaClock surtirá efecto mientras se Manualel UnloadedBehavior. El modo de reloj siempre
invalida el comportamiento cargado del MediaElement.
3. LoadedBehaviorOperador Vigente cuando el elemento multimedia está cargado.
4. Métodos de control interactivos. Se aplica cuando se Manualla LoadedBehavior. Los métodos de control
disponibles son Play, Pause, Closey Stop.
Visualización de MediaElement
Para mostrar una MediaElement debe tener contenido para representarse y tendrá sus propiedades ActualWidth
y ActualHeight establecidas en cero hasta que se cargue el contenido. Para contenido de solo audio, estas
propiedades siempre son cero. En el caso de contenido de vídeo, una vez que se ha generado el evento
MediaOpened, el ActualWidth y ActualHeight informarán del tamaño del medio cargado. Esto significa que hasta
que se cargue el medio, el MediaElement no ocupará ningún espacio físico en el interfaz de usuario (UI) a menos
que se establezcan las propiedades Width o Height.
El establecimiento de las propiedades Width y Height hará que los elementos multimedia se expandan para
rellenar el área proporcionada para el MediaElement. Para conservar la relación de aspecto original del elemento
multimedia, debe establecerse la propiedad Width o Height, pero no ambas. Establecer las propiedades Width y
Height hará que los elementos multimedia presenten en un tamaño de elemento fijo que puede no ser deseable.
Para evitar tener un elemento de tamaño fijo, Windows Presentation Foundation (WPF ) puede preprocesar el
elemento multimedia. Esto se hace estableciendo el LoadedBehavior en Play o Pause. En un estado Pause, el
elemento multimedia se preprocesará y presentará el primer fotograma. En un estado Play, los elementos
multimedia se preprocesarán y comenzarán a reproducirse.
Clase MediaPlayer
Mientras que la clase MediaElement es un elemento de marco, la clase MediaPlayer está diseñada para utilizarse
en objetos Drawing. Los objetos de dibujo se usan cuando se pueden sacrificar las características del nivel de
marco para obtener ventajas de rendimiento o cuando se necesitan Freezable características. MediaPlayer le
permite aprovechar estas características a la vez que proporciona contenido multimedia en las aplicaciones. Como
MediaElement, MediaPlayer se puede usar en modo independiente o de reloj, pero no tiene los Estados de
descarga y carga del objeto MediaElement. Esto reduce la complejidad del control de reproducción de la
MediaPlayer.
Control de MediaPlayer
Dado que MediaPlayer no tiene estado, hay solo dos maneras de controlar la reproducción multimedia.
1. Métodos de control interactivos. En contexto, en el modo independiente ( null propiedadClock).
2. MediaClockOperador En contexto, cuando el contenido multimedia tiene una Clock.
Visualización de MediaPlayer
Técnicamente, no se puede mostrar un MediaPlayer porque no tiene ninguna representación física. Sin embargo,
se puede usar para presentar elementos multimedia en un Drawing mediante la clase VideoDrawing. En el
ejemplo siguiente se muestra el uso de un VideoDrawing para mostrar los elementos multimedia.
//
// Create a VideoDrawing.
//
MediaPlayer player = new MediaPlayer();
aVideoDrawing.Player = player;
Vea la información General sobre objetos de dibujo para obtener más información sobre los objetos de Drawing.
Vea también
DrawingGroup
Diseño
Temas "Cómo..."
Temas "Cómo..." de audio y vídeo
23/10/2019 • 2 minutes to read • Edit Online
Los temas siguientes muestran cómo usar el MediaElement para integrar el contenido de audio y vídeo en sus
aplicaciones.
En esta sección
Controlar un MediaElement (Reproducir, Pausar, Detener, Volumen y Velocidad)
Controlar un control MediaElement mediante un guión gráfico
Desencadenar la reproducción de medios con un evento de usuario
Repetir reproducción multimedia
Reproducir medios con animaciones
Usar transformaciones en un control MediaElement
Referencia
MediaElement
MediaPlayer
MediaTimeline
Secciones relacionadas
Gráficos y multimedia
Procedimiento Controlar un control MediaElement
(Reproducir, Pausar, Detener, Volumen y Velocidad)
23/10/2019 • 5 minutes to read • Edit Online
Ejemplo
El código siguiente crea la interfaz de usuario.
NOTE
La LoadedBehavior propiedad de MediaElement debe establecerse en Manual para poder detener, pausar y reproducir los
medios interactivamente.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.MediaElementExample" >
<StackPanel Background="Black">
<!-- To interactively stop, pause, and play the media, the LoadedBehavior
property of the MediaElement must be set to "Manual". -->
<MediaElement Source="media\numbers.wmv" Name="myMediaElement"
Width="450" Height="250" LoadedBehavior="Manual" UnloadedBehavior="Stop" Stretch="Fill"
MediaOpened="Element_MediaOpened" MediaEnded="Element_MediaEnded"/>
<!-- Volume slider. This slider allows a Volume range between 0 and 1. -->
<TextBlock Foreground="White" VerticalAlignment="Center" Margin="5" >Volume</TextBlock>
<Slider Name="volumeSlider" VerticalAlignment="Center" ValueChanged="ChangeMediaVolume"
Minimum="0" Maximum="1" Value="0.5" Width="70"/>
<!-- Volume slider. This slider allows you to change the speed of the media playback. -->
<TextBlock Foreground="White" Margin="5" VerticalAlignment="Center">Speed</TextBlock>
<Slider Name="speedRatioSlider" VerticalAlignment="Center" ValueChanged="ChangeMediaSpeedRatio"
Value="1" Width="70" />
<!-- Seek to slider. Ths slider allows you to jump to different parts of the media playback. -->
<TextBlock Foreground="White" Margin="5" VerticalAlignment="Center">Seek To</TextBlock>
<Slider Name="timelineSlider" Margin="5" ValueChanged="SeekToMediaPosition" Width="70"/>
</StackPanel>
</StackPanel>
</Page>
Ejemplo
El código siguiente implementa la funcionalidad de los controles de interfaz de usuario de ejemplo. Los
Playmétodos Pause, yStop se usan para reproducir, pausar y detener el medio respectivamente. Cambiar la
Position propiedad MediaElement de le permite omitir el contenido multimedia. Por último, Volume las
SpeedRatio propiedades y se usan para ajustar el volumen y la velocidad de reproducción del medio.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Input;
namespace SDKSample
{
// The Play method will begin the media if it is not currently active or
// resume media if it is paused. This has no effect if the media is
// already running.
myMediaElement.Play();
// The Stop method stops and resets the media to be played from
// the beginning.
myMediaElement.Stop();
}
// When the media opens, initialize the "Seek To" slider maximum value
// to the total number of miliseconds in the length of the media clip.
private void Element_MediaOpened(object sender, EventArgs e)
{
timelineSlider.Maximum = myMediaElement.NaturalDuration.TimeSpan.TotalMilliseconds;
}
// When the media playback is finished. Stop() the media to seek to media start.
private void Element_MediaEnded(object sender, EventArgs e)
{
myMediaElement.Stop();
}
// Overloaded constructor takes the arguments days, hours, minutes, seconds, milliseconds.
// Create a TimeSpan with miliseconds equal to the slider value.
TimeSpan ts = new TimeSpan(0, 0, 0, 0, SliderValue);
myMediaElement.Position = ts;
}
void InitializePropertyValues()
{
{
// Set the media's starting Volume and SpeedRatio to the current value of the
// their respective slider controls.
myMediaElement.Volume = (double)volumeSlider.Value;
myMediaElement.SpeedRatio = (double)speedRatioSlider.Value;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Imports System.Windows.Data
Imports System.Windows.Media
Imports System.Windows.Input
Namespace SDKSample
' The Play method will begin the media if it is not currently active or
' resume media if it is paused. This has no effect if the media is
' already running.
myMediaElement.Play()
End Sub
End Sub
' The Stop method stops and resets the media to be played from
' the beginning.
myMediaElement.Stop()
End Sub
End Sub
' When the media opens, initialize the "Seek To" slider maximum value
' to the total number of miliseconds in the length of the media clip.
Private Sub Element_MediaOpened(ByVal sender As Object, ByVal args As RoutedEventArgs)
timelineSlider.Maximum = myMediaElement.NaturalDuration.TimeSpan.TotalMilliseconds
End Sub
' When the media playback is finished. Stop() the media to seek to media start.
Private Sub Element_MediaEnded(ByVal sender As Object, ByVal args As RoutedEventArgs)
myMediaElement.Stop()
End Sub
' Overloaded constructor takes the arguments days, hours, minutes, seconds, milliseconds.
' Create a TimeSpan with miliseconds equal to the slider value.
Dim ts As New TimeSpan(0, 0, 0, 0, SliderValue)
myMediaElement.Position = ts
End Sub
' Set the media's starting Volume and SpeedRatio to the current value of the
' their respective slider controls.
Private Sub InitializePropertyValues()
myMediaElement.Volume = System.Convert.ToDouble(volumeSlider.Value)
myMediaElement.SpeedRatio = System.Convert.ToDouble(speedRatioSlider.Value)
End Sub
End Class
End Namespace 'SDKSample
Vea también
Controlar un control MediaElement mediante un guión gráfico
Procedimiento Controlar un control MediaElement
mediante un guión gráfico
23/10/2019 • 3 minutes to read • Edit Online
Ejemplo
Cuando se usa un MediaTimeline en un Storyboard para controlar la temporización de un MediaElement, la
funcionalidad es idéntica a la funcionalidad de otros Timeline objetos, como animaciones. Por ejemplo, un
MediaTimeline usa Timeline propiedades como el BeginTime propiedad para especificar cuándo se debe iniciar
un MediaElement (iniciar la reproducción multimedia). También usa el Duration propiedad para especificar cuánto
tiempo el MediaElement está activo (duración de reproducción multimedia). Para obtener más información sobre
el uso de Timeline los objetos que tienen un Storyboard, consulte Storyboards Overview.
En este ejemplo se muestra cómo crear un Reproductor de medios sencillo que usa un MediaTimeline para
controlar la reproducción. El Reproductor multimedia incluye reproducir, pausar, reanudar y detener los botones.
El Reproductor también tiene un Slider control que actúa como una barra de progreso.
En el ejemplo siguiente se crea el interfaz de usuario (UI) para el Reproductor de medios.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.MediaTimelineExample" >
<StackPanel Background="Black">
<!-- Button controls for play, pause, resume, and stop. -->
<StackPanel HorizontalAlignment="Center" Width="260" Orientation="Horizontal">
<Image Name="PlayButton" Source="images\UI_play.gif" Margin="30,10,10,10" />
<Image Name="PauseButton" Source="images\UI_pause.gif" Margin="10" />
<Image Name="ResumeButton" Source="images\UI_resume.gif" Margin="10" />
<Image Name="StopButton" Source="images\UI_stop.gif" Margin="10" />
</StackPanel>
<StackPanel.Triggers>
<EventTrigger RoutedEvent="Image.MouseDown" SourceName="PlayButton">
<EventTrigger.Actions>
<BeginStoryboard Name= "myBegin">
<Storyboard SlipBehavior="Slip">
<!-- The MediaTimeline controls the timing of the video and acts like other Timeline objects.
For example, although the video clip (numbers.wmv) lasts longer, playback ends after six
seconds because that is the duration of the MediaTimeline (Duration="0:0:6"). -->
<MediaTimeline Source="media\numbers.wmv" Storyboard.TargetName="myMediaElement"
BeginTime="0:0:0" Duration="0:0:6" CurrentTimeInvalidated="MediaTimeChanged" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</StackPanel>
</Page>
namespace SDKSample
{
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Namespace SDKSample
End Sub
End Sub
End Class
End Namespace 'SDKSample
Vea también
MediaElement
MediaTimeline
Storyboard
Controlar un MediaElement (Reproducir, Pausar, Detener, Volumen y Velocidad)
Información general sobre objetos Storyboard
Información general sobre animaciones de fotogramas clave
Información general sobre animaciones
Temas "Cómo..."
Gráficos y multimedia
Procedimiento Desencadenar la reproducción de
medios con un evento de usuario
23/10/2019 • 2 minutes to read • Edit Online
Ejemplo
En el ejemplo siguiente se usa el MediaElement control y el MediaTimeline clase para reproducir un sonido que se
produce cuando el usuario hace clic en un Button.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<StackPanel>
<!-- Sound wave from this source is played when the button is clicked.-->
<MediaTimeline Source="C:\WINDOWS\Media\ringin.wav" Storyboard.TargetName="myMediaElement" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Page>
Vea también
MediaElement
MediaTimeline
RoutedEvent
Storyboard
Temas "Cómo..."
Gráficos y multimedia
Procedimiento Repetir la reproducción de elementos
multimedia
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo reproducir contenido multimedia indefinidamente, es decir, establecer el
contenido multimedia de manera que se reproduzca en un bucle infinito.
Ejemplo
En el ejemplo siguiente se usa MediaElement y MediaTimeline en un Storyboard para reproducir un clip
multimedia en un bucle infinito.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<StackPanel>
<!-- The MediaTimeline has a RepeatBehavior="Forever" which makes the media play
over and over indefinitely.-->
<MediaTimeline Source="media\tada.wav" Storyboard.TargetName="myMediaElement"
RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</MediaElement.Triggers>
</MediaElement>
</StackPanel>
</Page>
Vea también
MediaElement
MediaTimeline
Storyboard
Temas "Cómo..."
Gráficos y multimedia
Procedimiento Reproducir elementos multimedia con
animaciones
23/10/2019 • 2 minutes to read • Edit Online
En este ejemplo se muestra cómo reproducir archivos multimedia y animaciones al mismo tiempo mediante la
MediaTimeline y DoubleAnimationUsingKeyFrames clases en el mismo Storyboard.
Ejemplo
Puede usar uno o varios MediaTimeline objetos en un Storyboard junto con otros usuarios Timeline objetos, como
animaciones.
El ejemplo siguiente se establece la SlipBehavior propiedad de la Storyboard en un valor de Slip , que especifica
que la animación no avanza hasta que avanza la multimedia (el vídeo en este ejemplo). Esta funcionalidad puede
ser necesaria si se retrasa la reproducción multimedia debido al tiempo de carga.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<Canvas>
<!-- The two Path elements below create the purple and gold rings
which are animated while the media is played. -->
<Path Stroke="Purple" StrokeThickness="5">
<Path.Data>
<EllipseGeometry x:Name="MyEllipseGeometry"
Center="125,125" RadiusX="15" RadiusY="10" />
</Path.Data>
</Path>
<Path Stroke="Gold" StrokeThickness="5">
<Path.Data>
<EllipseGeometry x:Name="MyEllipseGeometry2"
Center="125,125" RadiusX="10" RadiusY="15" />
</Path.Data>
</Path>
</Canvas>
</Border>
<!-- This Storyboard contains both media (video in this example) and animations. Note
the SlipBehavior value of "Slip" specifies that the animation does not progress
until the media progresses. This might be desirable if media playback is delayed
because of loading time. -->
<Storyboard SlipBehavior="Slip">
<!-- The MediaTimeline controls the timing of the video and acts like other Timeline
objects.
For example, although the video clip (numbers.wmv) lasts longer, playback ends after six
For example, although the video clip (numbers.wmv) lasts longer, playback ends after six
seconds because that is the duration of the MediaTimeline (Duration="0:0:6"). -->
<MediaTimeline Source="media\numbers.wmv" BeginTime="0:0:0" Duration="0:0:10"/>
<!-- The animations below animate the ellipses in the right hand pane. These animations are
timed to correspond to the counting in the video. -->
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</MediaElement.Triggers>
</MediaElement>
</Canvas>
</Canvas>
</Page>
Vea también
MediaTimeline
DoubleAnimationUsingKeyFrames
Storyboard
SlipBehavior
Temas "Cómo..."
Información general sobre objetos Storyboard
Información general sobre animaciones de fotogramas clave
Información general sobre animaciones
Gráficos y multimedia
Procedimiento Usar transformaciones en un control
MediaElement
23/10/2019 • 2 minutes to read • Edit Online
Ejemplo
En el marcado siguiente, el MediaElement se gira mediante un RotateTransform.
<MediaElement Source="media/numbers-aud.wmv">
<MediaElement.LayoutTransform>
<TransformGroup>
<RotateTransform Angle="305" />
</TransformGroup>
</MediaElement.LayoutTransform>
</MediaElement>
Programación de capas visuales
23/10/2019 • 2 minutes to read • Edit Online
El Visual objeto es un núcleo WPF objeto, cuyo rol principal es proporcionar compatibilidad con la representación.
Controles de interfaz de usuario, como Button y TextBox, derivan de la Visual clase y usarla para conservar sus
datos de representación.
En esta sección
Realizar pruebas de posicionamiento en la capa visual
Usar objetos DrawingVisual
Tutorial: Hospedar objetos visuales en una aplicación Win32
Temas "Cómo..."
Vea también
Visual
VisualTreeHelper
DrawingVisual
Información general sobre la representación de gráficos en WPF
Gráficos y multimedia
Realizar pruebas de posicionamiento en la capa
visual
20/02/2020 • 23 minutes to read • Edit Online
En este tema se proporciona información general sobre la funcionalidad de prueba de posicionamiento que
proporciona la capa visual. La compatibilidad con la prueba de posicionamiento le permite determinar si un valor
de geometría o punto se encuentra dentro del contenido representado de un Visual, lo que le permite
implementar el comportamiento de la interfaz de usuario, como un rectángulo de selección para seleccionar
varios objetos.
NOTE
Para obtener un ejemplo de código completo que muestra la prueba de posicionamiento en la capa visual, vea Ejemplo de
prueba de posicionamiento con DrawingVisuals y Ejemplo de prueba de posicionamiento de interoperabilidad con Win32.
NOTE
Un objeto visual transparente también se puede someter a una prueba de posicionamiento.
El valor de la coordenada que se pasa como parámetro de punto para el método HitTest tiene que ser relativo al
espacio de coordenadas del objeto visual con el que se realiza la prueba de posicionamiento. Por ejemplo, si ha
anidado objetos visuales definidos en (100, 100) en el espacio de coordenadas del elemento primario, la prueba
de posicionamiento de un elemento secundario visual en (0, 0) es equivalente a la prueba de posicionamiento en
(100, 100) en el espacio de coordenadas del elemento primario.
En el código siguiente se muestra cómo configurar controladores de eventos de mouse para un UIElement
objeto que se usa para capturar eventos utilizados para la prueba de posicionamiento.
// Respond to the left mouse button down event by initiating the hit test.
private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// Retrieve the coordinate of the mouse position.
Point pt = e.GetPosition((UIElement)sender);
// Perform the hit test against a given portion of the visual object tree.
HitTestResult result = VisualTreeHelper.HitTest(myCanvas, pt);
if (result != null)
{
// Perform action on hit visual object.
}
}
' Respond to the left mouse button down event by initiating the hit test.
Private Overloads Sub OnMouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
' Retrieve the coordinate of the mouse position.
Dim pt As Point = e.GetPosition(CType(sender, UIElement))
' Perform the hit test against a given portion of the visual object tree.
Dim result As HitTestResult = VisualTreeHelper.HitTest(myCanvas, pt)
NOTE
La propiedad IsHitTestVisible obtiene o establece un valor que declara si un objeto derivado de UIElementse puede
devolver como resultado de una prueba de posicionamiento de alguna parte de su contenido representado. Esto permite
modificar de manera selectiva el árbol visual para determinar qué objetos visuales están implicados en una prueba de
posicionamiento.
// Respond to the right mouse button down event by setting up a hit test results callback.
private void OnMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
// Retrieve the coordinate of the mouse position.
Point pt = e.GetPosition((UIElement)sender);
// Clear the contents of the list used for hit test results.
hitResultsList.Clear();
' Clear the contents of the list used for hit test results.
hitResultsList.Clear()
El método de devolución de llamada de la prueba de posicionamiento define las acciones que se realizan cuando
se identifica una prueba de posicionamiento en un objeto visual determinado del árbol visual. Después de
realizar las acciones, se devuelve un valor HitTestResultBehavior que determina si se debe continuar la
enumeración de otros objetos visuales o no.
NOTE
El orden de enumeración de los objetos visuales de la posición es el orden z. El objeto visual de orden z de nivel superior es
el primer objeto enumerado. Los demás objetos visuales enumerados están en orden z decreciente. Este orden de
enumeración corresponde al orden de representación de elementos visuales.
Puede detener la enumeración de objetos visuales en cualquier momento en la función de devolución de llamada
de la prueba de posicionamiento devolviendo Stop.
// Respond to the mouse wheel event by setting up a hit test filter and results enumeration.
private void OnMouseWheel(object sender, MouseWheelEventArgs e)
{
// Retrieve the coordinate of the mouse position.
Point pt = e.GetPosition((UIElement)sender);
// Clear the contents of the list used for hit test results.
hitResultsList.Clear();
' Respond to the mouse wheel event by setting up a hit test filter and results enumeration.
Private Overloads Sub OnMouseWheel(ByVal sender As Object, ByVal e As MouseWheelEventArgs)
' Retrieve the coordinate of the mouse position.
Dim pt As Point = e.GetPosition(CType(sender, UIElement))
' Clear the contents of the list used for hit test results.
hitResultsList.Clear()
// Filter the hit test values for each object in the enumeration.
public HitTestFilterBehavior MyHitTestFilter(DependencyObject o)
{
// Test for the object value you want to filter.
if (o.GetType() == typeof(Label))
{
// Visual object and descendants are NOT part of hit test results enumeration.
return HitTestFilterBehavior.ContinueSkipSelfAndChildren;
}
else
{
// Visual object is part of hit test results enumeration.
return HitTestFilterBehavior.Continue;
}
}
' Filter the hit test values for each object in the enumeration.
Public Function MyHitTestFilter(ByVal o As DependencyObject) As HitTestFilterBehavior
' Test for the object value you want to filter.
If o.GetType() Is GetType(Label) Then
' Visual object and descendants are NOT part of hit test results enumeration.
Return HitTestFilterBehavior.ContinueSkipSelfAndChildren
Else
' Visual object is part of hit test results enumeration.
Return HitTestFilterBehavior.Continue
End If
End Function
NOTE
Se llamará a la devolución de llamada de filtro de la prueba de posicionamiento en aquellos casos en que no se llame a la
devolución de llamada de resultados de pruebas de posicionamiento.
Pueden darse ocasiones en que desee realizar la prueba de posicionamiento tanto respecto al rectángulo
delimitador como respecto al contenido representado de un objeto visual. Al usar el valor del parámetro
PointHitTestParameters en el método HitTestCore invalidado como el parámetro para el HitTestCoredel método
base, puede realizar acciones basadas en un acierto del rectángulo delimitador de un objeto visual y, a
continuación, realizar una segunda prueba de posicionamiento con el contenido representado del objeto visual.
// Override default hit test support in visual object.
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
// Perform actions based on hit test of bounding rectangle.
// ...
Consulte también
HitTest
HitTestResult
HitTestResultCallback
HitTestFilterCallback
IsHitTestVisible
Prueba de posicionamiento mediante el ejemplo DrawingVisuals
Prueba de posicionamiento con el ejemplo de interoperación de Win32
Geometría de una prueba de posicionamiento en un objeto Visual
Realizar pruebas de posicionamiento mediante un contenedor host Win32
Usar objetos DrawingVisual
23/10/2019 • 8 minutes to read • Edit Online
En este tema se proporciona información general sobre cómo DrawingVisual usar objetos en WPF la capa visual.
Objeto DrawingVisual
DrawingVisual Es una clase de dibujo ligera que se utiliza para representar formas, imágenes o texto. Esta clase
se considera ligera porque no proporciona control de diseño ni control de eventos, lo que mejora su rendimiento.
Por esta razón, los dibujos son ideales para fondos e imágenes prediseñadas.
public MyVisualHost()
{
_children = new VisualCollection(this);
_children.Add(CreateDrawingVisualRectangle());
_children.Add(CreateDrawingVisualText());
_children.Add(CreateDrawingVisualEllipses());
NOTE
Para obtener el código completo del que se ha extraído el ejemplo de código anterior, vea Ejemplo Hit Test Using
DrawingVisuals.
return drawingVisual;
}
' Create a DrawingVisual that contains a rectangle.
Private Function CreateDrawingVisualRectangle() As DrawingVisual
Dim drawingVisual As New DrawingVisual()
Return drawingVisual
End Function
return _children[index];
}
' Provide a required override for the VisualChildrenCount property.
Protected Overrides ReadOnly Property VisualChildrenCount() As Integer
Get
Return _children.Count
End Get
End Property
Return _children(index)
End Function
// Capture the mouse event and hit test the coordinate point value against
// the child visual objects.
void MyVisualHost_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
// Retrieve the coordinates of the mouse button event.
System.Windows.Point pt = e.GetPosition((UIElement)sender);
// Initiate the hit test by setting up a hit test result callback method.
VisualTreeHelper.HitTest(this, null, new HitTestResultCallback(myCallback), new
PointHitTestParameters(pt));
}
// If a child visual object is hit, toggle its opacity to visually indicate a hit.
public HitTestResultBehavior myCallback(HitTestResult result)
{
if (result.VisualHit.GetType() == typeof(DrawingVisual))
{
if (((DrawingVisual)result.VisualHit).Opacity == 1.0)
{
((DrawingVisual)result.VisualHit).Opacity = 0.4;
}
else
{
((DrawingVisual)result.VisualHit).Opacity = 1.0;
}
}
' Initiate the hit test by setting up a hit test result callback method.
VisualTreeHelper.HitTest(Me, Nothing, New HitTestResultCallback(AddressOf myCallback), New
PointHitTestParameters(pt))
End Sub
' If a child visual object is hit, toggle its opacity to visually indicate a hit.
Public Function myCallback(ByVal result As HitTestResult) As HitTestResultBehavior
If result.VisualHit.GetType() Is GetType(DrawingVisual) Then
If (CType(result.VisualHit, DrawingVisual)).Opacity = 1.0 Then
CType(result.VisualHit, DrawingVisual).Opacity = 0.4
Else
CType(result.VisualHit, DrawingVisual).Opacity = 1.0
End If
End If
' Stop the hit test enumeration of objects in the visual tree.
Return HitTestResultBehavior.Stop
End Function
Vea también
DrawingVisual
HitTest
Información general sobre la representación de gráficos en WPF
Realizar pruebas de posicionamiento en la capa visual
Tutorial: Hospedar objetos visuales en una aplicación
Win32
10/01/2020 • 11 minutes to read • Edit Online
Windows Presentation Foundation (WPF ) proporciona un entorno rico para crear aplicaciones. Sin embargo, si
tiene una inversión sustancial en código Win32, podría ser más eficaz agregar WPF funcionalidad a la aplicación
en lugar de volver a escribir el código. Para proporcionar compatibilidad con Win32 y WPF subsistemas de
gráficos utilizados simultáneamente en una aplicación, WPF proporciona un mecanismo para hospedar objetos
en una ventana de Win32.
En este tutorial se describe cómo escribir una aplicación de ejemplo, una prueba de posicionamiento con el
ejemplo de interoperación de Win32, que hospeda WPF objetos visuales en una ventana de Win32.
Requisitos de
En este tutorial se da por supuesto que está familiarizado con la programación de WPF y Win32. Para obtener
una introducción básica a la programación de WPF, vea Tutorial: mi primera aplicación de escritorio WPF. Para
ver una introducción a la programación de Win32, consulte cualquiera de los numerosos libros sobre el tema, en
determinadas ventanas de programación , de Charles Petzold.
NOTE
En el tutorial se incluye una serie de ejemplos de código del ejemplo asociado. Sin embargo, para una mejor lectura, no se
incluye el código de ejemplo completo. Para obtener el código de ejemplo completo, vea prueba de posicionamiento con el
ejemplo de interoperación de Win32.
' Set the hwnd background color to the form's background color.
myHwndSource.CompositionTarget.BackgroundColor = System.Windows.Media.Brushes.OldLace.Color
End Sub
NOTE
No se puede establecer el valor de la propiedad ExtendedWindowStyle en WS_EX_TRANSPARENT. Esto significa que la
ventana de Win32 de host no puede ser transparente. Por esta razón, el color de fondo de la ventana de Win32 del host se
establece en el mismo color de fondo que su ventana primaria.
NOTE
La propiedad RootVisual del objeto HwndSource se establece en el primer objeto visual agregado a la ventana host de
Win32. El objeto visual raíz define el nodo de nivel superior del árbol de objetos visuales. Los objetos visuales subsiguientes
agregados a la ventana de Win32 de host se agregan como objetos secundarios.
public static void CreateShape(IntPtr parentHwnd)
{
// Create an instance of the shape.
MyShape myShape = new MyShape();
' Determine whether the host container window has been created.
If myHwndSource Is Nothing Then
' Create the host container window for the visual objects.
CreateHostHwnd(parentHwnd)
En el ejemplo siguiente se muestra el código para controlar los mensajes que se emiten al soltar el botón
primario y secundario del ratón. El valor de la coordenada de la posición de posicionamiento del mouse se
encuentra en el valor del parámetro lParam .
// Constant values from the "winuser.h" header file.
internal const int WM_LBUTTONUP = 0x0202,
WM_RBUTTONUP = 0x0205;
return IntPtr.Zero;
}
Friend Shared Function ApplicationMessageFilter(ByVal hwnd As IntPtr, ByVal message As Integer, ByVal wParam
As IntPtr, ByVal lParam As IntPtr, ByRef handled As Boolean) As IntPtr
' Handle messages passed to the visual.
Select Case message
' Handle the left and right mouse button up messages.
Case WM_LBUTTONUP, WM_RBUTTONUP
Dim pt As New System.Windows.Point()
pt.X = CUInt(lParam) And CUInt(&HFFFF) ' LOWORD = x
pt.Y = CUInt(lParam) >> 16 ' HIWORD = y
MyShape.OnHitTest(pt, message)
End Select
Return IntPtr.Zero
End Function
// Respond to WM_LBUTTONUP or WM_RBUTTONUP messages by determining which visual object was clicked.
public static void OnHitTest(System.Windows.Point pt, int msg)
{
// Clear the contents of the list used for hit test results.
hitResultsList.Clear();
// Determine whether to change the color of the circle or to delete the shape.
if (msg == WM_LBUTTONUP)
{
MyWindow.changeColor = true;
}
if (msg == WM_RBUTTONUP)
{
MyWindow.changeColor = false;
}
' Respond to WM_LBUTTONUP or WM_RBUTTONUP messages by determining which visual object was clicked.
Public Shared Sub OnHitTest(ByVal pt As System.Windows.Point, ByVal msg As Integer)
' Clear the contents of the list used for hit test results.
hitResultsList.Clear()
' Determine whether to change the color of the circle or to delete the shape.
If msg = WM_LBUTTONUP Then
MyWindow.changeColor = True
End If
If msg = WM_RBUTTONUP Then
MyWindow.changeColor = False
End If
Para obtener más información sobre las pruebas de posicionamiento en objetos visuales, vea pruebas de
posicionamiento en la capa visual.
Vea también
HwndSource
Prueba de posicionamiento con el ejemplo de interoperación de Win32
Realizar pruebas de posicionamiento en la capa visual
Temas "Cómo..." sobre programación de capas
visuales
23/10/2019 • 2 minutes to read • Edit Online
Los temas de esta sección muestran cómo utilizar la capa visual de composición de la prueba de posicionamiento y
de bajo nivel.
En esta sección
Obtener el desplazamiento de un objeto visual
Enumerar el contenido de un dibujo de un objeto visual
Geometría de una prueba de posicionamiento en un objeto Visual
Realizar una prueba de posicionamiento usando Geometry como parámetro
Realizar pruebas de posicionamiento mediante un contenedor host Win32
Representar un intervalo para cada fotograma mediante CompositionTarget
Vea también
Visual
VisualTreeHelper
DrawingVisual
Información general sobre la representación de gráficos en WPF
Gráficos y multimedia
Procedimiento Obtener el desplazamiento de un
objeto visual
23/10/2019 • 4 minutes to read • Edit Online
Estos ejemplos muestran cómo recuperar el valor de desplazamiento de un objeto visual que es relativo a su
elemento primario, o cualquier antecesor o descendiente.
Ejemplo
El ejemplo de marcado siguiente se muestra un TextBlock que se define con Margin valor 4.
En el ejemplo de código siguiente se muestra cómo utilizar el GetOffset método para recuperar el desplazamiento
de la TextBlock. Los valores de desplazamiento se encuentran en el valor devuelto Vector valor.
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<StackPanel Margin="16">
<StackPanel Margin="8">
<TextBlock Name="myTextBlock" Margin="4" Text="Hello, world" />
</StackPanel>
</StackPanel>
</Window>
' Return the general transform for the specified visual object.
Dim generalTransform1 As GeneralTransform = myTextBlock.TransformToAncestor(Me)
El desplazamiento tiene en cuenta la Margin valores para todos los objetos dentro de la que contiene Window. En
este caso, X es 28 (16 + 8 + 4), y Y es 28.
El valor de desplazamiento devuelto es relativo al antecesor de la Visual. Si desea devolver un valor de
desplazamiento es relativo a los descendientes de un Visual, utilice el TransformToDescendant método.
En el ejemplo de código siguiente se muestra cómo utilizar el TransformToDescendant método para recuperar el
desplazamiento de la StackPanel en relación con su elemento secundario TextBlock. Los valores de desplazamiento
se encuentran en el valor devuelto GeneralTransform valor.
' Return the general transform for the specified visual object.
Dim generalTransform1 As GeneralTransform = myStackPanel.TransformToDescendant(myTextBlock)
Vea también
Visual
VisualTreeHelper
Información general sobre la representación de gráficos en WPF
Procedimiento Enumerar el contenido de un dibujo
de un objeto visual
23/10/2019 • 2 minutes to read • Edit Online
El Drawing objeto proporciona un modelo de objetos para enumerar el contenido de Visualun objeto.
Ejemplo
En el ejemplo siguiente se GetDrawing usa el método para DrawingGroup recuperar el valor Visual de un y
enumerarlo.
NOTE
Cuando se enumera el contenido del objeto visual, se recuperan Drawing los objetos y no la representación subyacente de
los datos de representación como una lista de instrucciones de gráficos vectoriales. Para más información, consulte
Información general sobre la representación de gráficos en WPF.
En este ejemplo se muestra cómo realizar una prueba de posicionamiento en un objeto visual que se compone de
uno Geometry o más objetos.
Ejemplo
En el ejemplo siguiente se muestra cómo recuperar DrawingGroup de un objeto visual que utiliza el GetDrawing
método. Después, se realiza una prueba de posicionamiento en el contenido representado de cada dibujo de
DrawingGroup para determinar qué geometría se alcanzó.
NOTE
En la mayoría de los casos, se HitTest usaría el método para determinar si un punto forma una intersección con el contenido
representado de un visual.
Next drawing
End Sub
El FillContains método es un método sobrecargado que permite realizar una prueba de posicionamiento mediante
un especificado Point o Geometry. Si se traza una geometría, el trazo puede extenderse fuera del límite del relleno.
En ese caso, puede que desee llamar StrokeContains a además de a. FillContains
También puede proporcionar un ToleranceType que se usa para los propósitos del aplanamiento de Bézier.
NOTE
Esta muestra no tiene en cuenta ninguna transformación o recorte que pueda aplicarse a la geometría. Además, este
ejemplo no funcionará con un control con estilo, puesto que no tiene los dibujos asociados a él.
Vea también
Realizar pruebas de posicionamiento en la capa visual
Realizar una prueba de posicionamiento usando Geometry como parámetro
Procedimiento Realizar una prueba de
posicionamiento mediante el uso de Geometry como
parámetro
23/10/2019 • 4 minutes to read • Edit Online
En este ejemplo se muestra cómo realizar una prueba de posicionamiento en un objeto visual Geometry utilizando
como parámetro de prueba de posicionamiento.
Ejemplo
En el ejemplo siguiente se muestra cómo configurar una prueba de posicionamiento GeometryHitTestParameters
mediante para HitTest el método. El Point valor que se pasa OnMouseDown al método se usa para crear un
Geometry objeto con el fin de expandir el intervalo de la prueba de posicionamiento.
// Respond to the mouse button down event by setting up a hit test results callback.
private void OnMouseDown(object sender, MouseButtonEventArgs e)
{
// Retrieve the coordinate of the mouse position.
Point pt = e.GetPosition((UIElement)sender);
// Expand the hit test area by creating a geometry centered on the hit test point.
EllipseGeometry expandedHitTestArea = new EllipseGeometry(pt, 10.0, 10.0);
// Clear the contents of the list used for hit test results.
hitResultsList.Clear();
' Expand the hit test area by creating a geometry centered on the hit test point.
Dim expandedHitTestArea As New EllipseGeometry(pt, 10.0, 10.0)
' Clear the contents of the list used for hit test results.
hitResultsList.Clear()
En el ejemplo siguiente se muestra cómo implementar una devolución de llamada de Geometry la prueba de
posicionamiento cuando se usa un parámetro de prueba de posicionamiento. El result parámetro se convierte
en un GeometryHitTestResult objeto para recuperar el valor de la IntersectionDetail propiedad. El valor de
propiedad le permite determinar si el Geometry parámetro de la prueba de posicionamiento está incluido total o
parcialmente en el contenido representado del destino de la prueba de posicionamiento. En este caso, el código de
ejemplo solo está agregando los resultados de la prueba de posicionamiento a la lista para elementos visuales que
estén totalmente entro del límite de destino.
// Return the result of the hit test to the callback.
public HitTestResultBehavior MyHitTestResultCallback(HitTestResult result)
{
// Retrieve the results of the hit test.
IntersectionDetail intersectionDetail = ((GeometryHitTestResult)result).IntersectionDetail;
switch (intersectionDetail)
{
case IntersectionDetail.FullyContains:
// Add the hit test result to the list that will be processed after the enumeration.
hitResultsList.Add(result.VisualHit);
return HitTestResultBehavior.Continue;
case IntersectionDetail.Intersects:
case IntersectionDetail.FullyInside:
default:
return HitTestResultBehavior.Stop;
}
}
' Add the hit test result to the list that will be processed after the enumeration.
hitResultsList.Add(result.VisualHit)
Return HitTestResultBehavior.Continue
Case IntersectionDetail.Intersects
Case IntersectionDetail.FullyInside
Case Else
Return HitTestResultBehavior.Stop
End Select
End Function
NOTE
No HitTestResult se debe llamar a la devolución de llamada cuando el Emptydetalle de la intersección es.
Vea también
Realizar pruebas de posicionamiento en la capa visual
Geometría de una prueba de posicionamiento en un objeto Visual
Cómo: Realizar pruebas de posicionamiento
mediante un contenedor host Win32
20/02/2020 • 4 minutes to read • Edit Online
Puede crear objetos visuales en una ventana de Win32 proporcionando un contenedor de ventana host para los
objetos visuales. Para proporcionar control de eventos para los objetos visuales contenidos, proceso los mensajes
que se pasan al bucle de filtro de mensajes del contenedor de la ventana del host. Consulte Tutorial: hospedar
objetos visuales en una aplicación Win32 para obtener más información sobre cómo hospedar objetos visuales en
una ventana de Win32.
Ejemplo
En el código siguiente se muestra cómo configurar los controladores de eventos del mouse para una ventana de
Win32 que se usa como contenedor host para objetos visuales.
return IntPtr.Zero;
}
Friend Shared Function ApplicationMessageFilter(ByVal hwnd As IntPtr, ByVal message As Integer, ByVal wParam
As IntPtr, ByVal lParam As IntPtr, ByRef handled As Boolean) As IntPtr
' Handle messages passed to the visual.
Select Case message
' Handle the left and right mouse button up messages.
Case WM_LBUTTONUP, WM_RBUTTONUP
Dim pt As New System.Windows.Point()
pt.X = CUInt(lParam) And CUInt(&HFFFF) ' LOWORD = x
pt.Y = CUInt(lParam) >> 16 ' HIWORD = y
MyShape.OnHitTest(pt, message)
End Select
Return IntPtr.Zero
End Function
En el ejemplo siguiente se muestra cómo configurar una prueba de posicionamiento en respuesta a la captura de
eventos de mouse concretos.
// Respond to WM_LBUTTONUP or WM_RBUTTONUP messages by determining which visual object was clicked.
public static void OnHitTest(System.Windows.Point pt, int msg)
{
// Clear the contents of the list used for hit test results.
hitResultsList.Clear();
// Determine whether to change the color of the circle or to delete the shape.
if (msg == WM_LBUTTONUP)
{
MyWindow.changeColor = true;
}
if (msg == WM_RBUTTONUP)
{
MyWindow.changeColor = false;
}
' Respond to WM_LBUTTONUP or WM_RBUTTONUP messages by determining which visual object was clicked.
Public Shared Sub OnHitTest(ByVal pt As System.Windows.Point, ByVal msg As Integer)
' Clear the contents of the list used for hit test results.
hitResultsList.Clear()
' Determine whether to change the color of the circle or to delete the shape.
If msg = WM_LBUTTONUP Then
MyWindow.changeColor = True
End If
If msg = WM_RBUTTONUP Then
MyWindow.changeColor = False
End If
El objeto HwndSource presenta Windows Presentation Foundation (WPF ) contenido dentro de una ventana de
Win32. El valor de la propiedad RootVisual del objeto HwndSource representa el nodo de nivel superior de la
jerarquía de árbol visual.
Para obtener el ejemplo completo de los objetos de prueba de posicionamiento mediante un contenedor host de
Win32, vea prueba de posicionamiento con el ejemplo de interoperación de Win32.
Consulte también
HwndSource
Realizar pruebas de posicionamiento en la capa visual
Tutorial: Hospedar objetos visuales en una aplicación Win32
Procedimiento Representar un intervalo para cada
fotograma mediante CompositionTarget
23/10/2019 • 6 minutes to read • Edit Online
El motor de animación WPF proporciona muchas características para crear animaciones basadas en fotogramas.
Sin embargo, hay escenarios de aplicación en el los que necesita un control específico sobre la representación
según el fotograma. El CompositionTarget objeto proporciona la capacidad de crear animaciones personalizadas
basadas en una devolución de llamada por fotograma.
CompositionTargetes una clase estática que representa la superficie de presentación en la que se dibuja la
aplicación. El Rendering evento se desencadena cada vez que se dibuja la escena de la aplicación. La velocidad de
los fotogramas de representación es el número de veces que se dibuja la escena por segundo.
NOTE
Para obtener un ejemplo de código CompositionTargetcompleto con, vea usar el ejemplo de CompositionTarget.
Ejemplo
El Rendering evento se desencadena durante WPF el proceso de representación. En el ejemplo siguiente se
muestra cómo registrar EventHandler un delegado en el Rendering método estático CompositionTargeten.
// Add an event handler to update canvas background color just before it is rendered.
CompositionTarget.Rendering += UpdateColor;
' Add an event handler to update canvas background color just before it is rendered.
AddHandler CompositionTarget.Rendering, AddressOf UpdateColor
Puede utilizar el método de controlador de eventos de representación para crear contenido de dibujo
personalizado. Se llama a este método de control de eventos una vez por cada fotograma. Cada vez que WPF
serializa los datos de representación conservados en el árbol visual hasta el gráfico de escena de composición, se
llama a este método de control de eventos. Además, si los cambios en el árbol visual fuerzan actualizaciones en el
gráfico de escena de composición, también se llama al método de controlador de eventos. Observe que se llama a
su método de controlador de eventos después de calcular el diseño. Sin embargo, puede modificar el diseño en su
método de controlador de eventos, lo que significa que el diseño se calcula una vez más antes de su
representación.
En el ejemplo siguiente se muestra cómo puede proporcionar un dibujo personalizado CompositionTarget en un
método de control de eventos. En este caso, el color de fondo de Canvas se dibuja con un valor de color basado en
la posición de la coordenada del mouse. Si mueve el mouse dentro de Canvas, cambia el color de fondo. Además,
se calcula la velocidad de fotogramas media, según el tiempo transcurrido actual y el número total de fotogramas
representados.
// Called just before frame is rendered to allow custom drawing.
protected void UpdateColor(object sender, EventArgs e)
{
if (_frameCounter++ == 0)
{
// Starting timing.
_stopwatch.Start();
}
// Update the background of the canvas by converting MouseMove info to RGB info.
byte redColor = (byte)(_pt.X / 3.0);
byte blueColor = (byte)(_pt.Y / 2.0);
myCanvas.Background = new SolidColorBrush(Color.FromRgb(redColor, 0x0, blueColor));
}
If _frameCounter = 0 Then
' Starting timing.
_stopwatch.Start()
End If
_frameCounter = _frameCounter + 1
' Update the background of the canvas by converting MouseMove info to RGB info.
Dim redColor As Byte = CByte(_pt.X / 3.0)
Dim blueColor As Byte = CByte(_pt.Y / 2.0)
myCanvas.Background = New SolidColorBrush(Color.FromRgb(redColor, &H0, blueColor))
End Sub
Es posible que descubra que el dibujo personalizado se ejecuta a distintas velocidades en equipos diferentes. Esto
es porque el dibujo personalizado no depende de la velocidad de los fotogramas. En función del sistema que se
esté ejecutando y de la carga de trabajo de ese Rendering sistema, el evento se puede llamar un número diferente
de veces por segundo. Para información sobre el establecimiento de una capacidad de hardware gráfico y el
rendimiento de un dispositivo que ejecute una aplicación WPF, vea Niveles de representación de gráficos.
La adición o eliminación de un EventHandler delegado de representación mientras se activa el evento se retrasará
hasta que finalice la activación del evento. Esto es coherente con la MulticastDelegateforma en que se administran
los eventos basados en en Common Language Runtime (CLR ). Tenga en cuenta que no se garantiza que los
eventos de representación se llamen en un orden determinado. Si tiene varios EventHandler delegados que
dependen de un orden determinado, debe registrar un solo Rendering evento y multiplexar los delegados en el
orden correcto.
Vea también
CompositionTarget
Información general sobre la representación de gráficos en WPF