Привет, у меня есть приложение 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>