TextBox 中文本的选择性着色(Windows Store App)

Selective coloring of the text in TextBox (Windows Store App)

我的代码MainPage.xaml

<TextBox x:Name="TextTextBox" 
          Text="{Binding Path=Text, Mode=TwoWay}"
          TextWrapping="Wrap" />

.
.
.

<!--Button with some Command-->
<Button x:Name="SearchButton" 
                    Content="Search" 
                    HorizontalAlignment="Center"
                    Command="{Binding Command}"/>

我的 ViewModel 中的代码(属性 与 TextBox 绑定)

public string Text
{
    get
    {
        return ssModel.Text;
    }
    set
    {
        ssModel.Text = value;
        OnPropertyChanged();
    }
}

当您按下 SearchButton 时,正在执行 return 整数列表的命令(此整数是 TextBox 中着色的索引)。

例如我的文本:

LoremIpsumDolorSitAmet

然后我按搜索按钮,命令 return 我例如列出三个数字 {2, 5, 13}。现在我想在这个位置上给 TextTextBox 字符着色,所以我想得到类似的东西:

而这正是我想要得到的。为指定位置的 TextTextBox 中的文本着色。

我将 TextBox 更改为 RichEditBox 并编写 DependencyProperty 以在视图模型中使用 属性 绑定控件。这是 class 和 DependencyProperty:

public class RichTextC : DependencyObject
 {
    public static string GetRichText(DependencyObject obj)
    {
        return (string)obj.GetValue(RichTextProperty);
    }

    public static void SetRichText(DependencyObject obj, string value)
    {
        obj.SetValue(RichTextProperty, value);
    }

    public static readonly DependencyProperty RichTextProperty =
        DependencyProperty.Register("RichText", typeof(string), typeof(RichTextC), new PropertyMetadata(string.Empty, callback));

    private static void callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var reb = (RichEditBox)d;
        reb.Document.SetText(TextSetOptions.FormatRtf, (string)e.NewValue);
    }
 }

RichEditBox 在 MainPage.xaml:

<RichEditBox local:RichTextC.RichText="{Binding MyRichText, Mode=TwoWay}" 
                     Margin="0,30,0,0""/>

但我还有另一个问题,因为这个 DependencyProperty 只能以一种方式绑定。当我在视图模型控件中设置 text/content 或 属性 时,MainPage 的 RichEditBox 将收到通知并显示新文本。但是,当我在 MainPage 更改 RichEditBox 的内容时,它不会在视图模型中通知 属性 - 因此从视图到视图模型的绑定不起作用。

文本框不支持多色文本。如果您想要可编辑的彩色文本,则需要改用 RichEditBox。

但是,没有直接的方法来绑定到 RichEditBox 的文本。您可以通过 RichEditBox 的 ITextDocument 界面以编程方式设置文本及其字符格式。例如,以下将位置 2 设置为红色。在调用 ApplyDisplayUpdates:

之前,您可以遍历整数列表以设置其所有范围
ITextDocument doc = rtb.Document;
ITextRange range = doc.GetRange(2,3);
range.CharacterFormat.ForegroundColor = Windows.UI.Colors.Red;
rtb.Document.ApplyDisplayUpdates();

另一种可能性是创建一个包含 RTF 代码的字符串并使用 ITextDocument 进行设置。SetText.

如果您想绑定文本,您可以创建一个附加的 属性,它接受 RTF 并调用 SetText,或者它接受您自己的更简单的标记脚本并调用 ITextRange.CharacterFormat.ForegroundColor。无论哪种方式,它都类似于我在博客条目 Binding HTML to a WebView with Attached Properties

中将 HTML 绑定到 WebView 所演示的内容