WPF: расширение стиля темы - StackOverflowException
Я хочу, чтобы каждая кнопка имела 5-балльную маржу, в дополнение к стилю темы Royale.
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
}
Детали исключения отсутствуют, потому что:
{Невозможно оценить выражение, потому что текущий поток находится в состоянии.}
Ответы
Ответ 1
Кажется, это круговая ссылка между вашим стилем и тем, что определено в PresentationFramework.Royale. Рабочий ресурс должен был размещать ресурсы на разных уровнях:
<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>
Ответ 2
Я бы удалил атрибут BasedOn - это не обязательно. Подумайте об этом таким образом, слияние темы Royale применит тему кнопки, и вы просто хотите изменить маржи - стили аддитивны по своей природе, поэтому она объединит тему Royale и вашу собственную тему кнопки без указания атрибута BasedOn - это имеет смысл?
Ура!
Ответ 3
См. этот вопрос и мой ответ для другого решения, которое не требует указания ресурсный словарь в каждом окне и позволяет динамически разрешать стиль BasedOn.