2009-05-29 3 views
4

Я хочу, чтобы каждая кнопка имела 5-балльную маржу, в дополнение к стилю темы Royale.WPF: Расширение стиля темы - 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> 

Она компилирует, но я получаю:

Необработанное исключение типа 'System.StackOverflowException' произошло в PresentationFramework.dll

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

Нет данных об исключениях, поскольку:

{Не могу оценить выражение, так как текущий поток находится в состоянии переполнения стека.}

+0

Можете ли вы дать нам какие-либо указания о том, где возникает исключение? – ChrisF

ответ

5

Это, кажется, круговая ссылка между вашим стилем и описанием, определенным в PresentationFramework.Royale. Workaroud будет размещать ресурсы на различных уровнях:

<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

Может ли кто-нибудь объяснить, как это вызвало круговую ссылку и почему изменение области разрешило ее? – teenup

0

Я хотел бы удалить атрибут BasedOn - это не нужно. Подумайте об этом таким образом, слияние темы Royale применит тему кнопки, и вы просто хотите изменить маржи - стили аддитивны по своей природе, поэтому она объединит тему Royale и вашу собственную тему кнопки без указания атрибута BasedOn - Имеет ли это смысл?

Cheers!

+0

У меня сложилось впечатление, что более близкий стиль * перезаписывает * предыдущий стиль, то есть не более одного стиля. Атрибут BasedOn - это способ * расширить * стиль. –

+0

А, ты совершенно прав. Это интересно - я попробовал предложение, которое я дал вам, используя тему Aero, и исключая функцию BasedOn = "..." сбрасывает стиль кнопок обратно в исходную тему XP. Woops :) Если вы можете поделиться больше с источником, возможно, я мог бы взглянуть. – Charles

0

Пожалуйста, см this question и my answer другое решение, которое не требует указать словарь ресурсов в каждом окне и позволяет решить стиль BasedOn динамически.

 Смежные вопросы

  • Нет связанных вопросов^_^