【问题标题】:How do I cut, copy, paste and select all in a TextView control?如何在 TextView 控件中剪切、复制、粘贴和全选?
【发布时间】:2014-12-18 13:12:59
【问题描述】:

我正在尝试使用 TextView Gtk 控件剪切、复制、粘贴和全选。为什么是 TextView 控件?因为我似乎无法让该死的 TextEditor 控件变为多行!

无论如何...我该怎么做:

剪切 TextView 控件中的文本?

复制 TextView 控件中的文本?

粘贴文本到 TextView 控件中?

全选 TextView 控件中的文本?


这是我尝试过的: 1小时的谷歌搜索。

还有这个:

TextView tv = ...;
TextIter start, end;
if (tv.Buffer.GetSelectionBounds(start, end)) {
  String selected = tv.Buffer.GetText(start, end);
  Clipboard clipboard = tv.GetClipboard(Gdk.Selection.Clipboard);
  clipboard.Text = selected;
}

来自:https://stackoverflow.com/questions/26308501/gtk-textview-copy-and-paste - 但这显然行不通(这是我的问题)。

我还发现了这个:http://docs.go-mono.com/?link=T%3aGtk.TextView Mono GTK C# 文档。有很多东西似乎不存在。

【问题讨论】:

  • 还是没有答案?请不要告诉我,没有人知道如何在 MonoDevelop C# 应用程序中剪切、复制、粘贴或全选……这种想法真的很可怕。

标签: c# linux gtk monodevelop gtk#


【解决方案1】:

基本上,您应该使用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);
} 

【讨论】:

    【解决方案2】:

    您可以使用一些按钮来执行此操作!实际上是 button1(复制)、button2(粘贴)等 然后您可以读取用户输入 (TextField**.Text**),然后将其 put 放入 array 之后你可以显示你的输出数组(粘贴) 并且对于复制/粘贴输入的选定部分(不是全部),您可以存储索引(从哪个索引到选择结束索引)并在该索引(选定索引)之间读取/写入数据并将用户输入放入数组中并享受它! 我不是 c# 程序员,但我试图让你明白你应该做什么。我希望如此 祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多