代码之家  ›  专栏  ›  技术社区  ›  Patrice Cote

管理剪切、复制粘贴按钮的可用性.NET WinForms

  •  1
  • Patrice Cote  · 技术社区  · 15 年前

    我正在用vb.net开发一个winforms解决方案。我基本上是个网页开发人员已经有一段时间了。所以我需要做的是复制Microsoft Office产品的行为 剪切、复制、粘贴和撤消 菜单和工具栏。哪些会议,我需要启用 抄写 什么时候 只有当 表单上有一些选定的文本。这个 粘贴 只有当剪贴板中有某些文本时,才能启用菜单。

    你对如何做到这一点有什么想法吗?我可能需要检查文本框中的某些事件,以检查是否选择了某些文本(mouseup?)。然后在Enter事件中,我将检查剪贴板中是否有要启用的内容。 粘贴 菜单…

    如果你有什么建议,样品等,我会非常感谢的!

    谢谢!

    3 回复  |  直到 15 年前
        1
  •  1
  •   Hans Passant    15 年前

    application.idle事件很适合这样做,它在检索到最后一个输入事件后运行。您只需要检查当前活动控件是否能够复制/粘贴。使用带有3个按钮的工具栏,使表单的代码看起来与此类似:

    Public Class Form1
        Public Sub New()
            InitializeComponent()
            AddHandler Application.Idle, AddressOf UpdateButtons
        End Sub
    
        Protected Overrides Sub OnFormClosing(ByVal e As System.Windows.Forms.FormClosingEventArgs)
            RemoveHandler Application.Idle, AddressOf UpdateButtons
            MyBase.OnFormClosing(e)
        End Sub
    
        Private Sub UpdateButtons(ByVal sender As Object, ByVal e As EventArgs)
            Dim box = TryCast(Me.ActiveControl, TextBoxBase)
            CopyButton.Enabled = box IsNot Nothing And box.SelectionLength > 0
            CutButton.Enabled = CopyButton.Enabled
            PasteButon.Enabled = box isnot Nothing and Clipboard.ContainsText
        End Sub
    
        Private Sub CopyButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopyButton.Click
            Dim box = TryCast(Me.ActiveControl, TextBoxBase)
            If box isnot Nothing then box.Copy()
        End Sub
    
        '' etc...
    
    
    End Class
    
        2
  •  1
  •   Jacob Ewald    15 年前

    如果您使用的是标准的WinForms控件,那么这都应该是默认行为。除非有自定义上下文菜单,否则您不需要自己实现该功能。

        3
  •  0
  •   Aaron McIver    15 年前

    首先,如果您没有绑定到winforms,那么切换到wpf,因为这更容易实现,因为命令是内置的,而且imho技术更友好。

    对于剪切和复制,您可以使用 Cut / Copy / Paste 方法分别存在于 TextBoxBase 类,从.NET 3开始。

    更困难的是通过工具栏在全局范围内处理命令。您需要实现 command pattern 使这成为可能。