web-dev-qa-db-fra.com

Changer les styles à l'exécution dans WPF

J'essaie de permettre à l'utilisateur de personnaliser les éléments dans une application WPF. Ce que j'essaie de faire est que si j'ai une liste déroulante qui spécifie tous les éléments de formulaire (TextBox, label, etc.), l'utilisateur peut choisir un élément de formulaire et définir la propriété style Le premier plan de TextBox doit être en noir et ainsi de suite. Et selon ce que je veux appliquer, tous les TextBox devraient se ressembler.

Je ne suis pas en mesure de trouver un moyen d'y parvenir. J'ai essayé un exemple où plusieurs styles prédéfinis peuvent être téléchargés au moment de l'exécution. Alors maintenant, j'aimerais trouver un moyen de changer la propriété de différents éléments lors de l'exécution.

UPDATE:

J'ai essayé de créer un nouveau style à partir du code précédent.

XAML

<Label Content="SAMPLE" Style="{DynamicResource Style1}" x:Name="label1" />
<Button Content="Button" Click="Button_Click" />

et dans le code derrière, c’est-à-dire en cliquant sur le bouton, j’ai essayé ceci:

Style style = new Style { TargetType = typeof(Label) };
style.Setters.Add(new Setter(Control.ForegroundProperty, Brushes.Black));
Application.Current.Resources["Style1"] = style;

Mais cela ne se met pas à jour.

Merci.

16
ds345

Vous devez vous assurer que les styles sont dans le fichier App.xaml:

<Application x:Class="ChangeStyleHelp.App"
         xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">

    <Application.Resources>
        <Style x:Key="MyStyle" TargetType="{x:Type Label}">
            <Setter Property="Background" Value="Green" />
        </Style>
    </Application.Resources>
</Application>

Code derrière:

private void ChangeStyle_Click(object sender, RoutedEventArgs e)
{
    Style style = new Style 
    { 
        TargetType = typeof(Label) 
    };

    style.Setters.Add(new Setter(Label.BackgroundProperty, Brushes.Aquamarine));

    Application.Current.Resources["MyStyle"] = style;
}   

Si Style est dans la ressource Window (Window.Resources), vous devez écrire this ou le nom de Window:

private void ChangeStyle_Click(object sender, RoutedEventArgs e)
{
    Style style = new Style 
    { 
        TargetType = typeof(Label) 
    };

    style.Setters.Add(new Setter(Label.BackgroundProperty, Brushes.Aquamarine));

    this.Resources["MyStyle"] = style;
}   

De même, vous pouvez changer la Style de cette façon: prenez un style existant et utilisez l’élément. Exemple:

<Application x:Class="ChangeStyleHelp.App"
         xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">

    <Application.Resources>
        <Style x:Key="AnotherWayStyle" TargetType="{x:Type Label}">
            <Setter Property="Background" Value="Lavender" />
            <Setter Property="Foreground" Value="OrangeRed" />
        </Style>
    </Application.Resources>
</Application>  

Code derrière:

private void AnotherWay_Click(object sender, RoutedEventArgs e)
{
    label1.Style = (Style)Application.Current.Resources["AnotherWayStyle"];
}   
28
Anatoliy Nikolaev

Avez-vous essayé d'utiliser Dictionnaires de ressources  

Dictionnaire de ressources

<ResourceDictionary
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="TextColor" Color="#FF121212"/>
</ResourceDictionary>

XAML pour le contrôle

<TextBox Text="TextBox" Foreground="{DynamicResource TextColor}" />

Code pour changer les styles à l'exécution

     var rd = new ResourceDictionary();
     rd.Add("TextColor", "#FFFFFF");
     Application.Current.Resources.MergedDictionaries.Add(rd);

Cela fusionnera vos nouveaux styles avec les styles existants et le changement sera automatiquement répercuté sur tous les contrôles liés à ces styles.

6
Xero

cela a fonctionné pour moi comme un charme:

Xaml:

<TreeView x:Name="TreePeople">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="True" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView> 

c #:

bool Expanded = false; 
// The event subscription method (for a button click)
private void ButtonExpand__Click(object sender, RoutedEventArgs e)
{
    Expanded = !Expanded;
    Style Style = new Style
    {
        TargetType = typeof(TreeViewItem)
    };

    Style.Setters.Add(new Setter(TreeViewItem.IsExpandedProperty, Expanded));
    TreePeople.ItemContainerStyle = Style;
}