Xaml 如何使用RichEditBox提供格式化文本

Xaml 如何使用RichEditBox提供格式化文本,xaml,windows-phone-8.1,winrt-xaml,c++-cx,richeditbox,Xaml,Windows Phone 8.1,Winrt Xaml,C++ Cx,Richeditbox,根据微软的说法,如果我想提供某种格式的文本编辑器,我应该使用。不幸的是,他们在例子中如此节俭。提供的示例仅显示如何加载RTF文件以进行显示。它没有说明如何允许用户操作文档。例如,我想添加典型的格式化按钮,如B,I,以允许用户更改即将出现/选定文本的格式。但是,我应该如何处理来自软件键盘的用户输入呢?我的想象是,键盘提供“原始”字符输入,我需要正确地检测和应用样式 如果我有办法对用户输入做出反应,那么下一个问题就是以编程方式更新底层文档。假设我想将用户选择更改为一些新文本 // Change s

根据微软的说法,如果我想提供某种格式的文本编辑器,我应该使用。不幸的是,他们在例子中如此节俭。提供的示例仅显示如何加载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\\par\n{\\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时才能执行此操作

要更改选定内容的字符属性(如颜色、粗体、斜体等),请获取选定范围并更新其CharacterFormat。在该范围内添加的新文本将继承其周围的格式,因此当用户继续键入时,新文本将自动遵循前面的格式。应用程序不应该试图猜测输入窗格的打开和关闭

有关更多详细信息,请参阅MSDN中的场景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; 
    } 
} 

谢谢你的推荐。在示例中使用的设置
IsTabStop=“False”
似乎会在单击按钮时禁用
RichEditBox
上的自动取消聚焦。我尝试用Find/replace(添加一个新的文本框,按钮“查找下一步”,“替换”并使用
编辑器->文档->选择->设置文本(TextSetOptions::None,replaceText
)来扩展这个示例。它在我的Windows 8.1笔记本电脑上运行良好,但会重新启动我的手机[Windows 10 Insider preview]几次更换后。这是Windows 10中已知的错误吗?你能帮我解决这个问题吗?