首先,我将一个样式作为应用程序资源中的资源,如下所示:
<Style x:Key="ContentTextBlock" TargetType="FrameworkElement">
<Setter Property="TextBlock.HorizontalAlignment" Value="Center"/>
<Setter Property="TextBlock.VerticalAlignment" Value="Center"/>
<Setter Property="TextBlock.FontFamily" Value="Verdana"/>
<Setter Property="TextBlock.FontSize" Value="12"/>
<Setter Property="TextBlock.FontWeight" Value="Normal"/>
<Setter Property="TextBlock.Foreground" Value="Orange"/>
</Style>
我创建了一个自定义控件,其中包含标题和内容。 这是内容部分在自定义控件模板中的外观:
<ContentPresenter Content="{TemplateBinding Content}"
Style="{DynamicResource ContentTextBlock}">
</ContentPresenter>
我的问题是,如果我像这样使用创建的控件:
<local:CutPage.Content>
<TextBlock>Header</TextBlock>
</local:CutPage.Content>
Fontsize,FontWeight和FontFamily被TextBlock的显式或默认样式覆盖(我认为是这种情况,但我不确定)。我已经阅读了有关dependebcy value order od precedence的文章,但我怎么能猜出什么覆盖了我的模板样式?我希望所有进入自定义控件的标题元素都使用这些值。我该怎么做?
P.S。有趣的是,一些样式设置器工作(如垂直和水平居中文本),但其他人不这样做!
答案 0 :(得分:1)
如果要保留CustomControl,则必须定义与文本块属性匹配的依赖项属性,并在ControlTemplate中执行绑定。
我要做的是创建一个从TextBox派生的CustomControl,然后更改它的ControlTemplate以添加你需要的东西,并在ControlTemplate中绑定你需要的所有内容。
或者,您可以使用 HeaderedContentControl ,它似乎完全符合您的需要。
<HeaderedContentControl FontFamily="Arial" Foreground="Red" Header="Hello World">
<Rectangle Width="10" Height="10" Fill="Blue" />
</HeaderedContentControl>
答案 1 :(得分:1)
您可以将基本样式放在单独的文件中,而不是使用它在文本块中继承它,就像这样:
<TextBlock>
<Style TargetType="..." BasedOn="{StaticResource MyGeneralStyle}"> <Setter Property="Foreground" Value="..."/>
</Style>
</TextBlock>