根据Microsoft的快速入门:添加文本输入和编辑控件,如果我想提供某种格式化的文本编辑器,我应该使用 RichEditBox。不幸的是,他们在例子中是如此节俭。提供的示例仅显示如何加载 RTF 文件进行显示。它没有说明如何允许用户操作文档。例如,我想添加典型的格式按钮,如 B
,I
让用户更改即将到来的/所选文本的格式。但是,我应该怎么做才能处理来自软件键盘的用户输入呢?我的想象是键盘提供"原始"字符输入,我需要正确检测和应用样式。
如果我有办法对用户输入做出反应,下一个问题是以编程方式更新基础文档。假设我想将用户选择更改为一些新文本。
// Change selected text; let assume I magically get the text whose format I should update and add necessary RTF stuffs; for testing, can use
String^ newText = "{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\parn{\b bold}\par}";
mRichEditBox->Document->Selection->SetText(TextSetOptions::FormatRtf, newText);
// After the above line, mRichEditBox loses focus & the keyboard is dismissed so I attempt to focus it programmatically & bring back the keyboard.
Editor->Focus(Windows::UI::Xaml::FocusState::Keyboard);
// By default, after SetText, the updated text will be selected, this will put the cursor after changed text; so user can continue adding text
mRichEditBox->Document->Selection->Collapse(false);
暂时原谅反复调高/调低键盘的烦人UI问题:例如用户按t
,我通过上面的代码使t加粗,系统自动关闭键盘,代码将其带回,并将光标放在t之后,用户可以按e
,我通过上面的代码使e加粗, 系统自动关闭键盘,代码将其调回,并将光标放在 E 之后,依此类推。每次 RichEditBox 熄灭/聚焦时,由于 RichEditBox 的背景颜色发生变化,屏幕都会闪烁。你猜猜这个故事。但这可能是因为我暂时使用按钮来触发更改。
更严重的问题是聚焦问题:有时它会带回键盘,有时不会。即使它确实带回了键盘,键盘现在也失效了:按下键不再插入文本,就好像键盘失去了目标一样!?更糟糕的是:我的手机在执行这些程序化替换几次后重新启动!
任何人都可以确认这是现有的操作系统问题,或者我可以做些什么来解决它?
你不需要将自己的RTF插入到RichEditBox中。通常,只有在保存或还原REB时才会执行此操作。
要更改所选内容的字符属性(如颜色、粗体、斜体等),请获取所选范围并更新其字符格式。在该范围内添加的新文本将继承其周围的格式,因此当用户不断键入时,新文本将自动遵循前面的格式。应用不应尝试对输入窗格的打开和关闭进行二次猜测。
有关详细信息,请参阅 MSDN 上的 Xaml 文本编辑示例中的方案 6。以下是快速预览:
void Scenario6::BoldButtonClick(Object^ sender, RoutedEventArgs^ e)
{
ITextSelection^ selectedText = editor->Document->Selection;
if (selectedText != nullptr)
{
ITextCharacterFormat^ charFormatting = selectedText->CharacterFormat;
charFormatting->Bold = FormatEffect::Toggle;
selectedText->CharacterFormat = charFormatting;
}
}