Темы WPF по умолчанию и пользовательские стили не работают вместе - PullRequest
2 голосов
/ 21 февраля 2011

Привет, у меня есть приложение WPF, предназначенное для компьютеров с XP.Проблема в том, что мы хотим работать с лунной темой WPF XP, а не с классической, и большинство наших клиентов работают в классическом режиме.Наши клиенты все внутренние, просто их машины были настроены на XP classic.

Теоретически это так же просто, как добавить это в приложение:

 <ResourceDictionary Source="/PresentationFramework.Luna, Version=3.0.0.0,
 Culture=neutral, PublicKeyToken=31bf3856ad364e35,
 ProcessorArchitecture=MSIL;component/themes/luna.normalcolor.xaml" />

На практике, каккак только коснемся любого из стилей (скажем, добавим поле в TextBox), они, похоже, вернутся к классической теме.

Отображается правильно (Style Luna):

<TextBox  Width="80" Height="20" />

Отображается правильно (Style Luna):

<TextBox Width="80" Height="20" Background="Brown">

Отображается неправильно (Style Classic), обратите вниманиетеперь не имеет значения, сколько узлов находится в блоке стилей - нуля достаточно, чтобы запутать вещи:

<TextBox.Style><Style></Style></TextBox.Style></TextBox>

Длинный и короткий, переопределение темы ОС по умолчанию, кажется, препятствует дальнейшему использованию стилей.Что мне здесь не хватает?

См. Ответ на 80% истории.Полная история такова: я должен также указать параметр «BasedOn».К сожалению, это означает, что мы не можем переопределить, скажем, текстовое поле, не вызывая цикл.Определение:

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Margin" Value="0,2,0,2" />
    :
</Style>

приведет к ошибке: «В выражении свойства обнаружен цикл».Способ, которым я решил обойти это, заключался в том, чтобы везде использовать именованные стили.Например:

    <Style x:Key="TextBase"  TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
        <Setter Property="Margin" Value="0,2,0,2" />
        :
    </Style>

<Style x:Key="Text25Chars" TargetType="{x:Type TextBox}" BasedOn="{StaticResource TextBase}">
    <Setter Property="Margin" Value="0,2,0,2" />
    :
</Style>

1 Ответ

2 голосов
/ 21 февраля 2011

попробуйте это:

<TextBox>
    <TextBox.Style>
        <Style BasedOn="{StaticResource {x:Type TextBox}}">
        </Style>
    </TextBox.Style>
</TextBox>

edit: забыл TargetType, это работает для меня:

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <ResourceDictionary Source="/PresentationFramework.Luna, Version=3.0.0.0, Culture=neutral,
                            PublicKeyToken=31bf3856ad364e35,
                            ProcessorArchitecture=MSIL;component/themes/luna.normalcolor.xaml" />
    </Window.Resources>
        <TextBox>
            <TextBox.Style>
                <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
                    <Setter Property="Foreground" Value="Blue" />
                </Style>
            </TextBox.Style>
            tototototottototo
        </TextBox>
</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...