WPF格式化绑定到字符串的TextBlock中的文本

时间:2010-01-08 10:35:03

标签: wpf formatting label binding textblock

我有一个自定义控件,它有一个字符串Description dependancy属性,如下所示:

<CustomControl>
    <CustomControl.Description>
        Hello World
    </CustomControl.Description>
</CustomControl>

此描述绑定在TextBlock中的几个位置,如下所示:

<Button>
    <Button.ToolTip>
        <TextBlock Text="{Binding Path=Description}"/>
    </Button.ToolTip>
    <TextBlock Text="{Binding Path=Description}"/>
</Button>

如何在文本块中添加新行和粗体格式?我试过了:

  1. 在说明中添加\r\n,但这不会被选中。
  2. 在说明中添加&#x0a;&#x0d;&#x0a;,但未提及此内容。
  3. 在说明中添加<![CDATA[<LineBreak/>]]>,但这不会被选中。
  4. 将描述的类型更改为标签并使用ContentPresenter控件绑定到标签,但我发现一次只能有一个ContentPresenter绑定到Label,而另一个则保持消失。
  5. 将描述类型更改为FlowDocument但我发现无法添加多个查看器控件来查看同一文档。

3 个答案:

答案 0 :(得分:1)

您可以将Description类型从简单的string更改为object,从而允许容器将其设置为任意内容,富文本,图片等。

相同的框架元素不能是两个元素的逻辑子元素,因此您不能同时将它用作按钮和工具提示的内容。

示例:

<CustomControl>
    <CustomControl.Description>
        <WrapPanel>
            <TextBlock Text="Hello " Foreground="Red"/>
            <TextBlock Text="World!" Foreground="Blue"/>
        </WrapPanel>
    </CustomControl.Description>
</CustomControl>

模板:

<Button>
    <Button.ToolTip>
        <ContentPresenter Content="{TemplateBinding SomeOtherProperty}"/>
    </Button.ToolTip>
    <ContentPresenter Content="{TemplateBinding Description}"/>
</Button>

答案 1 :(得分:0)

描述的类型应该是DataTemplate:

    <DataTemplate>
        <TextBlock>
                <Run>Hello</Run>
                <LineBreak/>
                <Run>World</Run>
        </TextBlock>
    </DataTemplate>

然后,您可以使用标签并将模板分配给每个标签。

<Label FontSize="24" ContentTemplate="{Binding Inlines}"/>
<Label FontSize="10" ContentTemplate="{Binding Inlines}"/>

答案 2 :(得分:0)

如果您的ToolTip文本(例如)不是您在设计时可以知道的,但必须在运行时构建代码隐藏,那么您可以这样做:

TextBlock tb = new TextBlock();
tb.Inlines.Add(new Run("Background indicates packet repeat status:"));
tb.Inlines.Add(new LineBreak());
tb.Inlines.Add(new LineBreak());
Run r = new Run("White");
r.Background = Brushes.White;
tb.Inlines.Add(r);
tb.Inlines.Add(new Run("\t= Identical Packet received at this time."));
tb.Inlines.Add(new LineBreak());
r = new Run("SkyBlue");
r.Background = new SolidColorBrush(Colors.SkyBlue);
tb.Inlines.Add(r);
tb.Inlines.Add(new Run("\t= Original Packet received at this time."));

ToolTip tt = new ToolTip();
tt.Content = tb;
myButton.ToolTip = tt;

此示例提供了格式精美的4行工具提示文本,带有颜色突出显示。

我没有使用Brushes.SkyBlue的唯一原因是证明你可以构建你想要的任何颜色。例如,new SolidColorBrush(Color.FromArgb(128, 86, 180, 233));用于半透明的SkyBlue背景。

选择颜色时,请记住您的色盲用户:Color Blind Palette