2013-11-08 1 views
-1

Я использую RichEditBox для создания простого редактора.Включение и выключение жирного текста с помощью ITextCharacterFormat в Windows Store/Modern UI App

я нашел кусок кода, который переключает жирный текст на выборе в окне документа

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, это жирный шрифт текста. Результат. Однако все, что я набираю после этой точки, также выделено жирным шрифтом.

Это не то, что я ожидал. Согласно приведенному выше коду, я влияю только на формат выбора.

Когда я выбираю текст и нажимаю 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 повторить добавить один?

ответ

0

Это нормальное поведение при использовании SelectionFont и установка жирного стиля с richtextbox.

Если текущий текст имеет более одного указанного шрифта, это свойство равно null. Если текст не выбран в данный момент, то указанный шрифт применяется к текущей точке вставки и ко всему текст, который вводится в элемент управления после точки вставки.

Возможно, это та же проблема, что и у вас. Wordpad и Word работают так же.

+0

'Если текста не является в настоящее время selected' Обратите внимание мою линию логики' если (Editor.Document.Selection.Text.Length> 0) '. Это происходит, когда я сделал выделение в документе.Я хочу, чтобы он работал так, как работает Wordpad и Word, но в настоящее время он ведет себя по-другому. Когда я ** сделал выбор, он выделяет и выделение и включает полужирный режим. – roryok

+0

В слове и слоте, если вы набираете текст сразу после текста, выделенного полужирным шрифтом, с помощью Ctrl + B, он будет выделен жирным шрифтом. Разве это не то, что у вас уже есть? – Jerry

+0

Вышеприведенная цитата применяется, когда вы вводите текст после полужирного текста после нажатия ctrl + B. Если «SelectionFont» выделен жирным шрифтом, текст, который вы вводите, выделен жирным шрифтом. Свойство 'SelectionFont' принимает форматирование текста непосредственно перед курсором. – Jerry

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; 
      } 
     } 
    } 
} 

Это не идеально, потому что после того, как вы выделили и выделили текст, он будет автоматически отменен. Однако на практике я нахожу, что это на самом деле отлично работает для меня. Тем не менее, он чувствует, как взломать, потому что является хаком