RichTextBox помещает перевод строки в свойство текста элемента Run - PullRequest
0 голосов
/ 17 марта 2011

Я хотел бы иметь возможность вставлять текст непосредственно в элемент управления RichTextBox, сохраняя вкладки, переводы строк и новые строки.

К сожалению, при вставке текста из буфера обмена (Ctrl-V) символы '\ r' помещаются в свойство Text элемента Run, а не переводятся в элемент <LineBreak />.

Итак, учитывая вставленный текст:

Et harum quidem rerum facilis est et Expandita Distinctio.

Nam libero tempore, cum soluta nobis Есть Eligendi Optio Cumque Nihil Impedit Quo минус ID Максимальное значение placeat facere possimus, omnis волюты предполагаем, омнис долор repellendus.

и ...

<RichTextBox x:Name="rtbNoteText" BorderBrush="Gray" xml:space="preserve" AcceptsReturn="True" TextWrapping="Wrap" 
                     BorderThickness="1" HorizontalAlignment="Stretch" Grid.Row="1"
                     VerticalAlignment="Stretch" Margin="30,0,30,30" FontSize="14"
                    VerticalScrollBarVisibility="Visible"   HorizontalScrollBarVisibility="Auto" />



private void btnSaveNote_Click(object sender, RoutedEventArgs e)
{
if (!string.IsNullOrEmpty(rtbNoteText.Xaml)) {

string contents = rtbNoteText.Xaml;

}                
}

содержимое rtbNoteText.Xaml:

<Section xml:space=\"preserve\" HasTrailingParagraphBreakOnPaste=\"False\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">
    <Paragraph FontSize=\"14\" FontFamily=\"Portable User Interface\" Foreground=\"#FF000000\" FontWeight=\"Normal\" FontStyle=\"Normal\" FontStretch=\"Normal\" TextAlignment=\"Left\">
    <Run Text=\"Et harum quidem rerum facilis est et expedita distinctio. \r\rNam libero tempore, cum         soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.\" />
</Paragraph>
</Section>

rtbNoteText.Replace("\r","<LineBreak />") не сработает, потому что переводы строк встроены в текстовое свойство элемента Run.

Есть ли стандартный подход к этому вместо этого?:

<Section>
  <Paragragh>
    <Run>...</Run>
    <LineBreak /><LineBreak />
    <Run>...</Run>
  </Paragraph>
</Section>

1 Ответ

0 голосов
/ 18 марта 2011

Вы можете создать объект Paragraph вручную, добавив объект для каждой строки вашего текста и всякий раз, когда требуется разрыв строки. Вы можете разбить текст на строки, используя метод String.Split .

Ниже приведен пример:

string text = "Et harum quidem rerum facilis est et expedita distinctio.\r\r" +
                "Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod\r" +
                "maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.";

// I guess this how you are updating the textbox right now
//richTextBox.Selection.Text = text;

Paragraph paragraph = new Paragraph();            
string[] lines = text.Split(new char[] {'\r'});
for (int i = 0; i < lines.Length; i++)
{
    paragraph.Inlines.Add(new Run() { Text = lines[i] });
    if (i < lines.Length - 1) paragraph.Inlines.Add(new LineBreak());
}
richTextBox.Blocks.Add(paragraph);

он должен вернуть вам следующий xaml через свойство richTextBox.Xaml:

<Section xml:space="preserve" HasTrailingParagraphBreakOnPaste="False" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <Paragraph FontSize="11" FontFamily="Portable User Interface" Foreground="#FF000000" FontWeight="Normal" FontStyle="Normal" FontStretch="Normal" TextAlignment="Left">
   <Run Text="Et harum quidem rerum facilis est et expedita distinctio." />
   <LineBreak />
   <Run />
   <LineBreak />
   <Run Text="Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod" />
   <LineBreak />
   <Run Text="maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus." />
  </Paragraph>
</Section>

надеюсь, это поможет, с уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...