也许不是最巧妙的解决方案,但您可以从 RichTextBox 继承并添加一些行为
声明您自己的字体属性,以便稍后可以使用字体列表绑定它们
public class CustomControl1 : RichTextBox
{
public static readonly DependencyProperty CurrentFontFamilyProperty =
DependencyProperty.Register("CurrentFontFamily", typeof(FontFamily), typeof (CustomControl1), new FrameworkPropertyMetadata(new FontFamily("Tahoma"), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,new PropertyChangedCallback(OnCurrentFontChanged)));
}
重写 OnTextInput。您无法在 RichTextBox 上订阅此事件,它具有对 KeyDown 和 KeyUp 冒泡的内置处理,并且在它们之间生成 TextInput
protected override void OnTextInput(TextCompositionEventArgs e)
{
if (fontchanged)
{
TextPointer tp = this.CaretPosition.GetInsertionPosition(LogicalDirection.Forward);
Run r = new Run(e.Text, tp);
r.FontFamily = CurrentFontFamily;
r.Foreground = CurrentForeground;
this.CaretPosition = r.ElementEnd;
fontchanged = false;
}
else
base.OnTextInput(e);
}
如果您的 CurrentFontProperty 已更改,请获取插入符号位置并使用新的文本输入创建一个新的 Run,并设置 FontFamily = CurrentFontFamily。如果插入符位于一个单词上方,您也可以更改整个单词,这篇文章可能会很有趣来发现这个单词导航 RichTextBox 中的单词 http://blogs.msdn.com/prajakta/archive/2006/11/01/navigate-words-in-richtextbox.aspx.