Compartir a través de


DesignModeValueProvider (Clase)

Captura los cambios de propiedades que realiza el usuario en el diseñador y proporciona nuevos valores en tiempo de diseño.

Jerarquía de herencia

System.Object
  Microsoft.Windows.Design.Features.FeatureProvider
    Microsoft.Windows.Design.Model.DesignModeValueProvider

Espacio de nombres:  Microsoft.Windows.Design.Model
Ensamblado:  Microsoft.Windows.Design.Interaction (en Microsoft.Windows.Design.Interaction.dll)

Sintaxis

'Declaración
Public Class DesignModeValueProvider _
    Inherits FeatureProvider
public class DesignModeValueProvider : FeatureProvider
public ref class DesignModeValueProvider : public FeatureProvider
type DesignModeValueProvider =  
    class
        inherit FeatureProvider
    end
public class DesignModeValueProvider extends FeatureProvider

El tipo DesignModeValueProvider expone los siguientes miembros.

Constructores

  Nombre Descripción
Método público DesignModeValueProvider Inicializa una nueva instancia de la clase DesignModeValueProvider.

Arriba

Propiedades

  Nombre Descripción
Propiedad pública Properties Obtiene el conjunto de propiedades que deben capturarse.

Arriba

Métodos

  Nombre Descripción
Método público Equals Determina si el objeto Object especificado es igual al objeto Object actual. (Se hereda de Object).
Método protegido Finalize Permite que un objeto intente liberar recursos y realizar otras operaciones de limpieza antes de ser reclamado por la recolección de elementos no utilizados. (Se hereda de Object).
Método público GetHashCode Actúa como función hash para un tipo concreto. (Se hereda de Object).
Método público GetType Obtiene el objeto Type de la instancia actual. (Se hereda de Object).
Método protegido InvalidateProperty Invalida la propiedad especificada.
Método protegido MemberwiseClone Crea una copia superficial del objeto Object actual. (Se hereda de Object).
Método público ToString Devuelve una cadena que representa el objeto actual. (Se hereda de Object).
Método público TranslatePropertyValue Captura los cambios de propiedad realizados por el usuario en el diseñador y usa lógica personalizada para proporcionar nuevos valores en tiempo de diseño.

Arriba

Comentarios

Cuando un usuario cambia un valor de propiedad de un objeto en el diseñador, ese valor se establece normalmente en el objeto en el diseñador. La clase DesignModeValueProvider le permite insertar su propia lógica en este proceso. Por ejemplo, supongamos que desea que el usuario pueda establecer la propiedad visible de un control en false, pero que el control siga estando visible en tiempo de diseño.

Para llevarlo a cabo, creará un DesignModeValueProvider y lo asociará al control personalizado. DesignModeValueProvider captura los cambios de propiedad realizados por el usuario, se inserta una lógica propia en el método TranslatePropertyValue y DesignModeValueProvider pasa los nuevos valores al diseñador.

Nota importanteImportante

Cuando se utiliza esta técnica, el comportamiento de una propiedad en el diseñador no coincide con el valor de la propiedad en la vista XAML. La vista XAML muestra el valor que el usuario especificó en tiempo de diseño. El valor en la vista XAML representa el comportamiento que muestra la propiedad en tiempo de ejecución.

Las siguientes restricciones se aplican al usar la clase DesignModeValueProvider para cambiar un valor de propiedad en tiempo de diseño.

  • Puede establecer solo un proveedor de valor en tiempo de diseño en los tipos que derivan de la clase DependencyObject.

  • Puede establecer solo un proveedor de valor en tiempo de diseño en propiedades de dependencia.

  • Su implementación DesignModeValueProvider debe establecer el valor en tiempo de diseño en una propiedad de tipo base. Puede implementar su proveedor de valor para tener como destino el tipo derivado concreto. Por ejemplo, para registrar un proveedor de valor para la propiedad Height de la clase Button, debe registrarlo en la clase FrameworkElement y probar el tipo de destino en la implementación del proveedor de valor. Para obtener más información, vea Tutorial: Cambiar el comportamiento de una propiedad en tiempo de diseño.

  • Los proveedores se ejecutan en el orden en el que se registran. En último lugar se ejecuta el proveedor de valores más reciente que se registra para una propiedad; sin embargo, se ejecutan todos los proveedores de valores.

  • Si la implementación TranslatePropertyValue de su proveedor de valor devuelve nullreferencia null (Nothing en Visual Basic), el valor en tiempo de diseño de la propiedad se establece en nullreferencia null (Nothing en Visual Basic).

  • Si la implementación TranslatePropertyValue de su proveedor de valor devuelve el valor estático UnsetValue, WPF Designer llama al método ClearValue en la propiedad.

Nota

