1

我正在尝试为文本带有下划线的内容控件(例如 Button 或 HeaderedContentControl 等)创建模板。

我只想在Content="This text is underlined"指定时为文本加下划线。

如果 Content 是另一个 UIElement,它必须继续正常工作。

大多数提出相同问题的帖子都对修改模板以仅将字符串作为内容工作感到满意。Scott Gu 有一篇关于样式按钮的好文章,但没有解决这个问题。

如果您实际上Content作为类型的实例TextBlock而不是作为字符串传入,则以下示例将起作用。视觉树肯定有一个 TextBlock 所以它应该设置它的样式。也许这是 Sivlerlight 的限制。

当我希望它同时显示为大红色文本时,此示例显示黑色文本和大红色文本。

    <navigation:Page.Resources>
    <Style TargetType="TextBlock" x:Key="style123">
        <Setter Property="Foreground"  Value="Red"/>
        <Setter Property="FontSize" Value="72"/>
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="TextDecorations" Value="Underline"/>
    </Style>
</navigation:Page.Resources>

<StackPanel>        

    <!-- This doesn't work and shows black text -->
    <ContentPresenter Content="Small black text">
        <ContentPresenter.Resources>
            <Style TargetType="TextBlock" BasedOn="{StaticResource style123}"/>
        </ContentPresenter.Resources>
    </ContentPresenter>

    <!-- This works and shows red text -->
    <ContentPresenter>
        <ContentPresenter.Content>
            <TextBlock Text="This is big red text"/>
        </ContentPresenter.Content>

        <ContentPresenter.Resources>
            <Style TargetType="TextBlock" BasedOn="{StaticResource style123}"/>
        </ContentPresenter.Resources>
    </ContentPresenter>

</StackPanel>
4

2 回答 2

1

如果 newContent 是字符串,您可以对您正在使用的任何实际ContentControl(即Button)进行子类化和覆盖OnContentChanged,以便将Content属性重置为带下划线的。TextBlock如果 newContent 不是字符串,它将以通常的方式执行。

public class UnderlineButton : Button
{
    protected override void OnContentChanged(object oldContent, object newContent)
    {
        if (newContent is string)
        {
            TextBlock textBlock = new TextBlock();
            textBlock.Text = newContent as string;
            textBlock.TextDecorations = TextDecorations.Underline;
            this.Content = textBlock;
        }

        base.OnContentChanged(oldContent, newContent);
    }
}

子类化只是为了完成这个有点烦人,但它避免了混乱的样式模板和子类化ContentPresenter

于 2010-08-12T15:36:33.247 回答
0

试试这个例子,使用 DataTemplate 自定义渲染string内容(我刚刚将背景设置为红色):

<ContentControl Content="{Binding YourData}" >
  <ContentControl.Resources>
    <DataTemplate DataType="{x:Type s:String}">
      <TextBlock Text="{Binding}" Background="Red" />
    </DataTemplate>
  </ContentControl.Resources>
</ContentControl>

编辑:就像注释一样ContentControl,如果您需要更好的可重用性,您可以将其拉出到样式中,而不是每次都将其内联应用...

于 2010-08-12T15:48:39.790 回答