覆盖 App.xaml 中的标准主题
我正在使用标准 WPF 主题 Aero.NormalColor.xaml。而且效果很好。但是对于整个应用程序,我想将文本框的前景色覆盖为红色。
我的第一次尝试是
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="/PresentationFramework.Aero, Version=3.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35,
ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml">
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="TextBox">
<Setter Property="Foreground" Value="Red" />
</Style>
</ResourceDictionary>
</Application.Resources>
……文本框的所有前景色都变成红色。然而,所有文本框都会失去主题样式。是的,我知道我应该添加“BasedOn”。我的第二次尝试是在样式标签中添加“BasedOn”。
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="/PresentationFramework.Aero, Version=3.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35,
ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml">
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Foreground" Value="Red" />
</Style>
</ResourceDictionary>
</Application.Resources>
抛出异常。与此相同 WPF : Extend Theme's style - StackOverflowException
最终,我通过此实现了我的目标。
在 App.xaml
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="/PresentationFramework.Aero, Version=3.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35,
ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml">
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
以及所有窗口和用户控件中,我不得不显式设置
<UserControl.Resources>
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Foreground" Value="Red" />
</Style>
</UserControl.Resources>
上面的代码被多次复制和粘贴,并且不容易维护。有谁知道如何通过将前景设置为红色一次来实现我的目标?
I am using the standard WPF theme Aero.NormalColor.xaml. And it works very well. However for the whole application, I would like to override the Foreground color of textboxes to red.
My first try is that
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="/PresentationFramework.Aero, Version=3.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35,
ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml">
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="TextBox">
<Setter Property="Foreground" Value="Red" />
</Style>
</ResourceDictionary>
</Application.Resources>
Well... all foreground color of textboxes become red. However all textboxes lose the theme style. Yes, I know I should add "BasedOn". My second try is add "BasedOn" in the style tag.
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="/PresentationFramework.Aero, Version=3.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35,
ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml">
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Foreground" Value="Red" />
</Style>
</ResourceDictionary>
</Application.Resources>
Exception is thrown. Same as this WPF : Extend Theme's style - StackOverflowException
Eventually, I achieve my goal by this.
In App.xaml
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="/PresentationFramework.Aero, Version=3.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35,
ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml">
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
And in all windows and user control, I had to explicitly set
<UserControl.Resources>
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Foreground" Value="Red" />
</Style>
</UserControl.Resources>
The above code is copy and paste for many times and it is not easy to maintain. Does anyone know how to achieve my goal by just set foreground to red by one time?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我认为您可以将
Style
添加到ResourceDictionary
并将其与 Aero 主题合并,如下所示:这应该为所有文本框提供红色前景色,而不必在每个窗口和用户控件。
I think you can add the
Style
to aResourceDictionary
and merging that with the Aero theme like this:This should give ALL your textboxes red foreground color without having to explicitly specify that on each window and user control.
我遇到了同样的问题并尝试了奥斯卡的方法。不过,它引起了一些奇怪的行为。特别是,样式不适用于某些控件,而适用于相同类型的其他控件。我找不到这些控件之间的任何重大差异。
我继续寻找解决方案,在这里找到了一个:
http://social .msdn.microsoft.com/Forums/en-US/wpf/thread/91718816-8674-4ad8-a3c8-ae283bebe224/
它仍然不完美和清晰,但它有效,至少对我来说。
简而言之,您可以从以下代码中得到这个想法:
为了可维护性和可读性,这些嵌套的 ResourceDictionary 对象可以转到单独的 XAML 文件。
I had the same problem and tried Oskar's approach. Though, it caused some strange behaviour. Particularly, the styles did not apply to some controls, while applying to other controls of the same type. And I could not find any major differences between these controls.
I continued searching for the solution and I found one here:
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/91718816-8674-4ad8-a3c8-ae283bebe224/
It is still not perfect and clear, but it works, at least for me.
In brief, you can get the idea from the following code:
For maintainability and readability these nested ResourceDictionary objects could go to separate XAML files.
这个问题的确切答案是根据当前控件的静态资源的值设置所有自定义样式。但是,某些控件可能没有像 ListView 或 ListViewItem 这样的默认样式。
该样式可以定位在任何类型的资源字典中,如窗口资源、网格资源、文本框资源或外部资源字典。
最后,您必须将资源字典主题添加到您的应用程序资源中,如以下代码所示,我将 Aero 主题添加到我的应用程序中。
The exact answer for this question is setting all custom style with based on value from static resource of current control. However, some control may not have default style like ListView or ListViewItem.
This style can locate in any kind resource dictionary like window resources, grid resources, textbox resources or external resource dictionary.
Finally, you must add resource dictionary theme to your application resources like the following code that I add Aero theme to my application.