2009-07-31 16 views

risposta

22

C'è un po 'di supporto per conditional compilation in XAML. Tuttavia, non è lo stesso di C#, il codice. Il trucco è usare AlternateContent con Requires contro qualcosa contrassegnato Ignorable. In questo modo, puoi effettivamente avere parti del tuo xaml non disponibili in base alle condizioni e attivare o disattivare.

+8

Reed, puoi pubblicare almeno qualche codice/informazioni rilevanti? Le risposte non dovrebbero contenere * solo * un link. – NullUserException

+0

Sono d'accordo. Ho avuto problemi a capire come il collegamento fosse utile. –

+0

Il link è ora rotto. –

1

Ho provato l'altra soluzione citata, e si compila e funziona, anche se Visual Studio ti darà un sacco di errori, e per me la soluzione sembra impiegare molto tempo sul thread dell'interfaccia utente, entrambi i quali non Mi piace

La soluzione migliore che ho implementato invece era che inserivo tutta la logica condizionale nel codice dietro al controllo. Poiché non menzioni la tua intenzione, potrebbe essere quello che stavi cercando.

Volevo che un simbolo di compilazione condizionale influenzi i colori nella mia applicazione, ma puoi anche immaginare la stessa soluzione da utilizzare per altri stili differenti o anche modelli, o che questo possa essere usato con la logica if-else al solito di simboli di compilazione.

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

Il code-behind per questo possono essere manualmente creato mettendo un MainStyle.xaml.cs nell'applicazione e usarlo in questo modo:

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

Importante da notare è che se si fa riferimento solo ai valori non impostati dal mio codice XAML e questo funziona anche per StaticResource s, sebbene il costruttore venga chiamato una volta sola. Immagino che sovrascrivere/usare più metodi dei dizionari delle risorse funzionerebbe, ma questo ha già risolto il mio problema, quindi non ci ho provato.

Problemi correlati