Novedades de WPF versión 4.5

Este tema contiene información sobre las características nuevas y mejoradas de Windows Presentation Foundation (WPF) versión 4.5.

Este tema contiene las siguientes secciones:

Control Ribbon

WPF 4.5 se distribuye con un control Ribbon que hospeda una barra de herramientas de acceso rápido, un menú de la aplicación y pestañas. Para más información, consulte Información general sobre la cinta.

Rendimiento mejorado al mostrar grandes conjuntos de datos agrupados

La virtualización de la interfaz de usuario (UI) se produce cuando un subconjunto de sus elementos se generan a partir de un mayor número de elementos de datos en función de qué elementos estén visibles en la pantalla. VirtualizingPanel define la propiedad adjunta IsVirtualizingWhenGrouping que permite la virtualización de la UI para datos agrupados. Para más información acerca del agrupamiento de datos, consulte Cómo: Ordenar y agrupar datos mediante una vista en XAML. Para obtener más información sobre la virtualización de datos agrupados, consulte la propiedad adjunta IsVirtualizingWhenGrouping.

Nuevas características para VirtualizingPanel

  1. Puede especificar si un elemento VirtualizingPanel, como VirtualizingStackPanel, muestra elementos parciales mediante la propiedad adjunta ScrollUnit. Si ScrollUnit se establece en Item, el elemento VirtualizingPanel solo mostrará elementos que sean completamente visibles. Si ScrollUnit se establece en Pixel, VirtualizingPanel puede mostrar elementos parcialmente visibles.

  2. Puede especificar el tamaño de la caché antes y después de la ventanilla, cuando VirtualizingPanel virtualiza mediante la propiedad adjunta CacheLength. La memoria caché es la cantidad de espacio encima o debajo de la ventanilla en el que no se virtualizarán elementos. Usar una memoria caché para evitar que se generen elementos de UI a medida que van apareciendo por desplazamiento puede mejorar el rendimiento. La memoria caché se rellena con menor prioridad para que la aplicación no deje de responder durante la operación. La propiedad VirtualizingPanel.CacheLengthUnit determina la unidad de medida que usa VirtualizingPanel.CacheLength.

Enlace a propiedades estáticas

Puede usar propiedades estáticas como origen de un enlace de datos. El motor de enlace de datos reconoce cuándo cambia el valor de la propiedad si se genera un evento estático. Por ejemplo, si la clase SomeClass define una propiedad estática denominada MyProperty, SomeClass puede definir un evento estático que se genera cuando el valor de MyProperty cambia. El evento estático puede utilizar cualquiera de las siguientes firmas.

  • public static event EventHandler MyPropertyChanged;

  • public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

Tenga en cuenta que, en el primer caso, la clase expone un evento estático denominado PropertyNameChanged que pasa EventArgs al controlador de eventos. En el segundo caso, la clase expone un evento estático denominado StaticPropertyChanged que pasa PropertyChangedEventArgs al controlador de eventos. Una clase que implementa la propiedad estática puede elegir generar notificaciones de cambio de propiedad mediante cualquiera de estos métodos.

Acceso a colecciones en subprocesos que no son de la interfaz de usuario

WPF permite acceder a colecciones de datos en subprocesos distintos del que creó la colección y modificarlas. Esto le permite usar un subproceso en segundo plano para recibir datos de un origen externo, como una base de datos, y mostrar los datos en el subproceso de interfaz de usuario. Si usa otro subproceso para modificar la colección, la interfaz de usuario sigue respondiendo a la interacción del usuario.

Validación sincrónica y asincrónica de datos

La interfaz INotifyDataErrorInfo permite que las clases de entidad de datos implementen reglas de validación personalizadas y expongan los resultados de la validación de forma asincrónica. Además, esta interfaz admite objetos de error personalizados, varios errores por propiedad, errores entre propiedades y errores de nivel de entidad. Para obtener más información, vea INotifyDataErrorInfo.

Actualización automática del origen de un enlace de datos

Si utiliza un enlace de datos para actualizar un origen de datos, puede usar la propiedad Delay para especificar el intervalo de tiempo que pasará después de que la propiedad cambie en el destino y antes de las actualizaciones del origen. Por ejemplo, supongamos que tiene un elemento Slider que tiene sus datos de la propiedad Value enlazados bidireccionalmente a una propiedad de un objeto de datos y que la propiedad UpdateSourceTrigger está establecida en PropertyChanged. En este ejemplo, cuando el usuario mueve Slider, el origen se actualiza para cada píxel que Slider mueve. El objeto de origen normalmente necesita el valor del control deslizante solo cuando el elemento Value del control deslizante deja de cambiar. Para impedir que se actualice el origen con demasiada frecuencia, utilice Delay para especificar que el origen no se debería actualizar hasta que transcurra cierto tiempo una vez que el control deje de moverse.

