Как изменить стиль по умолчанию для кнопки без возврата WPF от Aero до Classic?

Я добавил PresentationFramework.Aero в свои объединенные словари App.xaml, как в...

<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>

Я пытаюсь слегка изменить внешний вид кнопок по умолчанию. Я поместил этот стиль в свой ButtonResourceDictionary:

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

Все кнопки теперь имеют правильное дополнение и полужирный текст, но они выглядят "классическими", а не "аэро". Как я могу исправить этот стиль, чтобы все кнопки отображали Aero, но также имели эти незначительные изменения? Я бы предпочел не устанавливать свойство Style для каждой кнопки.

Обновление

Я должен был упомянуть об этом в первую очередь, но если я попытаюсь использовать BasedOn, как показано ниже, я получаю StackOverflowException:

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

Это обычно работает, но не с объединенными словарями Aero. Если я прокомментирую эти словари, исключение исчезнет.

Обновление 2

Если добавить атрибут x:Key и вручную установить стиль, он будет работать правильно (стиль Aero с дополнением и полужирным шрифтом), но, как я уже сказал, я бы предпочел, чтобы стиль автоматически применялся глобально ко всем кнопкам.

Обновление 3

Я только что обнаружил новую морщину. В моем приложении ButtonResourceDictionary.xaml помещается в библиотеку классов (т.е. Во внешний проект). Если я переведу этот файл в локальную папку, все будет хорошо. Таким образом, проблема представляет собой плохое взаимодействие, вызванное ссылкой на различные словари внешних ресурсов. Я исправляю свой фрагмент кода App.xaml(выше), чтобы отразить, что ButtonResourceDictionary фактически определен внешне.

Ответ 1

Я надеюсь, что вы нашли решение тем временем. Для всех остальных здесь есть один способ обхода, а вот еще один. Я не уверен, поможет ли это для вашего конкретного случая (особенно тот факт, что вы ссылаетесь на встроенный словарь ресурсов).

UPDATE

Вот решение, которое я придумал:

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

Где StaticApplicationResource - это пользовательское MarkupExtension, которое я написал, просто вызывает 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;
    }
}

Таким образом, мне не нужно ссылаться на мои ресурсные словари вне моего файла App.xaml, который мне нравится:). Вы также можете добавить в нее более сложную логику, позволяющую вам разрешить стиль BasedOn любым способом. Вот отличная статья, показывающая вам, как загружать ресурсные словари (и те, которые инфраструктура разрешает автоматически) из кода.

Ответ 2

Используйте атрибут BasedOn для наследования свойств из Aero Style. Это должно решить вашу проблему.

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

Ответ 3

Основываясь на ваших обновлениях, вы можете сделать это (правда, это ужасно уродливо):

<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}" />