【问题标题】:How to use RichEditBox to provide formatted text如何使用 RichEditBox 提供格式化文本
【发布时间】:2015-05-17 20:29:21
【问题描述】:

根据微软的Quickstart: adding text input and editing controls,如果我想提供某种格式化的文本编辑器,我应该使用RichEditBox。不幸的是,他们在例子中非常节俭。提供的示例仅说明如何加载 RTF 文件进行显示。它没有说明如何允许用户操作文档。例如,我想添加典型的格式化按钮,如BI,让用户更改即将到来/选定文本的格式。但是,我应该怎么做才能处理来自软件键盘的用户输入呢?我的想象是键盘提供“原始”字符输入,我需要正确检测和应用样式。

如果我有办法对用户输入做出反应,那么下一个问题是以编程方式更新基础文档。假设我想将用户选择更改为一些新文本。

 // 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 的背景颜色发生变化,屏幕会闪烁。你猜故事。但这可能是因为我暂时使用按钮来触发更改。

更严重的问题是对焦问题:有时它会带回键盘,有时却没有。即使它确实带回了键盘,键盘现在也失效了:按键不再插入文本,就好像键盘失去了它的目标一样!?更糟糕的是:我的手机在执行了几次程序化替换后重新启动!

谁能确认这是一个现有的操作系​​统问题,或者我可以做些什么来解决它?

【问题讨论】:

    标签: xaml windows-phone-8.1 winrt-xaml c++-cx richeditbox


    【解决方案1】:

    您无需将自己的 RTF 插入 RichEditBox。通常,您只会在保存或恢复 REB 时这样做。

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

    有关更多详细信息,请参阅 MSDN 上Xaml text editing sample 中的场景 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 上。我尝试使用查找/替换来扩展示例(添加一个新的文本框、“查找下一个”、“替换”按钮并使用editor->Document->Selection->SetText(TextSetOptions::None, replaceText)。它在我的 Windows 8.1 笔记本电脑上运行良好,但在多次更换后它会重新启动我的手机 [Windows 10 Insider preview]。这是 Windows 10 中的已知错误吗?
    • 你能帮我解决这个stackoverflow.com/questions/29170757/…吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多