web-dev-qa-db-fra.com

Comment définir et utiliser des ressources dans xaml afin qu'elles puissent être utilisées en C #

Théoriquement, je pense que je peux définir des pinceaux et des couleurs, etc. dans un fichier xaml et l'assigner à un button.background en c #. Mais comment je fais ça? Où dois-je mettre ma définition de brosse à gradient linéaire comme ceci:

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

Le simple fait de le placer à divers endroits dans le fichier xaml de ma fenêtre entraîne divers messages d'erreur: /

J'ai trouvé cette question ici sur stackoverflow: Comment utiliser une ressource de pinceau définie en XAML, à partir de C # qui en explique une partie, mais il semble savoir où faire la définition de Brush.

J'ai également essayé d'ajouter le modèle wpf shinyblue.xaml à l'application et j'ai ajouté <ResourceDictionary Source="ShinyBlue.xaml"/> aux applications.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 ne sont pas accessibles depuis C # - du moins je ne sais pas comment.

Marc

18
marc40000

Votre xaml ressemblerait à 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 attribuer la valeur, vous devez saisir le pinceau dégradé des ressources comme ceci:

MainWindow.xaml.cs

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

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 envisager de les mettre dans App.xaml ou mieux encore, créer des dictionnaires de ressources autonomes qui peuvent être inclus dans vos vues et réutilisés ailleurs (y compris dans d'autres projets)

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="DefaultStyles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <Style x:Key="my_style" />
    </ResourceDictionary>
</UserControl.Resources>
16
Brian Genisio

Mettez-les dans la collection Resources de l'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, obtenez-les dans le code en utilisant FindResource

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

Voir Présentation des ressources pour plus d'informations.

13
Quartermeister

Vous pouvez accéder aux ressources de l'application en tant que

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

Ou, vous ajoutez la ressource aux ressources du contrôle et y accédez comme l'a écrit Quartermeister.

8
Ozan