嘿,我有一个针对XP机器的WPF应用程序。问题是我们希望运行WPF XP luna主题而不是经典主题,我们的大多数客户都以经典模式运行。我们的客户都是内部客户,只是他们的机器配置了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">
这显示不正确(样式经典),注意现在样式块中有很多节点并不重要 - 零足以混淆事物:
<TextBox.Style><Style></Style></TextBox.Style></TextBox>
长短,覆盖默认的OS主题似乎排除了进一步使用样式。我在这里缺少什么?
查看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>
答案 0 :(得分:2)
试试这个:
<TextBox>
<TextBox.Style>
<Style BasedOn="{StaticResource {x:Type TextBox}}">
</Style>
</TextBox.Style>
</TextBox>
修改强> 忘了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>