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 所演示的内容
我的代码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 所演示的内容