2010-07-22 3 views
17

Théoriquement, je pense pouvoir définir des styles et des couleurs dans un fichier xaml et l'affecter à un bouton .background dans C#. Mais comment je fais ça? Où dois-je mettre ma définition de LinearGradientBrush comme ceci:Comment définir et utiliser les ressources dans xaml pour qu'elles puissent être utilisées en C#

<LinearGradientBrush x:Key="BlaBrush"> 
       <GradientStop Offset="0" Color="Red"/> 
       <GradientStop Offset="1" Color="Green"/> 
</LinearGradientBrush> 

Juste mettre à divers endroits dans les résultats de fichier XAML de ma fenêtre dans divers messages d'erreur:/

Je trouve cette question ici sur stackoverflow: How to use a defined brush resource in XAML, from C# ce qui explique une partie de celui-ci, mais il semble savoir où faire la définition de pinceau.

J'ai également essayé d'ajouter le modèle wpf shinyblue.xaml à l'application et ajouté <ResourceDictionary Source="ShinyBlue.xaml"/> à l'application.resources dans app.xaml. Cela rend tous mes boutons bleus instantanément, mais quand même, les "choses" définies dans shinyblue.xaml comme NormalBrush n'est pas accessible depuis C# - au moins je ne sais pas comment.

Marc

+1

Je voudrais sélectionner tous vos messages comme réponses, mais je ne peux pas: D Merci pour toutes ces informations. Cela m'aide beaucoup. – marc40000

Répondre

17

Votre XAML ressemblerait à quelque chose comme ceci:

MainWindow.xaml

<Window x:Class="BrushResource.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 

<Window.Resources> 
    <LinearGradientBrush x:Key="BrushOne" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5"> 
     <LinearGradientBrush.GradientStops> 
      <GradientStopCollection> 
       <GradientStop Color="Black" Offset="0" /> 
       <GradientStop Color="Silver" Offset="1" /> 
      </GradientStopCollection> 
     </LinearGradientBrush.GradientStops> 
    </LinearGradientBrush> 

    <LinearGradientBrush x:Key="BrushTwo" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5"> 
     <LinearGradientBrush.GradientStops> 
      <GradientStopCollection> 
       <GradientStop Color="Maroon" Offset="0" /> 
       <GradientStop Color="Silver" Offset="1" /> 
      </GradientStopCollection> 
     </LinearGradientBrush.GradientStops> 
    </LinearGradientBrush> 
</Window.Resources> 

<StackPanel> 
    <Button Content="Button" Width="100" Click="myButton_Click"/> 
</StackPanel> 

Pour affecter la valeur, vous devez saisir le pinceau à dégradé des ressources comme celui-ci:

MainWindow.xaml.cs

private void myButton_Click(object sender, RoutedEventArgs e) 
    { 
     (sender as Button).Background = this.Resources["BrushOne"] as LinearGradientBrush; 
    } 
+0

Cela fonctionne également dans WinRT XAML. – dex3703

13

-les dans la collection Ressources d'un de vos éléments en XAML:

<Window ...> 
    <Window.Resources> 
     <LinearGradientBrush x:Key="BlaBrush"> 
      <GradientStop Offset="0" Color="Red"/> 
      <GradientStop Offset="1" Color="Green"/> 
     </LinearGradientBrush> 
     <!-- Other resources --> 
    </Window.Resources> 
    <!-- Contents of window --> 
</Window> 

ensuite les obtenir dans le code en utilisant FindResource

var blaBrush = this.FindResource("BlaBrush") as LinearGradientBrush; 

Voir Resources Overview pour plus d'informations .

7

Vous pouvez accéder aux ressources d'application comme

Application.Current.Resources["BlaBrush"] as LinearGradientBrush 

Ou, vous ajoutez la ressource aux ressources du contrôle et les accès comme écrit Quartermeister.

14

Notez que les réponses existantes parlent de mettre les ressources dans Window.Resources. Si vous souhaitez que les ressources soient disponibles à l'échelle de l'application, vous pouvez les placer dans App.xaml ou, mieux encore, créer des dictionnaires de ressources autonomes pouvant être inclus dans vos vues et réutilisés ailleurs (y compris d'autres projets)

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="DefaultStyles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
     <Style x:Key="my_style" /> 
    </ResourceDictionary> 
</UserControl.Resources> 
+0

Comment est-ce que je fais ça? Lorsque j'essaie d'ajouter plus d'une ligne à Application.Resources dans xaml, j'obtiens une erreur me disant qu'elle est déjà définie. Le mettre dans windows.resources est un peu similaire. Quand j'y ajoute mon propre fichier xaml, il oublie en quelque sorte les "choses" définies dans shinyblue.xaml? – marc40000

+0

@ marc40000: Voir mes modifications. –

Questions connexes