为什么我的 TextBlock/TextBox 不应用基本样式中的值?
对于我来说,编写如下所示的内容来设置数据输入表单的样式并不罕见,但我的问题是 TextBox
和 TextBlock
似乎没有实现BaseElementStyle
。通常我需要单独定义它们。
这是为什么呢?有办法解决吗?
我猜这与它们通常在其他控件模板中使用有关(例如,大多数控件中使用 TextBlock,DatePickers 和 ComboBoxes 中使用 TextBox)
<Style x:Key="BaseElementStyle" TargetType="{x:Type FrameworkElement}">
<Setter Property="Margin" Value="5" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource BaseElementStyle}" />
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource BaseElementStyle}" />
<Style TargetType="{x:Type Label}" BasedOn="{StaticResource BaseElementStyle}" />
<Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource BaseElementStyle}" />
<Style TargetType="{x:Type DatePicker}" BasedOn="{StaticResource BaseElementStyle}" />
<Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource BaseElementStyle}" />
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我想建议两种可能的解决方法。似乎 Key 和 Type 中的每一个都可以使用,但它们不能一起用作您的问题案例,
x:Key="BaseElementStyle" TargetType="{x:Type FrameworkElement}"
。使用 x:Key
使用 x:Type
I would like to suggest the two possible workarounds. It seems that each of Key and Type can be used but both of them cannot be used together as your question case,
x:Key="BaseElementStyle" TargetType="{x:Type FrameworkElement}"
.using x:Key
using x:Type
另请记住,WPF 将
ControlTemplate
视为膨胀边界,并且不在模板内应用默认样式。该规则的例外:从Control
继承的任何内容都会使用默认样式进行扩展。由于TextBlock
继承自FrameworkElement
而不是继承自 Control,因此如果您在ControlTemplate
内部使用它,您还必须手动应用它的样式。对于手动添加的 TextBlock 或 WPF 为字符串Content
添加的 TextBlock,都是如此。一个简单的示例:有关详细信息,请参阅此博客文章:
http://blogs.msdn.com/b/wpfsdk/archive/2009/08/27/implicit-styles-templates-controls-and-frameworkelements.aspx
Also keep in mind that WPF considers a
ControlTemplate
to be an inflation boundary and does NOT apply default styles inside of templates. The exception to the rule: anything that inherits fromControl
WILL BE inflated with the default style. SinceTextBlock
inherits fromFrameworkElement
and not from Control, if you use of it inside of aControlTemplate
you will also have to apply it's style manually. This is true for both TextBlocks that are added by hand, or by TextBlocks added by WPF for stringContent
. A quick example:For more information, see this blog post:
http://blogs.msdn.com/b/wpfsdk/archive/2009/08/27/implicit-styles-templates-controls-and-frameworkelements.aspx