TextBox中的文本的选择性着色(Windows应用商店应用)

时间:2015-02-25 16:01:37

标签: c# textbox windows-store-apps winrt-xaml text-coloring

我的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时,正在执行返回int列表的Command(此int是TextBox中着色的索引)。

例如我的文字:

  

LoremIpsumDolorSitAmet

然后我按SearchButton,Command返回我的三个数字列表{2,5,13}。现在我想在这个位置上着色TextTextBox字符,所以我希望得到类似的东西:

Result what I want

这正是我想要的。在TextTextBox中为指定的possitions着色文本。

我将TextBox更改为RichEditBox并编写DependencyProperty以将控件与View Model中的属性绑定。这是 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);
    }
 }

MainPage.xaml上的 RichEditBox

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

但我有另一个问题,因为这个DependencyProperty仅以一种方式绑定。当我在View Model控件中设置属性的文本/内容时,MainPage中的RichEditBox将被通知并显示新文本。但是当我在MainPage中更改RichEditBox的内容时,它不会在View Model中通知属性 - 因此从View到View Model的绑定不起作用。

1 个答案:

答案 0 :(得分:1)

TextBox不支持多色文本。如果您想要可编辑的彩色文本,则需要使用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

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

中将HTML绑定到WebView的方式相似