Enlace a tipos que implementan ICustomTypeProvider

WPF admite el enlace de datos a objetos que implementen ICustomTypeProvider, también conocidos como tipos personalizados. Puede utilizar tipos personalizados en los casos siguientes.

  1. Como PropertyPath en un enlace de datos. Por ejemplo, la propiedad Path de Binding puede hacer referencia a una propiedad de un tipo personalizado.

  2. Como el valor de la propiedad DataType.

  3. Como un tipo que determina las columnas generadas automáticamente en un elemento DataGrid.

Recuperación de información sobre el enlace de datos de una expresión de enlace

En determinados casos, puede que obtenga el elemento BindingExpression de Binding y necesite información sobre los objetos de origen y de destino del enlace. Se agregaron nuevas API para permitirle obtener el objeto de origen o destino, o la propiedad asociada. Cuando haya una instancia de BindingExpression, utilice las siguientes API para obtener información sobre el origen y de destino.

Para encontrar este valor del enlace Utilice esta API
Objeto de destino BindingExpressionBase.Target
Propiedad de destino BindingExpressionBase.TargetProperty
Objeto de origen BindingExpression.ResolvedSource
Propiedad de origen BindingExpression.ResolvedSourcePropertyName
Si BindingExpression pertenece a un elemento BindingGroup BindingExpressionBase.BindingGroup
El propietario de BindingGroup Owner

Búsqueda de un objeto DataContext válido

Hay casos en los que el elemento DataContext de un contenedor de elementos de ItemsControl se desconecta. Un contenedor de elementos es el elemento de interfaz de usuario que muestra un elemento dentro de una clase ItemsControl. Cuando ItemsControl posee un enlace de datos a una colección, se genera un contenedor de elementos para cada elemento. En algunos casos, los contenedores de elementos se quitan del árbol visual. Dos casos típicos en que se quita un contenedor de elementos son cuando se quita un elemento de la colección subyacente y cuando la virtualización está habilitada en ItemsControl. En estos casos, la propiedad DataContext del contenedor de elementos se establecerá en el objeto centinela devuelto por la propiedad estática BindingOperations.DisconnectedSource. Debe comprobar si DataContext es igual al objeto DisconnectedSource antes de acceder al elemento DataContext de un contenedor de elementos.

Reposición de los datos a medida que cambian sus valores (modelado dinámico)

Una colección de datos se puede agrupar, ordenar o filtrar. WPF 4.5 permite que los datos se reorganicen cuando se modifican los datos. Por ejemplo, suponga que una aplicación utiliza un elemento DataGrid para generar una lista de acciones en una bolsa, las cuales se ordenan en función de su valor. Si se habilita la ordenación dinámica en CollectionView para las acciones, la posición de una acción en el elemento DataGrid se desplaza cuando el valor de la acción es mayor o menor que el de otra acción. Para obtener más información, consulte la interfaz ICollectionViewLiveShaping.

Compatibilidad mejorada para establecer una referencia débil a un evento

Ahora es más fácil implementar el patrón de evento débil, ya que los suscriptores a eventos pueden participar en él sin necesidad de implementar una interfaz adicional. La clase genérica WeakEventManager también permite que los suscriptores participen en el patrón de evento débil si no existe una clase WeakEventManager dedicada para un determinado evento. Para más información, consulte Patrones de evento débil.

Nuevos métodos para la clase Dispatcher

La clase Dispatcher define nuevos métodos para operaciones sincrónicas y asincrónicas. El método Invoke sincrónico define sobrecargas que toman un parámetro Action o Func<TResult>. El nuevo método asincrónico, InvokeAsync, también toma Action o Func<TResult> como parámetro de devolución de llamada y devuelve DispatcherOperation o DispatcherOperation<TResult>. Las clases DispatcherOperation y DispatcherOperation<TResult> definen una propiedad Task. Al llamar a InvokeAsync, puede usar la palabra clave await con la operación DispatcherOperation o la tarea asociada Task. Si es necesario esperar de forma sincrónica la tarea Task devuelta por DispatcherOperation o DispatcherOperation<TResult>, llame al método de extensión DispatcherOperationWait. La llamada a Task.Wait resultará en un interbloqueo si la operación se pone en cola en un subproceso de llamada. Para obtener más información sobre el uso de Task para realizar operaciones asincrónicas, consulte Paralelismo de tareas (biblioteca TPL).

Extensiones de marcado para eventos

WPF 4.5 admite extensiones de marcado para eventos. Aunque WPF no define ninguna extensión de marcado que se use para eventos, los terceros pueden crear una extensión de marcado que se puede utilizar con eventos.

Vea también