Comment modifier le style par défaut d'un bouton sans que WPF ne revienne de Aero à Classic?

j'ai ajouté le cadre de présentation.Aero à mon application.xaml fusionné les dictionnaires, comme dans...

<Application
    x:Class="TestApp.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary
                    Source="/PresentationFramework.Aero;component/themes/Aero.NormalColor.xaml" />
                <ResourceDictionary
                     Source="pack://application:,,,/WPFToolkit;component/Themes/Aero.NormalColor.xaml" />
                <ResourceDictionary
                    Source="/CommonLibraryWpf;component/ResourceDictionaries/ButtonResourceDictionary.xaml" />
                    <!-- Note, ButtonResourceDictionary.xaml is defined in an external class library-->
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

j'essaie de modifier légèrement l'apparence par défaut des boutons. J'ai mis ce style dans mon éditorial de Button:

<Style TargetType="Button">
    <Setter Property="Padding" Value="3" />
    <Setter Property="FontWeight" Value="Bold" />
</Style>

tous les boutons ont maintenant le rembourrage correct et le texte en gras, mais ils ont l'air "classique", pas "Aero". Comment puis-je corriger ce style de sorte que mes boutons tous regarder Aero, mais ont également ces changements mineurs? Je préfère ne pas vous devez définir la propriété Style pour chaque bouton.

mise à Jour

j'aurais dû le mentionner en premier lieu, mais si j'essaie d'utiliser BasedOn , comme montré ci-dessous, j'obtiens un StackOverflowException :

<Style BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type Button}">
    <Setter Property="Padding" Value="3" />
    <Setter Property="FontWeight" Value="Bold" />
</Style>

cela fonctionnerait normalement, mais pas avec les dictionnaires Aéro fusionnés. Si je commente ces dictionnaires, l'exception disparaît.

mise à jour 2

si j'ajoute un attribut x:Key et que je règle manuellement le style, il fonctionne correctement (Aéro style avec rembourrage et gras), mais comme je l'ai dit, je préférerais que le style soit appliqué automatiquement à tous les boutons.

Update 3

je viens de découvrir une nouvelle ride. Dans mon application, ButtonResourceDictionary.xaml est placé dans une bibliothèque de classe (i.e., dans un projet externe). Si je déplace ce fichier un dossier local, tout fonctionne bien. Ainsi, le problème semble être une mauvaise interaction causée par la référence à divers dictionnaires de ressources externes. Je suis la correction de mon Application.code XAML snippet (ci-dessus) pour refléter que ButtonResourceDictionary est en fait défini extérieurement.

6
demandé sur devuxer 2010-05-25 06:45:08

3 réponses

j'espère que vous avez trouvé une solution en attendant. Pour tout le monde, en voici un et en voici un autre . Je ne suis pas sûr que cela aidera pour votre cas spécifique cependant (en particulier le fait que vous faites référence à un dictionnaire de ressources intégré).

mise à JOUR

Voici une solution que j'ai trouvé:

<Style TargetType="TextBox" BasedOn="{Common:StaticApplicationResource {x:Type TextBox}}">
    <Setter Property="Height" Value="21"/>
</Style>

StaticApplicationResource est un MarkupExtension personnalisé que j'ai écrit qui appelle simplement TryFindResource :

[MarkupExtensionReturnType(typeof(object))]
public class StaticApplicationResource : MarkupExtension
{
    public StaticApplicationResource(object pResourceKey)
    {
        mResourceKey = pResourceKey;
    }

    private object _ResourceKey;

    [ConstructorArgument("pResourceKey")]
    public object mResourceKey
    {
        get { return _ResourceKey; }
        set { _ResourceKey = value; }
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (mResourceKey == null)
            return null;

        object o = Application.Current.TryFindResource(mResourceKey);

        return o;
    }
}

de cette façon, je n'ai pas à faire référence à mes dictionnaires de ressources en dehors de mon application.fichier xaml , qui est la façon dont je l'aime :). Vous pouvez également y mettre une logique plus compliquée, vous permettant de résoudre le style BasedOn comme vous le souhaitez. voici un excellent article vous montrant comment charger les dictionnaires de ressources (et ceux que le cadre résout automatiquement) à partir du code.

8
répondu Andre Luus 2017-07-08 09:53:25

D'après vos mises à jour, vous pourriez faire ceci (il est vrai que c'est hideusement laid):

<Style x:Key="_buttonStyleBase"
       BasedOn="{StaticResource {x:Type Button}}"
       TargetType="{x:Type Button}"> 
    <Setter Property="Padding" Value="3" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
</Style>

<Style TargetType="{x:Type Button}"
       BasedOn="{StaticResource _buttonStyleBase}" />
0
répondu Abe Heidebrecht 2016-06-07 11:11:42

utilise l'attribut BasedOn pour hériter les propriétés du Style Aero. Cela devrait résoudre votre problème.

<Style
  BasedOn="{StaticResource {x:Type Button}}"
  TargetType="{x:Type Button}"> 
    <Setter Property="Padding" Value="3" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
</Style>
0
répondu Michael Brown 2016-06-07 11:11:54