2012-01-04 11 views
42

necesito algo como esto para los estilos en XAML:¿XAML tiene una directiva de compilador condicional para el modo de depuración?

<Application.Resources> 

#if DEBUG 

    <Style TargetType="{x:Type ToolTip}"> 
     <Setter Property="FontFamily" Value="Arial"/> 
     <Setter Property="FlowDirection" Value="LeftToRight"/> 
    </Style> 
#else 
    <Style TargetType="{x:Type ToolTip}"> 
     <Setter Property="FontFamily" Value="Tahoma"/> 
     <Setter Property="FlowDirection" Value="RightToLeft"/> 
    </Style> 
#endif 

</Application.Resources> 
+2

¿Qué estás tratando de lograr? – tsells

+1

Necesito tener diferentes estilos en el modo de depuración, para poder realizar una ejecución más liviana en el modo de depuración. –

Respuesta

83

Hace poco tuve que hacer esto y me sorprendió lo simple que era cuando no podía encontrar fácilmente ejemplos claros. Lo que hice fue añadir lo siguiente a AssemblyInfo.cs:

#if DEBUG 
[assembly: XmlnsDefinition("debug-mode", "Namespace")] 
#endif 

A continuación, utilice la etiqueta AlternateContent del espacio de nombres de marcas-compatibilidad de elegir su contenido en función de la presense de esa definición de espacio de nombres:

<Window x:Class="Namespace.Class" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="debug-mode" 

     Width="400" Height="400"> 

     ... 

     <mc:AlternateContent> 
      <mc:Choice Requires="d"> 
       <Style TargetType="{x:Type ToolTip}"> 
        <Setter Property="FontFamily" Value="Arial"/> 
        <Setter Property="FlowDirection" Value="LeftToRight"/> 
       </Style> 
      </mc:Choice> 
      <mc:Fallback> 
       <Style TargetType="{x:Type ToolTip}"> 
        <Setter Property="FontFamily" Value="Tahoma"/> 
        <Setter Property="FlowDirection" Value="RightToLeft"/> 
       </Style> 
      </mc:Fallback> 
     </mc:AlternateContent> 

     ... 
</Window> 

Ahora , cuando se define DEBUG, también se definirá "debug-mode", y el espacio de nombres "d" estará presente. Esto hace que la etiqueta AlternateContent elija el primer bloque de código. Si DEBUG no está definido, se usará el bloque de código de respaldo.

Este código de ejemplo no se ha probado, pero es básicamente lo mismo que estoy usando en mi proyecto actual para mostrar de forma condicional algunos botones de depuración.

Vi una publicación de blog con un código de ejemplo que dependía de la etiqueta "Ignorable", pero parecía mucho menos claro y fácil de usar que este método.

+0

Esto es realmente genial y fácil. Y los recursos baml de la construcción RELEASE realmente no contienen artefactos de todo esto. Enriquecí algunos ToolTip-StackPanels con información de DEPURACIÓN adicional de esta manera. – springy76

+4

Al panel de error de VS no le gusta esto, aunque todo funciona como se esperaba: [link] (http://stackoverflow.com/questions/24459716/alternatecontent-tags-causing-issues-with-ide-but-not-compiler) – springy76

+0

Perfecto ... muy simple – electricalbah

2

Esto no es posible en WPF/Silverlight/WP7.

En una nota interesante, el documento de estándares, ISO/IEC 29500, explica cómo deben realizar esto en un documento XML, y XAML hace apoyar a uno de los elementos de esa especificación mc:Ignorable lo que nos permite hacer cosas como esta:

<Page xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:c="Comments" 
     mc:Ignorable="c"> 
    <Button Content="Some Text" 
      c:Content="Some other text" /> 
</Page> 

para comentar los atributos. Creo que sería fantástico si XAML un día admite el resto de las especificaciones que permiten la carga de contenido alternativo.

El atributo mc:Ignorable es utilizado por Blend para admitir la funcionalidad del tiempo de diseño.

+0

¿Qué tiene que ver la especificación de formato de archivo Open Office de MS OFfice con XAML? –

+0

Tanques, pero este problema no se ajusta a mi situación. –

+0

Nicholas, el equipo del analizador XAML (SL4, WP7.1, WPF) eligió usar esa especificación para resolver sus necesidades de ignorar atributos, en lugar de simplemente inventar algo. Es por eso que algunas de las páginas XAML predeterminadas tienen definido el espacio de nombre 'mc'. – JasonRShaver

Cuestiones relacionadas