基本上,您应该使用TextView 中的底层TextBuffer。
选择
要剪切、复制和粘贴,首先我们应该选择我们想要复制的部分(或检查缓冲区是否已经有一些选择),要选择一个部分,我们应该得到一个类型为 TextIter 的迭代器从缓冲区,我们可以这样做:
这是 SelectAll 的示例:
var start = textview.Buffer.GetIterAtOffset (0);
var end = textview.Buffer.GetIterAtOffset (0);
end.ForwardToEnd ();
textview.Buffer.SelectRange (start, end);
这是一个从文本中选择范围 [2,4] 的示例:
var start = textview.Buffer.GetIterAtOffset (0);
start.ForwardChars (2);
var end = textview.Buffer.GetIterAtOffset (0);
end.ForwardChars (4);
textview.Buffer.SelectRange (start, end);
TextIter 具有广泛的范围选择方法,例如 ForwardChars() 有一个孪生方法 BackwardChars()。
要检查我们的TextBuffer 是否有任何选择,我们应该使用HasSelection 属性:
var hasSelection = textview.Buffer.HasSelection;
使用剪贴板
现在我们有了一个选定的文本,我们可以简单地将它与剪贴板操作一起使用。
这是切割选定范围[2,4]的示例:
var clipboard = textview.GetClipboard (Gdk.Selection.Clipboard);
var start = textview.Buffer.GetIterAtOffset (0);
start.ForwardChars (2);
var end = textview.Buffer.GetIterAtOffset (0);
end.ForwardChars (4);
textview.Buffer.SelectRange (start, end);
textview.Buffer.CutClipboard (clipboard, true);
复制与剪切非常相似,我们只应将CutClipboard替换为CopyClipboard:
这是复制选定范围[2,4]的示例:
var clipboard = textview.GetClipboard (Gdk.Selection.Clipboard);
var start = textview.Buffer.GetIterAtOffset (0);
start.ForwardChars (2);
var end = textview.Buffer.GetIterAtOffset (0);
end.ForwardChars (4);
textview.Buffer.SelectRange (start, end);
textview.Buffer.CopyClipboard (clipboard, true);
最后从剪贴板粘贴与剪切/复制
非常相似
以下是从剪贴板粘贴一些文本到位置 0 的示例:
var pasteLocation=textview.Buffer.GetIterAtOffset (0);
textview.Buffer.SelectRange (pasteLocation, pasteLocation);
textview.Buffer.PasteClipboard (clipboard);
最终示例:
作为最后一个示例,我们将文本设置为 123456,然后从中剪切 34 并将其粘贴到开头,最终文本应类似于 341256 :
void TextViewSample ()
{
textview.Buffer.Text = "123456";
var clipboard = textview.GetClipboard (Gdk.Selection.Clipboard);
var start = textview.Buffer.GetIterAtOffset (0);
start.ForwardChars (2);
var end = textview.Buffer.GetIterAtOffset (0);
end.ForwardChars (4);
textview.Buffer.SelectRange (start, end);
var hasSelection = textview.Buffer.HasSelection;
textview.Buffer.CutClipboard (clipboard, true);
var pasteLocation = textview.Buffer.GetIterAtOffset (0);
textview.Buffer.SelectRange (pasteLocation, pasteLocation);
textview.Buffer.PasteClipboard (clipboard);
}