2009-05-29 8 views
4

Je veux que chaque bouton ait une marge de 5 points, en plus du style de thème Royale.WPF: Extension du style du thème - StackOverflowException

Window1.xaml:

<Window x:Class="_styles.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/PresentationFramework.Royale;component/themes/royale.normalcolor.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}"> 
     <Setter Property="Margin" Value="5"/> 
     </Style> 
    </ResourceDictionary> 
    </Window.Resources> 
    <StackPanel> 
    <Button Content="Button A"/> 
    <Button Content="Button B"/> 
    </StackPanel> 
</Window> 

Il compile, mais je reçois:

Une exception non gérée du type 'System.StackOverflowException' a eu lieu dans PresentationFramework.dll

public Window1() { 
    InitializeComponent(); // <-- getting exception here 
} 

Il n'y a pas de détails d'exception parce que:

{Ne peut pas évaluer l'expression parce que le thread courant est dans un état de débordement de pile.}

+0

Pouvez-vous nous donner une indication de l'endroit où l'exception est soulevée? – ChrisF

Répondre

5

Cela semble être une référence circulaire entre votre style et celui défini dans PresentationFramework.Royale. Un workaroud serait de placer des ressources à différents niveaux:

<Window x:Class="_styles.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> 
<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/PresentationFramework.Royale;component/themes/royale.normalcolor.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 
<StackPanel> 
    <StackPanel.Resources> 
     <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}"> 
      <Setter Property="Margin" Value="5"/> 
     </Style> 
    </StackPanel.Resources> 
    <Button Content="Button A"/> 
</StackPanel> 
</Window> 
+0

Quelqu'un peut-il expliquer comment cela a provoqué cette référence circulaire et pourquoi la modification de la portée l'a résolu? – teenup

0

Je supprimerais l'attribut BasedOn - il n'est pas nécessaire. Pensez-y de cette façon, la fusion du thème Royale appliquera le thème du bouton, et vous voulez juste changer la marge - les styles sont additives dans la nature, donc il combinera le thème Royale et votre propre thème de bouton sans spécifier l'attribut BasedOn - Cela a-t-il du sens?

À la votre!

+0

J'étais sous l'impression que le style à portée rapprochée * écrase * le style précédent, c'est-à-dire qu'un style au maximum peut être appliqué. Et l'attribut BasedOn est le moyen de * étendre * un style. –

+0

Ah, vous avez absolument raison. C'est intéressant - j'ai essayé la suggestion que je vous ai faite en utilisant le thème Aero, et en omettant le BasedOn = "..." réinitialise le style des boutons au thème XP d'origine. Woops :) Si vous pouvez partager plus de la source, peut-être que je pourrais jeter un coup d'oeil. – Charles

0

S'il vous plaît voir this question et my answer pour une autre solution qui ne nécessite pas que vous spécifiez un dictionnaire de ressources dans chaque fenêtre et vous permet de résoudre dynamiquement le style BasedOn.