使用Windows Store / Modern UI App中的ITextCharacterFormat打开和关闭粗体文本

时间:2013-11-08 15:40:04

标签: c# windows-runtime windows-store-apps richtextbox

我正在使用RichEditBox构建一个简单的编辑器。

我找到了一段代码,用于在文档窗口中的选项上切换粗体文本

private void RichEditBox_KeyDown(object sender, KeyRoutedEventArgs e)
{
    var state = Window.Current.CoreWindow.GetKeyState(Windows.System.VirtualKey.Control);
    if ((state & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down)
    {
        if (e.Key == Windows.System.VirtualKey.B)
        {
            if (Editor.Document.Selection.Text.Length > 0)
            {
                ITextCharacterFormat format = Editor.Document.Selection.CharacterFormat;
                format.Bold = FormatEffect.On;
            }
            else
            {
                // CTRL + B should toggle bold mode on or off here. 
            }
        }
    }
}

当我突出显示一段文字,然后按CTRL+B时,它会加粗文字。结果。但是,在该点之后我输入的任何内容也都是粗体。

这不是我的预期。根据上面的代码,我只影响Selection的格式。

当我选择一些文字并按CTRL+B时,它应该在该选择上切换粗体格式 ,并保留默认格式。

我尝试过使用FormatEffect.Toggle

format.Bold = FormatEffect.Toggle

我已经尝试先保存文档字符格式,然后重新应用

ITextCharacterFormat original_format = Editor.Document.GetDefaultCharacterFormat();
ITextCharacterFormat format = Editor.Document.Selection.CharacterFormat;
format.Bold = FormatEffect.On;
Editor.Document.SetDefaultCharacterFormat(original_format);

这应该将默认值重置为粗体后的状态。但它没有

可以将选择设置为空,然后再次设置format.Bold = FormatEffect.Off,然后重新选择文本,但这似乎是很长的路(它可能不起作用)。必须有一个简单的方法来做到这一点?

注意:我已使用RichTextBox标记对其进行了标记,因为没有RichEditBox标记。有> 1500代表的人可以加一个吗?

2 个答案:

答案 0 :(得分:0)

使用SelectionFont并使用richtextbox设置粗体样式时,这是正常行为。

  

如果当前文本选择指定了多个字体,则为此   property为null。如果当前未选择任何文本,则指定字体   在此属性中应用于当前插入点和所有   在插入点之后键入控件的文本。

这可能与你有同样的问题。 Wordpad和Word也是这样工作的。

答案 1 :(得分:0)

我找到了一个有效的黑客。我发布这个作为任何被卡住的人的答案,但我不接受答案,因为必须有一个更好的答案。

private void RichEditBox_KeyDown(object sender, KeyRoutedEventArgs e)
{
    var state = Window.Current.CoreWindow.GetKeyState(Windows.System.VirtualKey.Control);
    if ((state & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down)
    {
        if (e.Key == Windows.System.VirtualKey.B)
        {
            if (Editor.Document.Selection.Text.Length > 0)
            {
                // text is selected. make it bold
                ITextCharacterFormat format = 
                     Editor.Document.Selection.CharacterFormat;
                format.Bold = FormatEffect.On;

                var start_pos = Editor.Document.Selection.StartPosition;
                Editor.Document.Selection.StartPosition = 
                     Editor.Document.Selection.EndPosition;
                format.Bold = FormatEffect.Off;

                // Editor.Document.Selection.StartPosition = start_pos;   
                // this is where I was re-selecting the text after switching bold OFF
                // but doing so switches it back on again. which makes no sense                     
            }
            else
            {
                // no text selected. just enable bold mode
                ITextCharacterFormat format = 
                     Editor.Document.Selection.CharacterFormat;
                format.Bold = FormatEffect.Toggle;
            }   
        }
    }
}

这并不完美,因为在您选择并加粗文本后,它会自动取消选中。但实际上我发现这对我来说确实很好。不过,感觉就像是黑客,因为 是黑客