2009-07-31 7 views
27

Gibt es eine einfache Möglichkeit, das gleiche bedingte Kompilierungssymbol, das ich für meinen C# -Code verwende, in meinen xaml-Dateien zu verwenden?XAML bedingte Kompilierung

Antwort

22

Es gibt Unterstützung für conditional compilation in XAML. Es ist nicht dasselbe wie in C#, Code, obwohl. Der Trick besteht darin, AlternateContent mit Requires gegen etwas mit der Markierung Ignorable zu verwenden. Auf diese Weise können Sie tatsächlich Teile Ihres XAML aufgrund von Bedingungen nicht verfügbar haben und ein- oder ausschalten.

+8

Reed, können Sie bitte mindestens einige relevante Codes/Informationen posten? Antworten sollten nicht * nur * einen Link enthalten. – NullUserException

+0

Ich stimme zu. Ich hatte Probleme zu verstehen, wie der Link nützlich war. –

+0

Die Verbindung ist jetzt unterbrochen. –

1

Ich habe versucht, die andere erwähnte Lösung, und es kompiliert und funktioniert, auch wenn Visual Studio Ihnen viele Fehler gibt, und für mich scheint die Lösung eine Menge Zeit auf dem UIhread zu verwenden, die beide ich nicht Ich mag es nicht.

Die beste Lösung, die ich stattdessen implementierte, war, dass ich die gesamte bedingte Logik in den Code hinter dem Steuerelement legte. Da Sie Ihre Absicht nicht erwähnen, könnte dies das sein, was Sie gesucht haben.

Ich wollte, dass ein bedingtes Kompilierungssymbol Farben in meiner Anwendung beeinflusst, aber Sie können sich auch die gleiche Lösung für andere unterschiedliche Stile oder sogar Vorlagen vorstellen, oder dass diese stattdessen mit der üblichen if-else-Logik verwendet werden kann von Kompilierungssymbolen.

<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}" /> 

Der Code-behind für diese manuell, indem ein MainStyle.xaml.cs in Ihrer Anwendung erstellt werden kann und es wie folgt verwenden:

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 
     } 
    } 
} 

Wichtig zu beachten ist, dass wenn nur die nicht gesetzten Werte von meinem XAML-Code referenziert werden und dies auch für StaticResources funktioniert, obwohl der Konstruktor nur einmal aufgerufen wird. Ich denke, das Überschreiben/Verwenden von mehr Ressourcenwörterbüchern würde auch funktionieren, aber das hat mein Problem bereits gelöst, also habe ich es nicht versucht.

Verwandte Themen