2009-07-31 145 views
27

私のxamlファイルで、私のC#コードに使用しているのと同じ条件付きコンパイルシンボルを使用する簡単な方法はありますか?XAML条件付きコンパイル

答えて

22

conditional compilation in XAMLのサポートがあります。 C#コードと同じではありません。そのトリックは、AlternateContentRequiresを使用して、何らかのフラグが付けられたものに対して、Ignorableと表示されます。こうすることで、条件に基づいて実際にxamlの一部を利用できなくし、オン/オフを切り替えることができます。

+8

リード、少なくともいくつかの関連するコード/情報を投稿してください。答えにはただのリンクしか含めるべきではありません。 – NullUserException

+0

私は同意します。リンクがどのように役立ったかを理解する問題がありました。 –

+0

リンクが壊れています。 –

1

Visual Studioでエラーが発生するにもかかわらず、他の解決策を試しましたが、コンパイルしても機能しますが、私にとってはソリューションはUIスレッドで多くの時間を費やすようです好きです。

私が代わりに実装した最良の解決策は、すべての条件付きロジックをコントロールのコードの背後に置くことでした。あなたの意図を言及していないので、これはあなたが探していたものかもしれません。

アプリケーションの色に条件付きコンパイルシンボルが影響したかったのですが、他の異なるスタイルやテンプレートでも同じ解決策を使うことができます。あるいは、通常のif-elseロジックで使用できますコンパイルシンボルの

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

このためのコードビハインドを手動でアプリケーションにMainStyle.xaml.csを置くことによって作成され、このようにそれを使用することができます注意することが重要

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

は、ということです私のXAMLコードからの未設定値のみを参照し、これもStaticResourceで動作しますが、コンストラクタは一度だけ呼び出されます。私は上書きする/リソースディクショナリメソッドの多くを使用しても動作すると思いますが、これは私の問題を解決したので、私は試していませんでした。