Я добавил PresentationFramework. Аэро к моему 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>
Все кнопки теперь имеют корректное дополнение и полужирный текст, но они выглядят "Классическими", не "Аэро". Как я фиксирую этот стиль так мои кнопки весь Аэро взгляд, но также и имею эти незначительные изменения? Я предпочел бы не должным быть устанавливать Style
свойство для каждой кнопки.
Обновление
Я должен был упомянуть это во-первых, но если я пытаюсь использовать BasedOn
, как показано ниже, я получаю a StackOverflowException
:
<Style BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type Button}">
<Setter Property="Padding" Value="3" />
<Setter Property="FontWeight" Value="Bold" />
</Style>
Это обычно работало бы, но не с Аэро словарями, объединенными в. Если я комментирую те словари, исключение исчезает.
Обновление 2
Если я добавляю x:Key
атрибут и вручную набор стиль, это работает правильно (Аэро стиль с дополнением и полужирный), но поскольку я сказал, я предпочту, чтобы стиль был автоматически применен глобально ко всем кнопкам.
Обновление 3
Я просто обнаружил новую морщину. В моем приложении ButtonResourceDictionary.xaml помещается в библиотеку классов (т.е. во внешний проект). Если я перемещаю этот файл в локальную папку, все хорошо работает. Так, проблема, кажется, плохое взаимодействие, вызванное путем ссылки на различные внешние словари ресурса. Я исправляю свой фрагмент кода App.xaml (выше), чтобы отразить, что ButtonResourceDictionary на самом деле определяется внешне.
Надеюсь, вы тем временем нашли решение. Для всех остальных вот одно обходное решение, а вот другое . Я не уверен, поможет ли это в вашем конкретном случае (особенно тот факт, что вы ссылаетесь на встроенный словарь ресурсов).
ОБНОВЛЕНИЕ
Вот решение, которое я придумал:
<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 любым удобным для вас способом. Вот отличная статья , показывающая, как загружать словари ресурсов (и те, которые фреймворк разрешает автоматически) из кода.
Используйте атрибут BasedOn, чтобы унаследовать свойства от стиля Aero. Это должно решить вашу проблему.
<Style
BasedOn="{StaticResource {x:Type Button}}"
TargetType="{x:Type Button}">
<Setter Property="Padding" Value="3" />
<Setter Property="FontWeight" Value="Bold" />
</Style>
Основываясь на ваших обновлениях, вы можете сделать следующее (признаем, что это ужасно некрасиво):
<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}" />