Tiempo de Diseño Implementación de características de Silverlight Toolkit
Introducción
Este es el segundo post de mi serie de Silverlight en tiempo de diseño Características. El primer puesto Características de diseño en Silverlight Toolkit Tiempo mostró tiempo características de diseño de Silverlight Toolkit controles. Este artículo explica cómo se implementa. Espero que este post puede ayudar a explicar nuestro código fuente, lo que demuestra cómo implementar las características de diseño de tiempo para Silverlight, y proporcionar un marco y los lectores de código fuente puede ser utilizado directamente en sus propios proyectos.
Información general
Descargar "Silverlight Toolkit - Binarios, muestras, documentación, pruebas unitarias y Fuentes" de diciembre 2008 la liberación , abra SourceSilverlight.Controls.sln en Visual Studio, y veremos que hay 12 proyectos de diseño bajo la carpeta de solución de diseño, tres para cada control asamblea.
Tome Control de Proyectos, por ejemplo, hay tres proyectos de diseño:
- Controls.Design: construye Windows.Controls.Design.dll, que contiene el tiempo de diseño características compartidas por ambos de Visual Studio y Expression Blend.
- Controls.Expression.Design: construye Windows.Controls.Expression.Design.dll, que contiene las características de diseño de Expression Blend tiempo solamente.
- Controls.VisualStudio.Design: construye Windows.Controls.VisualStudio.Design.dll, que contiene las características de diseño de Visual Studio tiempo solamente.
También hay una carpeta Design.Common que contiene dos archivos: Extensions.cs y MetadataBase.cs, que son compartidas por todos los proyectos de diseño.
Es muy recomendable que lea el blog de Angel Justin post Silverlight Diseño extensibilidad Tiempo : proporciona buena formación / información general sobre el diseño de extensibilidad tiempo Silverlight, basada en que es inferior a la ejecución.
Proyecto
Todos los proyectos de diseño de 12 seguir las pautas de ejecución misma, así que sólo usará proyecto Control.Design para explicar a todos.
Silverlight.Controls.sln Carga en Origen de directorio en Visual Studio por primera vez, veremos la pantalla como a continuación:
- Controls.Design tiene una dependencia proyecto sobre Control de Proyectos. Esta dependencia se asegura de que los controles del proyecto se construye en primer lugar, y Controls.Design tiene una referencia a la reunión Microsoft.Windows.Controls construido por Control de Proyectos. Una asamblea en tiempo de diseño siempre hace referencia a la asamblea el tiempo de ejecución que proporciona características de tiempo de diseño para.
- referencias Controls.Design Microsoft.Windows.Design y asambleas Microsoft.Windows.Design.Extensibility, los cuales están bajo PublicAssemblies directorio%% DevEnvDir (c: Programa FilesMicrosoft Visual Studio 9.0Common7IDEPublicAssemblies en mi computadora portátil). Una asamblea en tiempo de diseño a menudo referencias esas dos asambleas, que constituyen el marco de extensibilidad de diseño. Una asamblea en tiempo de diseño siempre hace referencia también el montaje del sistema, que contiene espacio de nombres System.ComponentModel, donde muchos de los atributos de metadatos (como CategoryAttribute, DescriptionAttribute) se definen.
- referencias Controls.Design System.Windows montaje. Podemos ver la referencia en Controls.Design.csproj también:
<Número Include="System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, processorArchitecture=MSIL">
<SpecificVersion> False </> SpecificVersion
<HintPath> BinariesSystem.Windows.dll .. </> HintPath
<Private> False </> Privada
</> ReferenciaTenga en cuenta:
- Control.Design es un proyecto de biblioteca de clases de Windows, no un proyecto de Silverlight, y la generada Microsoft.Windows.Controls.Design.dll es uno. NET se ejecutan en el interior de escritorio diseñadores como Visual Studio o Expression Blend, no un conjunto de Silverlight se ejecutan dentro de un navegador, a pesar de que es la asamblea Microsoft.Windows.Controls.Design.dll tiempo de diseño para el largo tiempo de montaje Microsoft.Windows.Controls.dll Silverlight.
- El montaje se hace referencia System.Windows es en realidad un conjunto de Silverlight (versión 2.0.5.0). Asamblea System.Windows puede no ser necesaria en todos los proyectos de diseño para los controles de Silverlight. Lo necesitamos aquí en su mayoría debido a la <T> GetMemberName (Expression <Func. <T, object> expr>) Extension.cs método en que vamos a discutir más adelante en el puesto. La mezcla de. NET y Silverlight referencias crea todo tipo de temas interesantes, como veremos pronto.
pantalla de abajo muestra ildasm las referencias mixtas. NET y Silverlight asambleas por Microsoft.Windows.Controls.Design.dll:
- . 2:0:21024:1838 ver es el número de versión de Silverlight Toolkit versión 2008 de diciembre.
- . 3:5:0:0 ver es el número de versión. NET Framework 3.5.
- . 2:0:0:0 ver es el número de versión de Silverlight 2.0.
- Cuando se carga el primer proyecto en Visual Studio Controls.Design, hay un "El componente de referencia 'System.Windows" no se pudo encontrar "advertencia junto a la referencia de ensamblado System.Windows en la ventana de proyecto, y en la ventana Lista de errores también. Esto se debe a que es un Controls.Design NET. Lugar de Silverlight, y no sé dónde Silverlight está instalado (es en C: Program Silverlight2.0.31005.0 FilesMicrosoft en mi portátil, y en C: Archivos de programa (X86 ) Silverlight2.0.31005.0 Microsoft en el escritorio). La solución es tener un pre-construcción de comandos del evento .. CopySystemWindows.bat que las copias de System.Windows.dll instalar Silverlight dirección de binarios ... Así que una vez que se ha construido el proyecto, la advertencia va a desaparecer, como veremos en breve.
- En anteriores de Visual Studio de pantalla, no es otra señal de advertencia al lado de la viuda Microsoft.Windows.Controls.XML archivo en proyecto, cuando se carga Controls.Design proyecto en Visual Studio por primera vez. Este archivo se genera mediante la construcción de la persona a cargo del proyecto controles, ya que en Propiedades de Control de Proyectos de -> pestaña Crear, la opción "archivo de documentación XML" está marcada, y tiene un camino de ".. Binar
"IesMicrosoft.Windows.Controls.XML. Si usted construye Controls.Design proyecto, la advertencia va a desaparecer, como veremos en breve. - Controls.Design proyecto tiene un archivo Metadata.cs, y enlaces a Extension.cs y MetadataBase.cs en la carpeta Design.Common. Todos los 12 proyectos de diseño tienen los tres archivos. Vamos a hablar de ellos en más detalle más adelante.
Generar proyectos Controls.Design o la solución completa, podemos ver:
- Todos los proyectos construidos multa con 0 errores y advertencias 0.
- Los signos de advertencia junto a la referencia System.Windows y Microsoft.Windows.Controls.XML desaparecido archivo.
- El análisis de código del proceso de construcción tarda mucho tiempo, y genera dos advertencias. El primero, CA0060, es otro tema de las redes mixtas. NET y Silverlight y referencias de código en Extension.cs. Usted puede deshacerse de la advertencia copiando System.dll y System.Core.dll del directorio de instalación de Silverlight en el directorio SourceBinaries y la creación de nuevo.
MetadataBase.cs
MetadataBase.cs, junto con Metadata.cs, implementar un marco para el registro de metadatos en tiempo de diseño:
- DescriptionAttributes se generan automáticamente para las clases de control público (es decir, las subclases de FrameworkElement) y sus propiedades públicas de sus "/ / / <summary>" comentarios de documentación XML en código fuente. (Bueno comentar paga!
) - Para ocultar una clase de control de un diseñador, agregue una línea como a continuación al método AddAttributes Metadata.cs en el proyecto de disposición:
builder.AddCallback (typeof (TreeViewItem), b => b.AddCustomAttributes (nuevo ToolboxBrowsableAttribute (falso))); - Para registrar otros atributos personalizados para una clase de control, agregue un XxxMetadata.cs archivo al proyecto, como el ViewboxMetadata.cs discutirá más adelante.
Si te gusta el marco, puede utilizar MetadataBase.cs y Metadata.cs directamente en su propio proyecto, sujeto a la Licencia Pública Microsoft incluye al principio de todos nuestros archivos de código fuente.
MetadataBase.cs:
/ / (C) Copyright Microsoft Corporation. / / Esta fuente está sujeta a la licencia pública de Microsoft (Ms-PL). / / Por favor, consulte http://go.microsoft.com/fwlink/?LinkID=131993 para más detalles. / / Todos los demás derechos reservados. using System; utilizando System.Collections.Generic; utilizando System.ComponentModel; using System.Diagnostics; utilizando System.Diagnostics.CodeAnalysis; utilizando System.Globalization; using System.IO; utilizando System.Linq; utilizando System.Linq.Expressions; using System.Reflection; utilizando System.Windows; utilizando System.Xml.Linq; utilizando Microsoft.Windows.Design.Metadata; espacio de nombres Microsoft.Windows.Controls.Design.Common ( / / / <summary> / / / MetadataRegistration clase. / / / </ Summary> public class MetadataRegistrationBase ( / / / <summary> / / / Construcción de metadatos en tiempo de diseño la tabla de atributos. / / / </ Summary> / / / <returns> Tabla de atributos personalizados. </ Returns> protegidas virtual BuildAttributeTable AttributeTable () ( AttributeTableBuilder constructor = nueva AttributeTableBuilder (); AddDescriptions (constructor); AddAttributes (constructor); AddTables (constructor); builder.CreateTable retorno (); ) / / / <summary> / / / Buscar todas las subclases AttributeTableBuilder en la asamblea / / / Y añadir sus atributos a la tabla de atributos de montaje. / / / </ Summary> / / / Name="builder"> <PARAM El atributo assembly constructor de mesa. </ Param> , Justification = "Design time dll should not fail!" )] [SuppressMessage ("Microsoft.Design", "CA1031: DoNotCatchGeneralExceptionTypes", Justificación = "dll tiempo de diseño no debe fallar!")] AddTables privado void (constructor AttributeTableBuilder) ( ); Debug.Assert (constructor! = Null, "AddTables se llama con el parámetro null"); Asamblea asm = Assembly.GetExecutingAssembly (); asm.GetTypes()) foreach (t Escriba asm.GetTypes ()) ( (AttributeTableBuilder))) if (t.IsSubclassOf (typeof (AttributeTableBuilder))) ( intentar ( atb AttributeTableBuilder = (AttributeTableBuilder) Activator.CreateInstance (t); builder.AddTable (atb.CreateTable ()); ) catch (Exception e) ( .Format(CultureInfo.InvariantCulture, "Exception in AddTables method: {0}" , e)); Debug.Assert (falso, de cadena. Formato (CultureInfo.InvariantCulture, "Excepción en el método AddTables: (0)", e)); ) ) ) ) / / / <summary> / / / Obtiene o establece el nombre del recurso caso sensible de la incrustado archivo XML. / / / </ Summary> XmlResourceName cadena protegidas (conseguir; fijados;) / / / <summary> / / / Obtiene o establece el FullName de montaje para el montaje cualificado nombres de tipo. / / / </ Summary> AssemblyFullName cadena protegidas (conseguir; fijados;) / / / <summary> / / / Crear atributo descripción de vez xml archivo de ensamblado de ejecución. / / / </ Summary> / / / Name="builder"> <PARAM El atributo assembly constructor de mesa. </ Param> , Justification = "Design time dll should not fail." )] [SuppressMessage ("Microsoft.Design", "CA1031: DoNotCatchGeneralExceptionTypes", Justificación = "dll tiempo de diseño no debe fallar.")] vacío AddDescriptions privado (constructor AttributeTableBuilder) ( ); Debug.Assert (constructor! = Null, "AddDescriptions se llama con el parámetro null"); .IsNullOrEmpty(XmlResourceName) || if (cadena. IsNullOrEmpty (XmlResourceName) | | cadena. IsNullOrEmpty (AssemblyFullName)) ( de retorno; ) XDocument xdoc XDocument.Load = (new StreamReader ( Assembly.GetExecutingAssembly (). GetManifestResourceStream (XmlResourceName))); ) if (xdoc == null) ( de retorno; ) xdoc.Descendants( "member" )) foreach (miembro XElement en xdoc.Descendants ("miembro")) ( intentar ( )member.Attribute( "name" ); nombre de la cadena = (cadena) member.Attribute ("nombre"); , StringComparison.OrdinalIgnoreCase); isType bool = name.StartsWith ("T", StringComparison.OrdinalIgnoreCase); if (isType | | name.StartsWith ("P", StringComparison.OrdinalIgnoreCase)) ( lastDot int = name.Length; typeName cadena; if (isType) ( typeName name.Substring = (2); ) más ( lastDot name.LastIndexOf = ('.'); typeName name.Substring = (2, lastDot - 2); ) typeName + = AssemblyFullName; t = Tipo Type.GetType (typeName); && t.IsPublic && t.IsClass && if (t! = null & & & & t.IsPublic t.IsClass & & t.IsSubclassOf (typeof (FrameworkElement))) ( ).FirstOrDefault().Value; cadena desc = member.Descendants ("Resumen"). FirstOrDefault (). Value; desc = desc.Trim (); , desc.Split( new char [] { ' ' , 't' , 'n' }, StringSplitOptions.RemoveEmptyEntries)); desc = cadena. Join ("", desc.Split (nuevo char [] ('', 't', 'n'), StringSplitOptions.RemoveEmptyEntries)); if (isType) ( builder.AddCallback (t, b => b.AddCustomAttributes (nuevo DescriptionAttribute (desc))); ) más ( cadena = propName name.Substring (lastDot + 1); pi = PropertyInfo t.GetProperty (propName); MethodInfo millas; && (mi = pi.GetSetMethod()) != null && mi.IsPublic) if (pi! = null & & (mi = pi.GetSetMethod ())! = null & & mi.IsPublic) ( (T builder.AddCallback, b => b.AddCustomAttributes (propName, nuevos DescriptionAttribute (desc))); ) ) ) ) ) catch (Exception e) ( .Format(CultureInfo.InvariantCulture, "Exception in AddDescriptions method: {0}" , e)); Debug.Assert (falso, de cadena. Formato (CultureInfo.InvariantCulture, "Excepción en el método AddDescriptions: (0)", e)); ) ) ) / / / <summary> / / / Proporcionar un lugar para añadir atributos personalizados sin crear una subclase AttributeTableBuilder. / / / </ Summary> / / / Name="builder"> <PARAM El atributo assembly constructor de mesa. </ Param> protegidas virtual void AddAttributes (constructor AttributeTableBuilder) ( ) ) )
MetadataBase.cs implementa la clase MetadataRegistrationBase. Vamos a discutir algunos métodos de su clave:
AddDescriptions
Todos los proyectos tienen tiempo de ejecución de montaje "archivo de documentación XML" opción marcada, y con una trayectoria como ".. BinariesMicrosoft.Windows.Controls.XML", en Proyecto -> Propiedades -> separador Crear de la sección de salida. También puede encontrar el lugar en el. Csproj archivo como a continuación:
> ..BinariesMicrosoft.Windows.Controls.Design.XML </ DocumentationFile > <DocumentationFile> .. BinariesMicrosoft.Windows.Controls.Design.XML </ DocumentationFile>
A continuación se muestra un extracto de Microsoft.Windows.Controls.XML para mostrar lo que la documentación generada archivo XML se parece a:
version ="1.0" ? > <? Xml version = "1.0"?> > <Doc> > <> Montaje > Microsoft.Windows.Controls </ name > <> Nombre Microsoft.Windows.Controls </ name> > </ Assembly> > miembros <> name ="T:Microsoft.Windows.Controls.Viewbox" > Miembro <name = "T: Microsoft.Windows.Controls.Viewbox"> > <> Resumen Define un decorador de contenido que se puede estirar y escala de un solo niño a llenar el espacio disponible. > </ Summary> > Preview </ QualityBand > <QualityBand> <Preview /> QualityBand > </> Miembros name ="F:Microsoft.Windows.Controls.Viewbox.ChildElementName" > miembros <name = "F: Microsoft.Windows.Controls.Viewbox.ChildElementName"> > <> Resumen Nombre del elemento secundario en la plantilla por defecto negatoscopio. > </ Summary> > </> Miembros name ="M:Microsoft.Windows.Controls.Viewbox.IsValidStretchValue(System.Object)" > miembros <name = "M: Microsoft.Windows.Controls.Viewbox.IsValidStretchValue (System.Object)"> > <> Resumen Compruebe si el valor se pasa en un objeto de valor válido de enumeración Stretch. > </ Summary> name ="o" > The object typed value to be checked. </ param > param nombre de <= "o"> El objeto con tipo de valor que deben controlarse. </ param> > True if o is a valid Stretch enum value, false o/w. </ returns > <Devuelve> Verdadero si o es un valor válido de enumeración Stretch, o false / <w. / returns> > </> Miembros name ="P:Microsoft.Windows.Controls.Viewbox.Child" > miembro del nombre <= "P: Microsoft.Windows.Controls.Viewbox.Child"> > <> Resumen Obtiene o establece el elemento secundario de un negatoscopio. > </ Summary> > </> Miembros > </ Miembros> > </ Doc>
El atributo de nombre de cada elemento <member> sigue el patrón:
- "T: Microsoft.Windows.Controls.Viewbox": "T" indica que es un tipo, seguido por el nombre completo del tipo de;
- "F: Microsoft.Windows.Controls.Viewbox.ChildElementName": "F" indica que es un campo, seguido del nombre completo del campo;
- "M: Microsoft.Windows.Controls.Viewbox.IsValidStretchValue (System.Object)": "M" indica que es un método, seguido del nombre completo del método y los parámetros;
- "P: Microsoft.Windows.Controls.Viewbox.Child": "P" indica que es una propiedad, seguido del nombre completo de la propiedad;
Control.Design enlaces proyecto para el archivo Microsoft.Windows.Controls.XML como un recurso incrustado:
-
- Controls.Design.csproj:
Include ="..BinariesMicrosoft.Windows.Controls.XML" /> EmbeddedResource <Incluir = ".. BinariesMicrosoft.Windows.Controls.XML" />
AddDescriptions método analiza el incrustado archivo XML y genera DescriptionAttribute para las clases de control público y de sus propiedades públicas:
MetadataBase.cs: 134: builder.AddCallback (t, b => b.AddCustomAttributes (nuevo DescriptionAttribute (desc))); MetadataBase.cs: 143: builder.AddCallback (t, b => b.AddCustomAttributes (propName, nuevos DescriptionAttribute (desc)));
AddAttributes
AddAttributes es por lo general se reemplaza en Metadata.cs archivo para agregar un ToolboxBrowsableAttribute (falso) atributo personalizado para las clases de control que no debe aparecer en la cartera de un diseñador:
- si la clase de control deben ser ocultados de todos los diseñadores, agregar la ToolboxBrowsableAttribute (falso) atributo personalizado al proyecto Xxx.Design;
- si deben ser ocultados Visual Studio sólo, agregue el atributo personalizado para proyectar Xxx.VisualStudio.Design;
- si deben ser ocultados Expression Blend sólo, agregue el atributo personalizado para proyectar Xxx.Expression.Design;
A continuación se muestra la ejecución en AddAttributes Metadata.cs del proyecto Controls.VisualStudio.Design:
/ / / <summary> / / / Proporcionar un lugar para añadir atributos personalizados sin crear una subclase AttributeTableBuilder. / / / </ Summary> / / / Name="builder"> <PARAM El atributo assembly constructor de mesa. </ Param> protegidas reemplazar AddAttributes vacío (constructor AttributeTableBuilder) ( ToolboxBrowsableAttribute( false ))); builder.AddCallback (typeof (TreeViewItem), b => b.AddCustomAttributes (nuevo ToolboxBrowsableAttribute (falso))); )
AddTables
Para añadir otros atributos que ToolboxBrowsableAttribute (falso) para un tipo, agregar un archivo como XxxMetadata.cs ViewboxMetadata.cs a continuación para el proyecto de diseño apropiado:
ViewboxMetadata.cs:
/ / (C) Copyright Microsoft Corporation. / / Esta fuente está sujeta a la licencia pública de Microsoft (Ms-PL). / / Por favor, consulte http://go.microsoft.com/fwlink/?LinkID=131993 para más detalles. / / Todos los demás derechos reservados. utilizando System.ComponentModel; utilizando Microsoft.Windows.Controls.Design.Common; utilizando Microsoft.Windows.Design.Metadata; espacio de nombres Microsoft.Windows.Controls.Design ( / / / <summary> / / / Para registrar el tiempo de diseño de metadatos negatoscopio. / / / </ Summary> clase internas ViewboxMetadata: AttributeTableBuilder ( / / / <summary> / / / Para registrar el tiempo de diseño de metadatos negatoscopio. / / / </ Summary> ViewboxMetadata pública () : Base () ( AddCallback ( typeof (negatoscopio), b => ( )); b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (x => x.BorderThickness), los nuevos BrowsableAttribute (falso)); )); b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (x => x.BorderBrush), los nuevos BrowsableAttribute (falso)); )); b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (x => x.Background), los nuevos BrowsableAttribute (falso)); )); b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (x => x.Foreground), los nuevos BrowsableAttribute (falso)); b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (x => x.Child), los nuevos CategoryAttribute (Properties.Resources.CommonProperties)); b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (x => x.Stretch), los nuevos CategoryAttribute (Properties.Resources.CommonProperties)); b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (x => x.StretchDirection), los nuevos CategoryAttribute (Properties.Resources.CommonProperties)); )); ) ) )
- Se recomienda seguir la convención de nomenclatura aquí. Tome negatoscopio por ejemplo, el nombre del archivo es ViewboxMetadata.cs, y el nombre de clase es ViewboxMetadata.
- La clase debe heredar de metadatos AttributeTableBuilder.
- Puede agregar atributos personalizados en el constructor de la clase de metadatos:
- Puede utilizar la llamada de nuevo modelo (como en ViewboxMetada.cs arriba) o el modelo directo. El modelo de devolución de llamada es supuestamente más eficiente.
- ejemplo modelo directo:
AddCustomAttributes (
typeof (negatoscopio), / / tipo
"BorderThickness", / / Nombre de la propiedad
nuevo atributo [] (nueva BrowsableAttribute (false))); / / matriz de atributos personalizados
- ejemplo modelo directo:
- Para proporcionar el parámetro name para llamar AddCustomAttribute propiedad, puede utilizar el método Extensions.GetMemberName () como en ViewboxMetadata.cs (discutirá más sobre esto más adelante en el puesto) para conseguir el nombre de propiedad de una manera segura de tipo, o proporcionar el nombre de la propiedad directamente como cadena como "BorderThickness" en la aplicación por encima de modelo directo.
- Puede utilizar la llamada de nuevo modelo (como en ViewboxMetada.cs arriba) o el modelo directo. El modelo de devolución de llamada es supuestamente más eficiente.
El AddTables (constructor AttributeTableBuilder) método:
- enumera todas las subclases de AttributeTableBuilder en la asamblea de ejecución
- crea una instancia de cada subclase AttributeTableBuilder encuentran:
atb AttributeTableBuilder = (AttributeTableBuilder) Activator.CreateInstance (t);
- agregar la tabla de atributos de la clase encontró al constructor:
builder.AddTable (atb.CreateTable ());
Metadata.cs
Metadata.cs implementa la clase MetadataRegistration, que hereda de la clase MetadataRegistrationBase a cabo en MetadataBase.cs. También implementa IRegisterMetadata interfaz.
Metadata.cs:
/ / (C) Copyright Microsoft Corporation. / / Esta fuente está sujeta a la licencia pública de Microsoft (Ms-PL). / / Por favor, consulte http://go.microsoft.com/fwlink/?LinkID=131993 para más detalles. / / Todos los demás derechos reservados. using System.Reflection; utilizando Microsoft.Windows.Controls.Design.Common; utilizando Microsoft.Windows.Design.Metadata; espacio de nombres Microsoft.Windows.Controls.Design ( / / / <summary> / / / MetadataRegistration clase. / / / </ Summary> public class MetadataRegistration: MetadataRegistrationBase, IRegisterMetadata ( / / / <summary> / / / El tiempo de diseño de metadatos de registro de clases. / / / </ Summary> MetadataRegistration pública () : Base () ( AssemblyName asmName = typeof (negatoscopio). Assembly.GetName (); XmlResourceName asmName.Name = + ". Diseño." + + AsmName.Name ". XML" / / "Microsoft.Windows.Controls.Design.Microsoft.Windows.Controls.XML" AssemblyFullName = "," + asmName.FullName; ) / / / <summary> / / / Tomada de System.Windows.Controls.Toolbox.Design.MetadataRegistration: / / / Usar una bandera estática para garantizar metadatos se registra sólo uno. / / / </ Summary> private static bool _initialized; / / / <summary> / / / Llamado por instrumentos para registrar el tiempo de diseño de metadatos. / / / </ Summary> public void Registro () ( if (! _initialized) ( MetadataStore.AddAttributeTable (BuildAttributeTable ()); _initialized = true; ) ) / / / <summary> / / / Proporcionar un lugar para añadir atributos personalizados sin crear una subclase AttributeTableBuilder. / / / </ Summary> / / / Name="builder"> <PARAM El atributo assembly constructor de mesa. </ Param> protegidas reemplazar AddAttributes vacío (constructor AttributeTableBuilder) ( ) ) )
Vamos a discutir algunos de sus métodos principales:
MetadataRegistration
Este constructor inicializa dos campos fundamentales:
- XmlResourceName: nombre de recurso de la documentación incrustado archivo XML, utilizado por el método de MetadataRegistrationBase.AddDescriptions.
- AssemblyFullName: nombre completo del ensamblado en tiempo de ejecución de esta asamblea es para tiempo de diseño.
Es necesario sustituir la caja de visionado tipo con su propia clase si utiliza Metadata.cs en su proyecto de diseño propio.
Registro
Este es el único método de IRegisterMetadata interfaz. Añade la tabla de atributos personalizados, construido a partir de AddDescripions, AddAttributes y métodos AddTables descrito anteriormente, para almacenar metadatos diseñador:
MetadataStore.AddAttributeTable (BuildAttributeTable ());
Extensions.cs
Este archivo contiene la implementación de la extensión método <T> GetMemberName (Expression <Func. <T, object> expr>) que se utiliza para obtener el nombre de un miembro de un tipo de compilación con control del tiempo y de IntelliSense:
La idea fue propuesta originalmente por Jafar Husain (véase su entrada en el blog símbolos en C # 3.0 ), y después, mejoradas por Justin Angel . Es un buen truco para evitar errores, pero el inconveniente es que se tira en las referencias de Silverlight y asambleas en una pura de otra manera. NET. Aquí está la fuente completa:
Extensions.cs:
/ / (C) Copyright Microsoft Corporation. / / Esta fuente está sujeta a la licencia pública de Microsoft (Ms-PL). / / Por favor, consulte http://go.microsoft.com/fwlink/?LinkID=131993 para más detalles. / / Todos los demás derechos reservados. using System; utilizando System.Linq.Expressions; espacio de nombres Microsoft.Windows.Controls.Design.Common ( / / / <summary> / / / Este conjunto de métodos de extensión interno ofrecen soluciones generales y / / / Utilidades en un número lo suficientemente pequeño como para justificar la no extensión dedicada / / / Métodos de la clase. / / / </ Summary> Extensiones de clases interna estática ( / / / <summary> / / / Ayudante método para obtener nombre de usuario con el compilador de verificación a tiempo para evitar errores tipográficos. / / / </ Summary> / / / <typeparam Name="T"> La clase de los que contienen el miembro cuyo nombre se recupera. </> Typeparam / / / Name="expr"> <PARAM La expresión lambda por lo general en forma de o = o.member>. </ Param> / / / <returns> El nombre de la propiedad. </ Returns> >> expr) public static cadena GetMemberName <T> (Expression <Func. <T, object> expr>) ( Expresión corporal = ((LambdaExpression) expr). Consejo de Administración; memberExpression MemberExpression = cuerpo como MemberExpression; ) if (memberExpression == null) ( memberExpression = (MemberExpression) ((UnaryExpression) del cuerpo). Operando; ) memberExpression.Member.Name retorno; ) ) )
Conclusión
Este artículo describe la implementación de características en tiempo de diseño en el comunicado de diciembre 2008 de Silverlight Toolkit , e introdujo un marco sencillo para la aplicación de tiempo característica de diseño para los controles de Silverlight. Usted puede modelar la aplicación y volver a utilizar el marco de sus propios proyectos. El marco es aún muy primitiva, apoyando el registro de metadatos sólo, ya que eso es todo por ahora soporta mezcla. Voy a mirar en la mejora del marco y las características en tiempo de diseño para Silverlight Toolkit, como la adición en línea personalizada / extendido / editores de diálogo, los datos de tiempo de diseño, tiempo de diseño sólo los comportamientos, etc
Como he dicho en anteriores post Tiempo características de diseño en Silverlight Toolkit , el tiempo de experiencias de diseño para los controles son muy importantes. No sólo mejora la experiencia y la productividad de los desarrolladores que utilizan los controles con características de tiempo digna, sino que también mejora la experiencia de los usuarios finales, ya que más y más aplicaciones ofrecen a los usuarios una mayor flexibilidad en la personalización de la interfaz de usuario, como cambiar diseño arrastrando y colocando controles , o cambiar la configuración de un control, al igual que en un diseñador, si no es en tiempo de ejecución.








Comentarios Recientes