Si está escribiendo un proveedor de valores para un control de Silverlight, debe usar la versión de WPF de UnsetValue. Se trata de una limitación del marco de WPF Designer.

  • Los proveedores de valor no funcionan con las propiedades heredadas de WPF. Por ejemplo, registrar un proveedor de valor para FlowDirection no funciona como se espera en modo de diseño.

  • Si un enlace establece el valor de propiedad, su proveedor de valor debe devolver Binding en lugar de un valor calculado.

  • Puede ser que algunos proveedores de valores no se acepten porque el diseñador puede necesitar obligar una propiedad a un valor en tiempo de diseño concreto para asegurar una experiencia de diseño determinada. Por ejemplo, un proveedor de valor personalizado para las propiedades de la fuente no funciona tal y como se espera en WPF Designer.

  • Al registrar un proveedor de valor usando TypeIdentifier, el identificador de tipo que se pasa a su implementación TranslatePropertyValue no puede ser igual que el que se especifica en los metadatos en tiempo de diseño. Será equivalente, pero es posible que no sea la misma instancia. Si su proveedor de valores realiza la comprobación de tipo, debe resolver el componente de tipo del identificador de propiedad y realizar una prueba de la equivalencia de tipo en el tipo resuelto. Normalmente, simplemente se comprueba el nombre de la propiedad, pero si debe realizar la lógica en el tipo, necesita resolver el identificador de tipo. Use el método ResolveType para obtener el tipo correcto.

  • El marco WPF Designer puede pasar un identificador de tipo en cualquiera de los diferentes formatos compatibles. Si su proveedor de valor realiza la comparación de tipo, debe resolver el identificador de tipo como un tipo real. Use el método ResolveType para obtener el tipo correcto.

Ejemplos

En el ejemplo siguiente crea un DesignModeValueProvider personalizado que se adjunta a un control de botón personalizado. En el método TranslatePropertyValue, cambie la propiedad Content de Button para que se muestre en mayúsculas en el diseñador. Puede cambiar también la propiedad Background de Button para que aparezca con el color predeterminado del sistema en el diseñador. Estos cambios sólo afectan al diseñador. En tiempo de ejecución, las propiedades Content y Background aparecen con los valores establecidos por el usuario.

Para obtener más información, vea Tutorial: Cambiar el comportamiento de una propiedad en tiempo de diseño.



Imports System
Imports System.Windows                  'SystemColors
Imports System.Windows.Media            'SolidColorBrush
Imports System.Windows.Controls         'Button
Imports Microsoft.Windows.Design.Model  'DesignModeValueProvider
Imports Microsoft.Windows.Design.Metadata


Namespace CustomButton

    Public Class CustomButtonDesignModeValueProvider
        Inherits DesignModeValueProvider


        Public Sub New()
            Properties.Add(GetType(Button), "Content")
            Properties.Add(GetType(Button), "Background")
        End Sub



        Public Overrides Function TranslatePropertyValue( _
            ByVal item As ModelItem, _
            ByVal identifier As PropertyIdentifier, _
            ByVal value As Object) As Object

            If identifier.DeclaringType Is GetType(Button) And _
               identifier.Name = "Content" Then

                Return value.ToString().ToUpper()
            End If

            If identifier.DeclaringType Is GetType(Button) And _
               identifier.Name = "Background" Then

                Return New SolidColorBrush(SystemColors.ControlColor)
            End If

            Return MyBase.TranslatePropertyValue(item, identifier, value)
        End Function
    End Class
End Namespace


using System;
using System.Windows;                   //SystemColors
using System.Windows.Media;             //SolidColorBrush
using System.Windows.Controls;          //Button
using Microsoft.Windows.Design.Model;
using Microsoft.Windows.Design.Metadata;   //DesignModeValueProvider
namespace CustomButton
{
    class CustomButtonDesignModeValueProvider : DesignModeValueProvider
    {

        public CustomButtonDesignModeValueProvider()
        {
            Properties.Add( typeof(Button), "Content");
            Properties.Add(typeof(Button), "Background");
        }


        public override object TranslatePropertyValue(ModelItem item, PropertyIdentifier identifier, object value)
        {
            if (identifier.DeclaringType == typeof( Button ) &&
                identifier.Name == "Content" )
            {
                return ((string)value).ToUpper();
            }

            if (identifier.DeclaringType == typeof(Button) &&
                identifier.Name == "Background")
            {
                return new SolidColorBrush(SystemColors.ControlColor);
            }

            return base.TranslatePropertyValue(item, identifier, value);
        }
    }
}

Seguridad para subprocesos

Todos los miembros static (Shared en Visual Basic) públicos de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Vea también

Referencia

Microsoft.Windows.Design.Model (Espacio de nombres)

Otros recursos

Cómo: Cambiar el comportamiento de una propiedad en tiempo de diseño

Arquitectura de extensibilidad de WPF Designer

Arquitectura de edición de propiedades

Proveedores de características y conectores de características