web-dev-qa-db-fra.com

Désactiver le style dans WPF XAML?

Est-il possible de désactiver un style par programmation?

Par exemple, j'ai un style qui est lié à toutes les zones de texte

<Style TargetType="{x:Type TextBox}">

Je voudrais ajouter un peu de code pour arrêter réellement les éléments de style utilisés, donc en gros, revenir au style de contrôle par défaut.

J'ai besoin d'un moyen de faire un changement dans mes styles, donc je peux basculer entre le style par défaut de Windows et mon style personnalisé via le code C #.

Y a-t-il un moyen de faire ça?

Merci

Solution de travail

Basculer entre les thèmes dans WPF

28
Sandeep Bansal

Pour définir le style par défaut,

En utilisation XAMl,

<TextBox Style="{x:Null}" />

En utilisation C #,

myTextBox.Style = null;

Si le style doit être défini sur null pour plusieurs ressources, voir la réponse CodeNaked.


Je pense que toutes les informations supplémentaires devraient être dans votre question et non dans les commentaires. Quoi qu'il en soit, dans le code Derrière, je pense que c'est ce que vous essayez d'atteindre:

Style myStyle = (Style)Application.Current.Resources["myStyleName"];

public void SetDefaultStyle()
{
    if(Application.Current.Resources.Contains(typeof(TextBox)))
        Application.Current.Resources.Remove(typeof(TextBox));

    Application.Current.Resources.Add(typeof(TextBox),      
                                      new Style() { TargetType = typeof(TextBox) });
}

public void SetCustomStyle()
{
    if (Application.Current.Resources.Contains(typeof(TextBox)))
        Application.Current.Resources.Remove(typeof(TextBox));

    Application.Current.Resources.Add(typeof(TextBox), 
                                      myStyle);
}
63
loxxy

Vous pouvez injecter un style vierge qui aurait priorité sur votre autre style. Ainsi:

<Window>
    <Window.Resources>
        <Style TargetType="TextBox">
            <Setter Property="Background" Value="Red" />
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.Resources>
            <Style TargetType="TextBox" />
        </Grid.Resources>
    </Grid>
</Window>

Dans l'exemple ci-dessus, seul le style implicite de la grille serait appliqué aux zones de texte de la grille. Vous pouvez même ajouter ceci à la grille par programme, quelque chose comme:

this.grid.Resources.Add(typeof(TextBox), new Style() { TargetType = typeof(TextBox) });
20
CodeNaked

Je sais que la réponse a été acceptée, mais je veux ajouter ma solution qui fonctionne très bien dans le scénario suivant:

  • Une application principale utilisant mahapps.metro
  • projet supplémentaire importé de l'application principale sans référence à mahapps.metro, il est importé en tant que plugin (chargement .dll compilé à la volée)
  • l'utilisation de la <ToolBar> remodèle tout pour annuler la valeur. Par conséquent, les styles mahapps.metro ne sont pas appliqués aux éléments dans la barre d'outils.
  • usercontrol est utilisé pour fournir des contrôles personnalisés à l'application principale.

dans la racine de contrôle utilisateur, définissez les ressources:

<UserControl.Resources>
    <Style x:Key="ButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" />
    <Style x:Key="ComboBoxStyle" TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}" />
</UserControl.Resources>

alors le code de la barre d'outils peut être le suivant

                <ToolBar>
                    Block Template:
                    <ComboBox Style="{StaticResource ComboBoxStyle}"/>
                    <Button Content="Generate!" Style="{StaticResource ButtonStyle}"/>
                </ToolBar>

cela applique avec succès le style d'application principal aux contrôles à l'intérieur de la <barre d'outils>

3
impoetk

Dans Xaml, vous pouvez remplacer cela en définissant un style explicitement. En code-behind, vous pouvez également définir le style explicitement.

<TextBox Style="{StaticResource SomeOtherStyle}"/>

myTextBox.Style = Application.Resources["SomeOtherStyle"];
1
Ed Bayiates