Копия RichTextBox имеет дополнительный возврат каретки в конце

Впервые я изучаю элементы управления RichTextBox в формах C# для Windows. Я знаю, что мне нужен этот элемент управления в моем приложении, так как TextBox слишком прост для моих нужд.

У меня есть следующий код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace _19_richtextbox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void richTextBoxHome_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == (char)(Keys.Return))
            {
                richTextBoxChat.AppendText("Home:" + richTextBoxHome.Text + "\n");
                richTextBoxHome.Clear();
            }
        }
    }
}

На данный момент я просто хочу, чтобы все, что набирается в одном RichTextBox, отображалось в другом RichTextBox при нажатии Return.

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


Я хотел бы выделить часть «Дом:» жирным шрифтом.

Я нашел очень мало информации об этом в моих поисках. ниже приведен единственный фактический код, который я мог понять.

rtb1.Rtf = @"{\rtf1\ansi {\b hello} {\i World}}" ; 
richTextBox1.Rtf = @"{\rtf1\ansi This is in \b bold\b0.}";

Я не уверен, как поступить с этой информацией. я просто хочу, чтобы RichTextBox отображал «Home:» и «Away:» жирным шрифтом и мог обрабатывать URL-адреса в тексте.

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

еще раз спасибо за проявленный интерес.


Я добился прогресса в своем вопросе и подумал поделиться.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace _19_richtextbox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void richTextBoxHome_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)(Keys.Enter))
            {
                e.Handled = true;

                // richTextBoxChat.Rtf = @"{\rtf1 \b Home: \bO}" + @richTextBoxHome;

                // do not delete next 2 lines
                //string test = @"{\rtf1 \b Home: \b0";
                //test = test + richTextBoxHome.Rtf + "}";

                string chatBuffer = richTextBoxChat.Rtf;

                string buffer = @"{\rtf1";
                buffer = buffer + chatBuffer;

                buffer = buffer + @"\b Home:\b0";

                buffer = buffer + richTextBoxHome.Rtf + "}";


               // MessageBox.Show(buffer);
                richTextBoxChat.Rtf = buffer;
                //do not delete the following 2 lines
                //richTextBoxChat.AppendText("Home:" + richTextBoxHome.Text);
                richTextBoxHome.Clear();
            }
        }

    }
}

просто нужно выяснить, как избавиться от новых строк/возвратов каретки в тексте.

любые советы приветствуются.

Благодарю.


это не тренировалось так хорошо. вместо этого использовал приведенное ниже.

            this.richTextBoxChat.SelectionFont = new Font(this.richTextBoxChat.Font.FontFamily, this.Font.Size, FontStyle.Bold);
            richTextBoxChat.AppendText("Home: ");
            this.richTextBoxChat.SelectionFont = new Font(this.richTextBoxChat.Font.FontFamily, this.Font.Size, FontStyle.Regular);
            richTextBoxChat.AppendText(richTextBoxHome.Text);
            richTextBoxChat.ScrollToCaret();
            richTextBoxHome.Clear();

person iTEgg    schedule 14.12.2009    source источник
comment
Почему они принимают многострочный ввод, если вы не хотите, чтобы они могли нажимать return и вызывать новую строку?   -  person Brett Allen    schedule 14.12.2009
comment
Потому что вы не можете переносить текст во вторую строку, если не разрешено показывать вторую строку. Свойство MultiLine указывает, следует ли отображать более одной строки текста, и текст не будет переноситься, если MultiLine не имеет значения true, независимо от свойства WordWrap.   -  person Jeremy S    schedule 14.12.2009


Ответы (4)


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

Попробуй это:

    private void richTextBoxHome_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyValue == (char)(Keys.Return))
        {
            richTextBoxChat.AppendText("Home:" + richTextBoxHome.Text + "\n");
            richTextBoxHome.Clear();

            e.Handled = true;
            e.SuppressKeyPress = true;

        }
    }

Изменить: добавлено e.SuppressKeyPress = true; Кори Чарльтон указал на это в своем посте.

Редактировать: также, как уже упоминалось, используйте обработчик событий KeyPress, поэтому, если кто-то удерживает клавишу ввода/возврата, событие запускается снова и снова. пример использования следующий:

    private void richTextBoxHome_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar.Equals((Char) Keys.Enter))
        {
            richTextBoxChat.AppendText("Home:" + richTextBoxHome.Text + "\n");
            richTextBoxHome.Clear();

            e.Handled = true;
        }
    }

Редактировать. Кроме того, в RichTextBox можно установить свойство, чтобы запретить ввод многострочных строк в текстовое поле. Это создает проблему при вставке контента с несколькими строками, он займет только первую строку.

Для слов, выделенных жирным шрифтом. Вы можете изменить SelectionFont элемента RichTextBox, чтобы установить его атрибуты шрифта:

    private readonly Font BoldSelectionFont = new Font("Arial", 9.0f, FontStyle.Bold);
    private readonly Font RegSelectionFont = new Font("Arial", 9.0f, FontStyle.Regular);

...
                richTextBoxChat.SelectionFont = BoldSelectionFont;
                richTextBoxChat.AppendText("Home: ");
                richTextBoxChat.SelectionFont = RegSelectionFont;
                richTextBoxChat.AppendText(richTextBoxHome.Text + "\n");
...
person Michael G    schedule 14.12.2009
comment
может добавить проверку на несколько нажатий клавиш, например Ctrl+Enter? Затем пользователь может вставлять разрывы строк, не вызывая вставки. возможно, даже изменить его, чтобы использовать Ctrl + Enter для запуска вставки. - person Jeremy S; 14.12.2009
comment
@Jeremy Seghi: Хорошо, я просто пытался сообщить ОП о проблеме, которую может вызвать MultiLine. ;) - person Michael G; 14.12.2009

Используйте KeyPress вместо KeyDown и установите e.Handled=true

person Chris Haas    schedule 14.12.2009
comment
Дополнительные сведения о KeyPress и KeyDown: support.microsoft.com/kb/326442 - person Chris Haas; 14.12.2009

Чтобы подавить событие KeyDown, напишите e.Handled = true.

Кроме того, лучший способ проверить, какая клавиша была нажата, это написать if (e.KeyCode == Keys.Enter)

person SLaks    schedule 14.12.2009
comment
спасибо всем вам! Я обнаружил, что как начинающий программист много времени тратит на решение этих мелких проблем, и Google иногда не может помочь. спасибо вам за всю вашу помощь в этом вопросе. - person iTEgg; 14.12.2009

Обработка и подавление нажатия клавиши:

    private void richTextBoxHome_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyValue == (char)(Keys.Return))
        {
            richTextBoxChat.AppendText("Home:" + richTextBoxHome.Text + "\n");
            richTextBoxHome.Clear();

            e.Handled = true;
            e.SuppressKeyPress = true;
        }
    }
person Cory Charlton    schedule 14.12.2009
comment
+1 от меня, я пропустил SuppressKeyPress; не уверен, что e.Handled больше не нужен. ;) - person Michael G; 14.12.2009