Tôi có hộp văn bản có định dạng (richTextBox1
) trong chương trình của tôi như được hiển thị bên dưới. Nhưng khi tôi nhấp chuột phải vào nó, nó không bật lên một cửa sổ "copy, cut, past". Bạn có thể vui lòng cho tôi biết cách tôi có thể bật cửa sổ “sao chép, cắt, quá khứ” này trong Hộp văn bản có định dạng của tôi không? Tôi mới đến C#, xin vui lòng cho tôi biết từng bước, nếu bạn biết làm thế nào để giải quyết nàyBật cửa sổ sao chép, cắt, quá khứ trong hộp văn bản có định dạng
Trả lời
Hãy thử với mã này
UPDATED CODE:
private void richTextBox1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{ //click event
//MessageBox.Show("you got it!");
ContextMenu contextMenu = new System.Windows.Forms.ContextMenu();
MenuItem menuItem = new MenuItem("Cut");
menuItem.Click += new EventHandler(CutAction);
contextMenu.MenuItems.Add(menuItem);
menuItem = new MenuItem("Copy");
menuItem.Click += new EventHandler(CopyAction);
contextMenu.MenuItems.Add(menuItem);
menuItem = new MenuItem("Paste");
menuItem.Click += new EventHandler(PasteAction);
contextMenu.MenuItems.Add(menuItem);
richTextBox1.ContextMenu = contextMenu;
}
}
void CutAction(object sender, EventArgs e)
{
richTextBox1.Cut();
}
void CopyAction(object sender, EventArgs e)
{
Graphics objGraphics;
Clipboard.SetData(DataFormats.Rtf, richTextBox1.SelectedRtf);
Clipboard.Clear();
}
void PasteAction(object sender, EventArgs e)
{
if (Clipboard.ContainsText(TextDataFormat.Rtf))
{
richTextBox1.SelectedRtf
= Clipboard.GetData(DataFormats.Rtf).ToString();
}
}
nếu bạn muốn sao chép dán bằng một ứng dụng khác như notepad (without styles)
, hãy thay thế các phương thức sau
void CopyAction(object sender, EventArgs e)
{
Clipboard.SetText(richTextBox1.SelectedText);
}
void PasteAction(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
{
richTextBox1.Text
+= Clipboard.GetText(TextDataFormat.Text).ToString();
}
}
Cảm ơn rất nhiều vì đã cho tôi xem một ví dụ. Để sử dụng mã này, tôi có phải tạo một 'MenuStrip' không? bởi vì khi tôi sử dụng mã của bạn 'private void richTextBox1_MouseUp (đối tượng người gửi, MouseEventArgs e)' đã không được gọi. Nếu tôi kích đúp vào 'richTextBox1' như hiển thị trong ảnh gốc, nó sẽ tự động tạo ra các mã tại' Form1.Designer.cs' và 'Form1.cs': -' private void richTextBox1_TextChanged (đối tượng người gửi, EventArgs e) 'Có thể bạn vui lòng cho tôi biết tôi nên làm gì để làm cho chương trình của tôi tạo mã cho 'private void richTextBox1_MouseUp (đối tượng người gửi, MouseEventArgs e)' –
chỉ cần nhấp vào thuộc tính của controllerTextBox và kiểm tra tab Sự kiện bạn có thể tìm thấy sự kiện đó. Chỉ cần nhấp đúp vào Sự kiện MouseUp. –
Cảm ơn bạn rất nhiều vì đã cung cấp cho tôi tất cả những thông tin này. Nếu tôi đã làm 'copy, cut, past' những thứ chỉ bên trong' richTextBox1', nó hoạt động. Nếu tôi cắt từ 'richTextBox1' và quá khứ trong một notepad, nó cũng hoạt động. Nhưng nếu tôi cố gắng sao chép từ 'richTextBox1' và dán nó vào một notepad, nó không hoạt động. Và quan trọng nhất, nếu tôi có một số văn bản trong sổ ghi chú mà tôi muốn sao chép sang 'richTextBox1' này, mã không hoạt động. Cảm ơn rất nhiều vì đã tìm hiểu điều này. –
RichTextBox chuẩn không chứa menu ngữ cảnh để cắt, sao chép và dán. Tuy nhiên, bạn có thể xem this article có mã hoàn chỉnh cần thiết để triển khai mã của riêng bạn!
Nếu bạn có nhiều hơn một RichTextBox sau đó bạn có thể sử dụng extension phương pháp này:
public static void AddContextMenu(this RichTextBox rtb)
{
if (rtb.ContextMenuStrip == null)
{
ContextMenuStrip cms = new ContextMenuStrip { ShowImageMargin = false };
ToolStripMenuItem tsmiCut = new ToolStripMenuItem("Cut");
tsmiCut.Click += (sender, e) => rtb.Cut();
cms.Items.Add(tsmiCut);
ToolStripMenuItem tsmiCopy = new ToolStripMenuItem("Copy");
tsmiCopy.Click += (sender, e) => rtb.Copy();
cms.Items.Add(tsmiCopy);
ToolStripMenuItem tsmiPaste = new ToolStripMenuItem("Paste");
tsmiPaste.Click += (sender, e) => rtb.Paste();
cms.Items.Add(tsmiPaste);
rtb.ContextMenuStrip = cms;
}
}
Và sử dụng nó như thế này: richTextBox1.AddContextMenu();
Một giải pháp đơn giản hoạt động hoàn toàn hoàn hảo. Cảm ơn. Mọi người thực sự dường như quá phức tạp này ... – Nyerguds
Tuyệt vời, tôi sử dụng nó. Nhưng luôn luôn có chỗ để cải thiện - ví dụ: thêm 2 'if (! Rtb.ReadOnly) {' - hoặc những gì có ý nghĩa về màu xám? Bạn cũng có thể thêm một gợi ý nơi để dán này, cho người dùng thiếu kinh nghiệm: nó không thể trong Form1.cs, nhưng trong Program.cs nó hoạt động. –
Cách sử dụng tính năng này được cung cấp trong liên kết mở rộng được cung cấp. –
Tôi nghĩ rằng giải pháp được cung cấp bởi Thilina H là tuyệt vời ngoại trừ vài lỗi.
MouseUp sự kiện làm cho click chuột phải để bắt đầu sau khi nhấp chuột thứ hai. Tôi khuyên bạn nên sử dụng MouseDown sự kiện thay vì MouseUp sự kiện.
Tôi đã được thử nghiệm lần thứ hai Phương thức sao chép. Trong trường hợp của tôi Phương thức CopyAction không sao chép các ký tự nhập. Tôi đã phải chỉnh sửa mã như thế này:
Clipboard.SetText(richTextBox1.SelectedText.Replace("\n", "\r\n"));
Khi richTextBox1.SelectedText trống chương trình cho thấy một ngoại lệ. Tôi chỉ cần chỉnh sửa phương thức CopyAction được hiển thị bên dưới để khắc phục sự cố.
if (chatBox.SelectedText != null && chatBox.SelectedText != "") { Clipboard.SetText(richTextBox1.SelectedText.Replace("\n", "\r\n")); }
Chúc mừng Mã hóa!
Thao tác này để sao chép ký tự dòng mới, nhưng như đã nhận xét ở trên, trình đơn ngữ cảnh @Thilina không phải được tạo mỗi khi bạn nhấp chuột phải vào văn bản. Nó là laggy và bất tiện. Thay vào đó, hãy tạo và đính kèm menu ngữ cảnh tại Form_Load chỉ một lần. –
Nhờ @Jaex
https://stackoverflow.com/a/36624233/5132252
https://stackoverflow.com/a/435510/5132252
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
internal static extern IntPtr GetFocus();
private Control GetFocusedControl()
{
Control focusedControl = null;
// To get hold of the focused control:
IntPtr focusedHandle = GetFocus();
if (focusedHandle != IntPtr.Zero)
// Note that if the focused Control is not a .Net control, then this will return null.
focusedControl = Control.FromHandle(focusedHandle);
return focusedControl;
}
private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
{
var FocusedControl = GetFocusedControl();
if (FocusedControl != null)
switch (FocusedControl.GetType().Name)
{
case "RichTextBox":
{
var RichTextBox = FocusedControl as RichTextBox;
RichTextBox.Paste();
break;
}
case "TextBox":
{
var TextBox = FocusedControl as TextBox;
TextBox.Paste();
break;
}
}
}
}
Trong trường hợp đó bạn cần phải thêm menu ngữ cảnh tiêu chuẩn để nhiều trường RichTextBox sau đó nó có thể tốt hơn để tạo ra thành phần tùy chỉnh mở rộng kế thừa từ RichTextBox. Thành phần mới có thể được thêm từ menu ngữ cảnh dự án của Solution Explorer Add -> New Item ... -> Custom Control.
Bạn cũng có thể xác định trình xử lý để mở menu ngữ cảnh để kiểm tra xem có bất kỳ văn bản nào được chọn hay khay nhớ tạm không trống.
Cũng thường có các hành động chuẩn khác như Xóa văn bản đã chọn hoặc Chọn Tất cả văn bản.
namespace Common
{
public partial class RichTextBoxEx : RichTextBox
{
public RichTextBoxEx()
{
AddContextMenu();
}
public void AddContextMenu()
{
ContextMenuStrip cms = new ContextMenuStrip { ShowImageMargin = false };
ToolStripMenuItem tsmiCut = new ToolStripMenuItem("Cut");
tsmiCut.Click += (sender, e) => Cut();
cms.Items.Add(tsmiCut);
ToolStripMenuItem tsmiCopy = new ToolStripMenuItem("Copy");
tsmiCopy.Click += (sender, e) => Copy();
cms.Items.Add(tsmiCopy);
ToolStripMenuItem tsmiPaste = new ToolStripMenuItem("Paste");
tsmiPaste.Click += (sender, e) => Paste();
cms.Items.Add(tsmiPaste);
ToolStripMenuItem tsmiDelete = new ToolStripMenuItem("Delete");
tsmiDelete.Click += (sender, e) => { SelectedText = ""; };
cms.Items.Add(tsmiDelete);
cms.Items.Add(new ToolStripSeparator());
ToolStripMenuItem tsmiSelectAll = new ToolStripMenuItem("Select All");
tsmiSelectAll.Click += (sender, e) => { SelectionStart = 0; SelectionLength = Text.Length; };
cms.Items.Add(tsmiSelectAll);
cms.Opening += delegate (object sender, CancelEventArgs e)
{
tsmiCut.Enabled = SelectionLength != 0;
tsmiCopy.Enabled = SelectionLength != 0;
tsmiPaste.Enabled = Clipboard.ContainsText();
tsmiDelete.Enabled = SelectionLength != 0;
};
ContextMenuStrip = cms;
}
}
}
Tôi chỉ muốn thêm vào câu trả lời Thilina H của (một trong đó đã được đánh dấu là câu trả lời chính xác bằng các poster) Đây là sao chép và dán chức năng của tôi, Họ là một notepad chút hơn như thế nào.
void CopyAction(object sender, EventArgs e)
{
if (richTextBox1.SelectedText != null && richTextBox1.SelectedText != "")
{
Clipboard.SetText(richTextBox1.SelectedText);
}
}
void PasteAction(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
{
int selstart = richTextBox1.SelectionStart;
if (richTextBox1.SelectedText != null && richTextBox1.SelectedText != "")
{
richTextBox1.Text = richTextBox1.Text.Remove(selstart, richTextBox1.SelectionLength);
}
string clip = Clipboard.GetText(TextDataFormat.Text).ToString();
richTextBox1.Text = richTextBox1.Text.Insert(selstart, clip);
richTextBox1.SelectionStart = selstart + clip.Length;
}
}
Tôi hy vọng nó sẽ giúp ai đó;
RTB không có tích hợp sẵn như TextBox. .NET làm cho chúng trông giống nhau nhưng chúng là các thành phần Windows bản địa rất khác nhau dưới mui xe. Bạn có thể nói một chút bởi đường viền bị vặn. Bạn sẽ phải tự tạo, sử dụng ContextMenuStrip. –
WPF 'RichTextBox' không có menu này. Chỉ cần nói. Có lẽ đó là một ý tưởng tốt để không bắt đầu một dự án mới trong một công nghệ di sản bị hỏng một chút. – millimoose