RichTextBox не работает должным образом - PullRequest
4 голосов
/ 28 февраля 2010

Когда я впервые запускаю свою программу и набираю текст в поле richtextbox, если я нажимаю клавишу ввода, в результате чего карат перемещается на новую строку, а затем нажимает клавишу Backspace вместо перехода на предыдущую строку, он просто сдвигается назад хотя я не набрал текст в этой новой строке. Я не могу понять, что происходит. Что я делаю неправильно? И как я могу это исправить?

Edit:

Похоже, что richtextbox добавляет пробел перед первым символом, когда я начинаю печатать, и пробел добавляется перед каждой новой строкой, которую я делаю. Я не могу поместить карат перед пробелом, щелкая перед ним, но я могу удалить его, используя клавишу возврата, и тогда все возвращается к нормальной жизни.

Редактировать 2: Это код, который, кажется, вызывает проблему, но я не могу понять, почему он это делает:

<RichTextBox.Resources>
     <Style TargetType="{x:Type Paragraph}">
            <Setter Property="Margin" Value="5"/>
     </Style>
</RichTextBox.Resources>

1 Ответ

4 голосов
/ 28 февраля 2010

Это не так, как ведет себя RichTextBox, если я просто положу это в Kaxaml:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid>  
    <RichTextBox/>
  </Grid>
</Page>

Это заставляет меня подозревать, что с вашим кодом происходит что-то еще. Что это?

Edit:

Ну, ладно, понятно, почему вы ставите «пробел» перед кареткой: вы применяете стиль к абзацам, который устанавливает поле. В all непонятно, почему нажатие BACKSPACE заставляет его исчезнуть.

Как устранить проблему, подобную этой: добавьте обработчик событий в RichTextBox (я использовал KeyUp) и используйте XamlWriter, чтобы вывести его свойство Document в Console.Out. Вы увидите, что при первом заполнении Document содержит:

<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <Paragraph />
</FlowDocument>

После того, как вы нажмете BACKSPACE, это будет выглядеть так:

<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <Paragraph Margin="0,5,5,5" />
</FlowDocument>

Гораздо более очевидно, что происходит, если вы установите поле в своем стиле равным 50 вместо 5. "Пробел", который вы видите перед абзацем, фактически является левым полем абзаца, установленным стиль в словаре ресурсов RTB. Поскольку у абзаца нет локального свойства Margin, он наследует поле от стиля.

Когда вы нажимаете BACKSPACE, для левого поля устанавливается значение 0. Это дает свойству Margin локальное значение абзаца, поэтому оно перестает наследовать от стиля.

Если вы нажмете клавишу ВВОД и добавите новый абзац, новый абзац скопирует поля предыдущего абзаца. Так что, по сути, ваш стиль перестает работать.

Кажется, это ошибка в том, как RTB реализует EditingCommands.Backspace. Что эта команда должна делать, официально:

При вызове пустого выделения эта команда удаляет символ или разделитель абзацев непосредственно перед кареткой. При вызове для непустого выбора эта команда удаляет выбор.

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

Я думаю, довольно ясно, что это не то, что он на самом деле делает. Фактически, если вы установите поле равным 50, становится ясно, что когда каретка находится в начале абзаца с полем и вы нажимаете BACKSPACE, это уменьшает левое поле этого абзаца на 20. Я не вижу никакого документированного обоснования. за такое поведение.

Итак, что вы можете с этим поделать? Это отчасти зависит от того, почему вы устанавливаете этот запас в первую очередь. Исходя из вашего первоначального описания, кажется, что вы думаете, что это запас, а не тот факт, что BACKSPACE делает это, это ошибка. Ну, это достаточно легко исправить; избавиться от этого стиля.

Но если вам нужна эта разница по какой-то причине, я не знаю, что вам сказать.

...