Как определить цвет фона по умолчанию для экземпляров окон в общем ResourceDictionary?

Кажется, я не могу установить цвет фона по умолчанию для всех моих окон в моем приложении. Кто-нибудь знает как это сделать?

В настоящее время я устанавливаю тему в своем файле App.xaml следующим образом.

<Application>
    <Application.Resources>
        <ResourceDictionary Source="Themes/SomeTheme.xaml" />

Это в основном стилизует все мое приложение.

Внутри SomeTheme.xaml я пытаюсь установить цвет по умолчанию для всех моих окон, подобных этому.

<SolidColorBrush Color="{DynamicResource MainColor}" x:Key="CommonBackgroundBrush" />
<Style TargetType="{x:Type Window}">
    <Setter Property="Background" Value="{DynamicResource CommonBackgroundBrush}" />
</Style>

Этот синтаксис полностью игнорируется для производных типа Window.

Есть ли способ заставить стиль применяться ко всем производным от Window?

Странная вещь в этом синтаксисе заключается в том, что он фактически показывает правильный цвет в окне предварительного просмотра дизайна VS.


person Nicholas    schedule 09.01.2011    source источник


Ответы (4)


Ваши окна не являются экземплярами Window, они являются экземплярами классов, производных от Window. Так что я думаю, вам придется перечислить их все, но вы можете использовать BasedOn, чтобы помочь.

person Rick Sladkey    schedule 09.01.2011
comment
Это хороший момент... но все же должен быть какой-то способ установить все, что происходит от Window. Фактически предварительный просмотр XAML показывает установленный фон. - person Nicholas; 09.01.2011
comment
Это артефакт того, как работает дизайнер. Он действительно создает экземпляр Window, так что ваш программный код не нужно компилировать для выполнения дизайна. - person Rick Sladkey; 09.01.2011
comment
Ну блин. Спасибо за эту информацию ... так вы говорите, что нет способа заставить все производные применять тему своего базового класса? - person Nicholas; 10.01.2011
comment
Мы можем предположить, что проверка стилей класса и всех базовых классов была слишком дорогостоящей, иначе было бы разумно добавить эту функцию. - person Rick Sladkey; 10.01.2011
comment
Спасибо за ваши комментарии ... они дали мне немного понимания - person Nicholas; 10.01.2011

Если на самом деле нет фактического наследования, это может быть настолько просто, насколько вы можете это сделать:

<Style TargetType="{x:Type Window}">
    <Setter Property="Background">
        <Setter.Value>
            <SolidColorBrush Color="Blue"/>         
        </Setter.Value>
    </Setter>
</Style>
<Style TargetType="{x:Type local:MainWindow}" BasedOn="{StaticResource {x:Type Window}}"/>
<Style TargetType="{x:Type local:Dialogue}" BasedOn="{StaticResource {x:Type Window}}"/>
...

По крайней мере, вам не нужно копировать весь стиль таким образом

person H.B.    schedule 09.01.2011
comment
Думаю, это хорошая альтернатива. К сожалению, я должен объявить это явно. - person Nicholas; 10.01.2011
comment
На самом деле, я не могу заставить это работать... вы уверены, что это действительно? - person Nicholas; 10.01.2011
comment
Я попробовал, и у меня это сработало, может быть, что-то в общей теме отличается. - person H.B.; 10.01.2011
comment
Буду дальше возиться... Должно быть, я что-то напутал - person Nicholas; 10.01.2011
comment
Хорошо, это работает... кажется, что есть какое-то колдовство, когда вы используете MergedDictionaries. Точно определить не удалось, но все становится шатким, когда вы пытаетесь объявить стили внутри ResourceDictionary, вложенного в ResourceDictionary.MergedDictionaries. - person Nicholas; 10.01.2011

Поставьте своему стилю x:Key,

<Style x:Key="WindowStyle" TargetType="{x:Type Window}">

а затем ссылайтесь на него в каждом окне, к которому он должен применяться:

<Window x:Class="WpfApplication1.MainWindow" ... Style="{StaticResource WindowStyle}">
person TomBot    schedule 09.01.2011
comment
Да, я пытался избежать этого. Я хочу установить стили в одном месте. - person Nicholas; 10.01.2011
comment
@Nicholas Могу я спросить, почему вы не хотите устанавливать ссылку на стиль? Лично я предпочитаю иметь полный контроль над тем, какой стиль применяется к какому элементу управления, особенно после инцидента с ButtonStyle: однажды утром в понедельник я пришел в офис и обнаружил, что кто-то испортил стиль моих DatePickers. Мне потребовалось все утро, чтобы понять, что я сам все испортил. В прошлую пятницу я определил стиль по умолчанию для кнопок. Но DatePicker содержит кнопку как ЧАСТЬ, стиль был применен и к ней. Я решил, что ключи — ваши друзья, пропускайте их на свой страх и риск :-) - person TomBot; 10.01.2011
comment
Ничего страшного в ключах нет. На самом деле ваш пример хорош, но я хочу избежать ссылок на стили с каждой страницы. Я действительно хотел неявный стиль, но я думаю, что это невозможно. Установив его для типа (как в примере H.B), я могу централизованно стилизовать свои страницы в одном и том же ресурсе... что для меня является интересной идеей. Так что нет, я не пропускаю ключи, в данном случае они просто не дают мне то, что я хочу. По правде говоря, Ориентация на тип тоже не дает мне того, что я хочу, но, похоже, мне придется с этим смириться. - person Nicholas; 10.01.2011
comment
Если бы я подумал об этом применительно к CSS, я бы мог устанавливать стили глобально и переопределять их с помощью идентификаторов и классов... в этом случае. - person Nicholas; 10.01.2011

Я новичок во всем этом, так что вот мои 5 пенсов. Я изменил фон для сетки... не уверен, что есть какие-то проблемы с этим способом :)

 <Style TargetType="{x:Type Grid}">
    <Setter Property="Background" Value="#FFECE9D8"/>
</Style>
person Gun Store    schedule 16.03.2011