que codeproject code c# xaml compilation conditional

c# - que - codeproject vs



CompilaciĆ³n condicional XAML (2)

Probé la otra solución mencionada, y compila y funciona, aunque Visual Studio le dará muchos errores, y para mí la solución parece usar mucho tiempo en el hilo de la interfaz de usuario, que no me gustan.

La mejor solución que implementé fue que puse toda la lógica condicional en el código detrás del control. Como no mencionas tu intención, esto podría ser lo que estabas buscando.

Quería que un símbolo de compilación condicional afectara a los colores en mi aplicación, pero también se puede imaginar la misma solución para otros estilos o incluso plantillas diferentes, o que se puede usar con la lógica if-else habitual en lugar de símbolos de compilación.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class ="MyApp.Style.MainStyle"> <!--Version1 --> <Color x:Key="AbMainColor">#068C00</Color> <Color x:Key="AbLighterMainColor">#5EBD50</Color> <Color x:Key="AbDarkerMainColor">DarkGreen</Color> <Color x:Key="MainColor" /> <Color x:Key="LighterMainColor" /> <Color x:Key="DarkerMainColor" /> <!-- Version2 --> <Color x:Key="OtherRedColor">#EF0000</Color> <Color x:Key="LighterRedColor">#e62621</Color> <Color x:Key="DarkerRedColor">#EF0000</Color> <SolidColorBrush x:Key="MainBrush" Color="{DynamicResource MainColor}" /> <SolidColorBrush x:Key="LighterMainBrush" Color="{DynamicResource LighterMainColor}" /> <SolidColorBrush x:Key="DarkerMainBrush" Color="{DynamicResource DarkerMainColor}" />

El código subyacente para esto se puede crear manualmente colocando un MainStyle.xaml.cs en su aplicación y utilícelo así:

using System.Windows; namespace MyApp.Style { partial class MainStyle : ResourceDictionary { public MainStyle() { InitializeComponent(); #if VERSION2 this["MainColor"] = this["OtherRedColor"]; this["LighterMainColor"] = this["LighterRedColor"]; this["DarkerMainColor"] = this["DarkerRedColor"]; #elif VERSION1 this["MainColor"] = this["AbMainColor"]; this["LighterMainColor"] = this["AbLighterMainColor"]; this["DarkerMainColor"] = this["AbDarkerMainColor"]; #endif } } }

Es importante tener en cuenta que si solo hace referencia a los valores no configurados de mi código XAML, y esto también funciona para StaticResource s, aunque solo se llama al constructor una vez. Supongo que sobrescribir / usar más métodos de diccionarios de recursos también funcionaría, pero esto ya resolvió mi problema, así que no lo intenté.

¿Hay alguna manera fácil de usar el mismo símbolo de compilación condicional que estoy usando para mi código c # en mis archivos xaml?


Existe algo de apoyo para la compilación condicional en XAML . Sin embargo, no es lo mismo que en el código C #. El truco es usar AlternateContent con Requires contra algo marcado como Ignorable . Al hacer esto, puede tener porciones de su xaml no disponibles en función de las condiciones, y activar o desactivar.