我目前正在创建一个带有水印文本的文本框,并且遇到了一些样式问题。为了创建水印本身,我包含了此处解释的代码水印/提示文本/占位符 WPF 中的文本框我没有使用公认的答案,而是使用得票最高的答案。(使用装饰者的那个)
我的文本块如下所示:
<AdornerDecorator>
<TextBox HorizontalAlignment="Right"
VerticalAlignment="Center"
Width="190"
Padding="16,2,20,2">
<utils:WatermarkService.Watermark>
<TextBlock Text="Search" />
</utils:WatermarkService.Watermark>
</TextBox>
</AdornerDecorator>
现在我面临的问题是,有了这个附加的属性,其中的文本块超出了我在 app.xaml 中声明的样式的范围。样式如下所示:
<Style TargetType="{x:Type Window}">
<Setter Property="FontFamily"
Value="Tahoma" />
<Setter Property="FontSize"
Value="8pt"></Setter>
<Setter Property="Background"
Value="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" />
</Style>
如何在 app.xaml 的附加属性中设置文本块的样式,最好基于这种样式,这样我就不必声明它为服务时间。
Declare same style for TextBlock
也in Application resources
.这样,它将应用于应用程序中的所有文本块,无论它们是装饰器还是窗口的一部分。
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontFamily"
Value="Tahoma" />
<Setter Property="FontSize"
Value="8pt"></Setter>
<Setter Property="Background"
Value="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}"/>
</Style>
更新
如果您不想复制资源,最好的方法是使用 Label
而不是 TextBlock
.这样,您就可以在Control
上应用样式,并可以从中派生Window
和Label
样式。
但这对TextBlock
不起作用,因为它不是从Control
派生出来的。
<Style TargetType="Control" x:Key="BaseStyle">
<Setter Property="FontFamily" Value="Tahoma" />
<Setter Property="FontSize" Value="8pt"></Setter>
<Setter Property="Background"
Value="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}"/>
</Style>
<Style TargetType="{x:Type Window}"
BasedOn="{StaticResource BaseStyle}"/>
<Style TargetType="{x:Type Label}"
BasedOn="{StaticResource BaseStyle}"/>
然后,如果您在AdornerDecorator中使用Label代替TextBlock,它将正常工作。