2011-03-30 2 views
3

Fondamentalement, comment puis-je créer mon propre jeu de couleurs dans une classe statique ou telle sorte que je puisse faire quelque chose comme ceci:Créez vos propres couleurs système

Ce qui existe:

<Setter ... Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 

ce que je veux:

<Setter ... Value="{DynamicResource {x:Static MyColors.Color1}}"/> 

Répondre

5

clés de ressources peut être quelque chose, vous pouvez utiliser un Color comme une clé et valeur à la en même temps:

public static class MyColors 
{ 
    static MyColors() 
    { 
     App.Current.Resources.Add(MyHighlightColorKey, MyHighlightColorKey); 
    } 

    public static readonly Color MyHighlightColorKey = Color.FromArgb(255, 0, 88, 0); 
} 

Le constructeur statique ajoute la couleur en utilisant lui-même comme une clé pour les ressources d'application.

(SystemColors utilise SystemResourceKeys en interne pour chaque couleur ou d'une brosse définie, vous avez pas accès à cette classe mais (ce qui est logique), vous pourriez aussi sous-classe ResourceKey si vous prenez problème avec l'aide de la valeur de sa propre clé)

vous pouvez l'utiliser comme ceci:

<TextBox> 
    <TextBox.Background> 
     <SolidColorBrush Color="{DynamicResource {x:Static local:MyColors.MyHighlightColorKey}}"/> 
    </TextBox.Background> 
</TextBox> 

Et si vous avez besoin de passer outre la clé au niveau local, vous pouvez le faire ainsi:

<Window.Resources> 
    <Color x:Key="{x:Static local:MyColors.MyHighlightColorKey}" A="255" R="255" G="0" B="0"/> 
</Window.Resources> 

Edit: Si vous avez beaucoup de couleurs, des pinceaux et ainsi de suite, vous pouvez également utiliser la réflexion pour faire la ressource enregistrement dans le constructeur (i utilisé les champs, si vous utilisez des propriétés pour exposer les données dont vous avez besoin pour ajuster cela légèrement):

static MyColors() 
{ 
    FieldInfo[] keyFieldInfoArray = typeof(MyColors).GetFields(); 
    foreach (var keyFieldInfo in keyFieldInfoArray) 
    { 
     object value = keyFieldInfo.GetValue(null); 
     App.Current.Resources.Add(value, value); 
    } 
} 
+0

C'est exactement ce que je me demandais. Merci beaucoup H.B.! – michael

+0

Heureux qui a aidé :) –

+0

Je suis un peu confus sur la partie où vous ajoutez la ressource en utilisant App.current.resources.add(). Qu'est-ce que cela fait réellement? Il semble que cette étape est inutile lors de l'accès à la couleur en utilisant {x: Static local: MyColors.MyHighlightColorKey} – redshift5

1

Vous pouvez le faire facilement. Vous devez définir la classe suivante:

public class MyColors 
{ 
    public static string Color1{ get{return "Color1Key";}} 
} 

et par exemple dans votre App.xaml vous:

<Application ...> 
    <Application.Resources> 
     <Color x:Key="Color1Key">#FF969696</Color> 
    </Application.Resources> 
</Application> 

que la chaîne statique est en fait juste pour le typage fort que je ne crée généralement pas une telle statique classe et il suffit d'utiliser tout ce que je touche Selon cette définition devient alors:

<Setter ... Value="{DynamicResource Color1Key}"/> 

(je crois que vous pouvez également utiliser le typage fort dans <Color x:Key="{x:Static MyColors.Color1}">#FF969696</Color> mais je ne suis pas sûr en ce moment ...)

(méfiez-vous aussi que pour l'utilisation x:Static vous devrez spécifier l'espace de noms où MyColors se repose donc cela devient {x:Static local:MyColors.Color1})

4

pensé que je chimerais avec une autre option. Vous pouvez utiliser une ressource statique à la place en procédant comme suit ...

public struct MyColors 
{ 
    public static Brush Color1 
    { 
     get { return Brushes.Red; } // or whatever you like 
    } 
    public static Brush Color2 
    { 
     get { return Brushes.Blue; } 
    } 
} 

Ensuite, dans votre XAML, utilisez:

"{x:Static local:MyColors.Color1}" 

Je viens de passer 10 minutes à essayer de le faire fonctionner avec une extension DynamicResource, mais je ne peux pas le faire. Si quelqu'un sait comment (ou pourquoi) alors laissez-nous savoir :)

+0

J'aime ça, c'est beaucoup plus simple. – BoltClock

+1

Pour l'utiliser comme ressource, vous devez l'ajouter à un dictionnaire de ressources, pour 'SystemColors' qui se passe dans les coulisses et ces ressources ne sont pas visibles au niveau de l'application. Voir ma réponse pour une approche de ressource. –

+0

@ H.B. Bonne réponse, merci :) – Tom

Questions connexes