Это не так, как ведет себя 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 делает это, это ошибка. Ну, это достаточно легко исправить; избавиться от этого стиля.
Но если вам нужна эта разница по какой-то причине, я не знаю, что вам сказать.