gpt4 book ai didi

wpf - 使用 iValueConverter 格式化 TextBlock 的部分文本

转载 作者:行者123 更新时间:2023-12-04 16:40:14 24 4
gpt4 key购买 nike

我想将文本块的部分文本加粗。这是我在 IValueConverter 中尝试过的,但它似乎不起作用。

public class Highlighter : IValueConverter
{


public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return null;
}

return "Question1:<Bold>Answer1</Bold>, Question2:<Bold>Answer2</Bold>, Question3:<Bold>Answer3</Bold>";

}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

这不会使答案变粗。

这就是我在 XAML 中使用它的方式。
<TextBlock Height="Auto" Width="Auto" MaxHeight="64" Text="{Binding Path=QuestionAnswer, Mode=OneWay, Converter={x:Static Highlighter}}" />

有没有办法通过格式化文本或将 TextBlock 发送到转换器来实现这一点?

最佳答案

绝对可以用 TextBlock控制,但考虑到您可能想要切换到其他控制的所有努力(例如 ItemsControl)。

无论如何,这是一个解决方案。其实有几个问题需要解决:

  • TextBlock.Text属性是 string ,并且您不能为其分配预格式化的文本
  • TextBlock.Inlines可以接受格式化文本,但它是只读属性
  • 您必须自己格式化文本(可能有一些简单的方法可以解析带有标签的文本并将格式化输出生成为 Inline 对象的集合,但我不知道任何)

  • 您可以创建附加属性来处理前两个问题:
    public static class TextBlockEx
    {
    public static Inline GetFormattedText(DependencyObject obj)
    {
    return (Inline)obj.GetValue(FormattedTextProperty);
    }

    public static void SetFormattedText(DependencyObject obj, Inline value)
    {
    obj.SetValue(FormattedTextProperty, value);
    }

    public static readonly DependencyProperty FormattedTextProperty =
    DependencyProperty.RegisterAttached(
    "FormattedText",
    typeof(Inline),
    typeof(TextBlockEx),
    new PropertyMetadata(null, OnFormattedTextChanged));

    private static void OnFormattedTextChanged(
    DependencyObject o,
    DependencyPropertyChangedEventArgs e)
    {
    var textBlock = o as TextBlock;
    if(textBlock == null) return;

    var inline = (Inline)e.NewValue;
    textBlock.Inlines.Clear();
    if(inline != null)
    {
    textBlock.Inlines.Add(inline);
    }
    }
    }

    XAML 会稍微改变一点:
    <TextBlock local:TextBlockEx.FormattedText="{Binding Path=QuestionAnswer,
    Mode=OneWay,
    Converter={x:Static Highlighter}}" />

    请注意,您需要将命名空间映射到 TextBlockExxmlns:local="clr-namepace:<namespace_name>" 中声明在 XAML 中。

    现在您需要在转换器中构造格式化文本而不是纯文本来解决最后一个问题:
    public object Convert(object value, Type targetType, object parameter,
    CultureInfo culture)
    {
    if(value == null)
    {
    return null;
    }

    var span = new Span();
    span.Inlines.Add(new Run("Question1: "));
    span.Inlines.Add(new Run("Answer1") { FontWeight = FontWeights.Bold });
    span.Inlines.Add(new Run(", "));

    span.Inlines.Add(new Run("Question2: "));
    span.Inlines.Add(new Run("Answer2") { FontWeight = FontWeights.Bold });
    span.Inlines.Add(new Run(", "));

    span.Inlines.Add(new Run("Question3: "));
    span.Inlines.Add(new Run("Answer3") { FontWeight = FontWeights.Bold });

    return span;
    }

    关于wpf - 使用 iValueConverter 格式化 TextBlock 的部分文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14058814/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com