c# - ¿Se pueden usar las extensiones de marcado relacionadas con XAML 2009 en WPF?
.net markup-extensions (1)
Empezaré desde el final:
Why is there so much confusion regarding all of this?
Tal vez porque hasta ahora, incluida una versión de WPF 4.5, casi no hay soporte XAML 2009. Cita de estilo libre del libro de Matthew MacDonald WPF 4.5, Chapter 2
:
La mejora mínima de
XAML 2009
todavía no está completamente implementada. Solo admiten archivos no relacionados XAML, pero no el tipo de recurso de laPage
(recurso compilado), que se utiliza en todas partes. Probablemente,XAML 2009
nunca será una parte totalmente integrada de WPF, ya que las mejoras proporcionadas no son especialmente importantes y, dado que cualquier cambio en el compilador XAML genera problemas de seguridad y rendimiento.
Respecto al futuro de XAML 2009, entonces no podemos decir con seguridad cuándo lo apoyará completamente, pero sabemos que en este momento no existe.
Can these specific extensions be used in writing WPF applications? Are there any limitations in using them?
Sí, algunas extensiones pueden usarse en WPF 4.0 y WPF 4.5, por ejemplo: x:Array
y otros tipos, así como x:Reference
, x:FactoryMethod
. Personalmente uso tipos en XAML 2009 y no noté ningún error.
Acerca de x:Reference
puede decir, que en Visual Studio 2010
no funciona como debería: cuando se usa x:Reference
como destino de algunos Control
, el diseñador de Visual Studio lanza una excepción InvalidOperationException
con el mensaje:
Al proveedor de servicios le falta el servicio INameResolver.
El proyecto se compilará y ejecutará sin problemas, pero el lienzo de Design
donde aparece la x:Reference
se deshabilitará debido a la excepción. Personalmente, lo tengo a veces aparece, a veces no, pero debería ser ignorado.
Pero casi sé exactamente qué hay en la versión WPF 4.5 y quizás para Visual Studio más que en 2010 se ha solucionado este error. Para más información ver este link
.
Acerca de x:FactoryMethod
aquí también, no todo fue bien, para mí, en WPF 4.0, el programa VisualStudio 2010 no se compila con él. También se creó un informe de error en connect.microsoft.com
, pero los representantes de Microsoft dijeron que:
El equipo de WPF ha revisado recientemente este problema y no abordará este problema ya que en este momento el equipo se está enfocando en los errores que afectan al mayor número de desarrolladores de WPF. Si cree que esto se resolvió por error, vuelva a activar este error con los detalles de soporte necesarios.
Can XAML 2009 be used (in whole or in part) in WPF applications?
Una respuesta definitiva: se puede usar parcialmente, pero tal vez no para todas las versiones de WPF y Visual Studio.
Si su proyecto se planea en el futuro, se traslada a la versión WPF <4.0 o más adelante, o en otras plataformas, como Silverlight, Windows Phone, creo que es mejor evitar XAML 2009, porque no hay garantía de que lo serán. , al menos parcialmente soportado. Por ejemplo, en Silverlight
no hay soporte en XAML 2009, incluso XAML 2006 no es totalmente compatible. Es posible que una gran parte del proyecto dependa de XAML 2009, por lo que tenga que dedicar una cierta cantidad de tiempo y recursos para deshacerse de esta dependencia. En esta situación es mejor utilizar soluciones más universales.
Si está utilizando WPF 4.0 y superior, y no hay ningún plan para las otras plataformas, creo que en parte será posible usar XAML 2009, después de haberlo probado.
Para obtener más información, recomiendo familiarizarse con la notación de XAML 2009:
Estoy hablando de extensiones como x:Reference
y x:FactoryMethod
, que aparecen colectivamente here . Estoy leyendo mucha información contradictoria en línea, incluso en MSDN, Stackoverflow y de otras fuentes.
Hablaré sobre x:Reference
como ejemplo, pero en realidad también me refiero a las otras extensiones de marcado. Las principales causas de confusión son los siguientes extractos de MSDN:
XAML 2009 Language Support en WPF
En WPF, puede usar las características de XAML 2009, pero solo para XAML que no está compilado con marcado de WPF. XAML compilado de marcado y la forma BAML de XAML no son compatibles actualmente con las palabras clave y características del lenguaje XAML 2009. Tenga en cuenta que las técnicas existentes para cargar XAML suelto en WPF también tienen posibles restricciones de seguridad y acceso a los tipos CLR y al sistema de tipos que son más restrictivos que para XAML compilado con marcado. Para obtener más información, consulte Seguridad (WPF) o Estrategia de seguridad de WPF - Plataforma de seguridad. XAML 2009 también presenta características adicionales que modifican las construcciones anteriores de XAML 2006 o que modifican los formularios de marcado básicos.
x: Extensión de marca de referencia
x: Reference es una construcción definida en XAML 2009. En WPF, puede usar las características de XAML 2009, pero solo para XAML que no está compilada con marcado de WPF. XAML compilado de marcado y la forma BAML de XAML no son compatibles actualmente con las palabras clave y características del lenguaje XAML 2009.
Sin embargo, el siguiente párrafo aparece justo antes del párrafo anterior (es decir, el de x:Reference
).
En WPF y XAML 2006, las referencias a los elementos se tratan en la función a nivel de marco del enlace ElementName. Para la mayoría de las aplicaciones y escenarios de WPF, el enlace ElementName debe seguir utilizándose. Las excepciones a esta guía general pueden incluir casos en los que el contexto de los datos u otras consideraciones de alcance que hacen que el enlace de los datos sea poco práctico y donde la compilación de marcado no esté involucrada.
No hay una contradicción directa aquí, pero este párrafo parece decir que es posible usar x:Reference
en aplicaciones. Además, ese párrafo sobre x:Reference
parece generarse automáticamente y puede estar desactualizado.
Luego, tenemos el siguiente extracto del libro "WPF 4 Unleashed":
La extensión del marcado x: Reference a menudo se asocia erróneamente con las características de XAML2009 que solo se pueden usar desde XAML suelto en el momento de escribir esto. Aunque x: Reference es una nueva función en WPF 4, se puede usar desde XAML2006 bien siempre y cuando su proyecto tenga como objetivo la versión 4 o posterior de .NET Framework.
También tenemos las siguientes preguntas de Stackoverflow, algunas con respuestas contradictorias, y ninguna es obviamente correcta:
- ¿Cuál sería una alternativa a x: referencia?
- XAML 2009 - x: Referencia: ¿Hay algún inconveniente en usar esto?
- ¿Cuándo se resuelve x: Reference en WPF y por qué lo afecta el orden de los elementos XAML?
Finalmente, personalmente he usado la extensión x:Reference
y parece que funciona en aplicaciones WPF, diga lo que diga MSDN, aunque Visual Studio a veces se queja de cosas extrañas (o puede ser ReSharper), como excepciones de referencia nulas en el margen.
Llegando a las preguntas reales,
- ¿Se puede usar XAML 2009 (en todo o en parte) en las aplicaciones WPF?
- ¿Se pueden usar estas extensiones específicas para escribir aplicaciones WPF? ¿Existen limitaciones en su uso?
- ¿Por qué hay tanta confusión con respecto a todo esto?