Vb.net RichTextBox-保留原始格式(字体),即使粘贴后也是如此

Vb.net RichTextBox-保留原始格式(字体),即使粘贴后也是如此,vb.net,fonts,richtextbox,paste,Vb.net,Fonts,Richtextbox,Paste,我需要使用一个RichTextBox,而不是一个普通的textbox,因为它保持插入符号位置的方式,从一行到另一行但我需要始终保持文本的相同字体,即使它已粘贴。 目前,我让它选择整个文本并将字体更改为原始字体(Lucida Console),但当粘贴到其中时,它看起来很可怕,因为它闪烁蓝色。如果您以编程方式处理粘贴,请不要使用该方法。而是使用Clipboard.GetDataObject().GetData(DataFormats.Text)获取字符串中的文本,然后使用Rtf或Text属性将文本

我需要使用一个RichTextBox,而不是一个普通的textbox,因为它保持插入符号位置的方式,从一行到另一行但我需要始终保持文本的相同字体,即使它已粘贴。


目前,我让它选择整个文本并将字体更改为原始字体(Lucida Console),但当粘贴到其中时,它看起来很可怕,因为它闪烁蓝色。

如果您以编程方式处理粘贴,请不要使用该方法。而是使用Clipboard.GetDataObject().GetData(DataFormats.Text)获取字符串中的文本,然后使用Rtf或Text属性将文本添加到RichTextBox:

string s = (string)Clipboard.GetDataObject().GetData(DataFormats.Text);
richTextBox.Text += s;
否则,您可以按Ctrl+V键:

void RichTextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if(e.Control == true && e.KeyCode == Keys.V)
    {
        string s = (string)Clipboard.GetDataObject().GetData(DataFormats.Text);
        richTextBox.Text += s;
        e.Handled = true; // disable Ctrl+V
    }
}

Darin的方法忽略插入符号的位置,并且总是附加到文本的末尾

实际上,有更好的方法。使用RichTextBox.Paste()的重载:


对我来说很有魅力。

Darin和idn的答案都很好,但在粘贴以下富文本时,这两个答案都不起作用:

   This is text after an arrow.
This is a new line
字体将始终更改为WingDings。我从Word中复制了以下内容:

具体地说,上面@idn描述的纯文本格式方法确实只是粘贴纯文本,但字体也发生了变化

下面的代码处理KeyUp事件,仅选择所有文本并替换其原始颜色和字体(即格式)。为了确保这不会在屏幕上显示为闪烁,使用了一个。控件绘图禁用发生在KeyDown事件中,RichTextBox控件自行处理粘贴事件,然后在结束时重新启用控件绘图。最后,这仅适用于CTL+V和SHIFT+INS,它们都是标准的粘贴命令:

    /// <summary>
    /// An application sends the WM_SETREDRAW message to a window to allow changes in that 
    /// window to be redrawn or to prevent changes in that window from being redrawn.
    /// </summary>
    private const int WM_SETREDRAW = 11; 

    private void txtRichTextBox_KeyDown(object sender, KeyEventArgs e)
    {
        // For supported Paste key shortcut combinations, suspend painting
        // of control in preparation for RTF formatting updates on KeyUp
        if ((e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.V) || // CTL+V
            (!e.Control && e.Shift && !e.Alt && e.KeyCode == Keys.Insert)) // SHIFT+INS
        {
            // Send Suspend Redraw message to avoid flicker. Drawing is 
            // restored in txtRichTextBox_KeyUp event handler
            // [this.SuspendLayout() doesn't work properly] 
            Message msgSuspendUpdate = Message.Create(
                txtRichTextBox.Handle, WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero);
            NativeWindow window = NativeWindow.FromHandle(txtRichTextBox.Handle);
            window.DefWndProc(ref msgSuspendUpdate);
        }
    }

    private void txtRichTextBox_KeyUp(object sender, KeyEventArgs e)
    {
        // Following supported Paste key shortcut combinations, restore
        // original formatting, then resume painting of control.
        if ((e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.V) || // CTL+V
            (!e.Control && e.Shift && !e.Alt && e.KeyCode == Keys.Insert)) // SHIFT+INS
        {
            // Layout already suspended during KeyDown event

            // Capture cursor position. Cursor will later be placed 
            // after inserted text
            int selStart = txtRichTextBox.SelectionStart;
            int selLen = txtRichTextBox.SelectionLength;

            // Replace all text with original font & colours
            txtRichTextBox.SelectAll();
            txtRichTextBox.SelectionFont = txtRichTextBox.Font;
            txtRichTextBox.SelectionColor = txtRichTextBox.ForeColor;
            txtRichTextBox.SelectionBackColor = txtRichTextBox.BackColor;

            // Restore original selection
            txtRichTextBox.SelectionStart = selStart;
            txtRichTextBox.SelectionLength = selLen;

            txtRichTextBox.ScrollToCaret();

            // Resume painting of control
            IntPtr wparam = new IntPtr(1); // Create a C "true" boolean as an IntPtr
            Message msgResumeUpdate = Message.Create(
                txtRichTextBox.Handle, WM_SETREDRAW, wparam, IntPtr.Zero);
            NativeWindow window = NativeWindow.FromHandle(txtRichTextBox.Handle);
            window.DefWndProc(ref msgResumeUpdate);
            txtRichTextBox.Invalidate();
            txtRichTextBox.Refresh();
        }
    }

