XAML Compilation conditionnelle

Est-il un moyen facile d'utiliser la même compilation conditionnelle symbole que j'utilise pour mon code c#, dans mes fichiers xaml?

27
demandé sur Reed Copsey 2009-07-31 20:34:22

2 réponses

Il ya un certain soutien pour compilation conditionnelle en XAML. Ce n'est pas la même chose qu'en C#, mais en code. L'astuce est d'utiliser AlternateContentRequires contre quelque chose de marqué Ignorable. En faisant cela, vous pouvez effectivement avoir des portions de votre xaml indisponible en fonction des conditions, et allumez ou éteignez.

22
répondu Reed Copsey 2013-02-26 18:47:21

j'ai essayé l'autre solution mentionnée, et elle compile et fonctionne, même si Visual Studio va vous donner des tas d'erreurs, et pour moi la solution semble prendre beaucoup de temps sur le thread D'UI, les deux que je n'aime pas.

la meilleure solution que j'ai mise en place à la place était que j'ai mis toute la logique conditionnelle dans le code derrière le contrôle. Comme vous ne mentionnez pas votre intention, c'est peut-être ce que vous cherchiez.

je voulais une compilation conditionnelle le symbole affecte les couleurs dans mon application, mais vous pouvez également imaginer la même solution pour être utilisé pour d'autres styles différents ou même des gabarits, ou que cela peut être utilisé avec la logique habituelle si-else au lieu de symboles de compilation.

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

le code-behind pour cela peut être créé manuellement en plaçant un MainStyle.XAML.cs dans votre application et l'utiliser comme ceci:

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

il est Important de noter que si vous faites référence seulement aux valeurs non activées de mon code XAML, et que cela fonctionne aussi pour les StaticResource s, bien que le constructeur ne soit appelé qu'une fois. Je suppose que la réécriture / l'utilisation de plus de la ressource des méthodes de dictionnaires fonctionnerait aussi, mais cela a déjà résolu mon problème donc je n'ai pas essayé.

1
répondu Akku 2014-12-01 07:06:14