可能使用
richTextBox.SelectedText=s则相反,否则粘贴后光标会跳回起始位置。
    /// <summary>
    /// An application sends the WM_SETREDRAW message to a window to allow changes in that 
    /// window to be redrawn or to prevent changes in that window from being redrawn.
    /// </summary>
    private const int WM_SETREDRAW = 11; 

    private void txtRichTextBox_KeyDown(object sender, KeyEventArgs e)
    {
        // For supported Paste key shortcut combinations, suspend painting
        // of control in preparation for RTF formatting updates on KeyUp
        if ((e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.V) || // CTL+V
            (!e.Control && e.Shift && !e.Alt && e.KeyCode == Keys.Insert)) // SHIFT+INS
        {
            // Send Suspend Redraw message to avoid flicker. Drawing is 
            // restored in txtRichTextBox_KeyUp event handler
            // [this.SuspendLayout() doesn't work properly] 
            Message msgSuspendUpdate = Message.Create(
                txtRichTextBox.Handle, WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero);
            NativeWindow window = NativeWindow.FromHandle(txtRichTextBox.Handle);
            window.DefWndProc(ref msgSuspendUpdate);
        }
    }

    private void txtRichTextBox_KeyUp(object sender, KeyEventArgs e)
    {
        // Following supported Paste key shortcut combinations, restore
        // original formatting, then resume painting of control.
        if ((e.Control && !e.Shift && !e.Alt && e.KeyCode == Keys.V) || // CTL+V
            (!e.Control && e.Shift && !e.Alt && e.KeyCode == Keys.Insert)) // SHIFT+INS
        {
            // Layout already suspended during KeyDown event

            // Capture cursor position. Cursor will later be placed 
            // after inserted text
            int selStart = txtRichTextBox.SelectionStart;
            int selLen = txtRichTextBox.SelectionLength;

            // Replace all text with original font & colours
            txtRichTextBox.SelectAll();
            txtRichTextBox.SelectionFont = txtRichTextBox.Font;
            txtRichTextBox.SelectionColor = txtRichTextBox.ForeColor;
            txtRichTextBox.SelectionBackColor = txtRichTextBox.BackColor;

            // Restore original selection
            txtRichTextBox.SelectionStart = selStart;
            txtRichTextBox.SelectionLength = selLen;

            txtRichTextBox.ScrollToCaret();

            // Resume painting of control
            IntPtr wparam = new IntPtr(1); // Create a C "true" boolean as an IntPtr
            Message msgResumeUpdate = Message.Create(
                txtRichTextBox.Handle, WM_SETREDRAW, wparam, IntPtr.Zero);
            NativeWindow window = NativeWindow.FromHandle(txtRichTextBox.Handle);
            window.DefWndProc(ref msgResumeUpdate);
            txtRichTextBox.Invalidate();
            txtRichTextBox.Refresh();
        }
    }
var t = txtRichTextBox.Text;
txtRichTextBox.Text = t;