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

Vb.net 管理剪切、复制和粘贴按钮的可用性.NET WinForms,vb.net,winforms,visual-studio-2008,copy-paste,Vb.net,Winforms,Visual Studio 2008,Copy Paste,我正在VB.NET中开发WinForms解决方案。我已经有一段时间没有主要从事网络开发了。因此,我需要做的是复制Microsoft Office产品的剪切、复制、粘贴和撤消菜单和工具栏的行为。在这种情况下,我需要在表单上有选定文本时启用剪切和复制。只有当剪贴板中有文本时,才能启用“粘贴”菜单 你对如何做到这一点有什么想法吗?我可能需要检查文本框中的某些事件,以检查是否选择了某些文本(MouseUp?)。然后在Enter事件中,我会检查剪贴板中是否有要启用的粘贴菜单 如果您有任何建议、样品等,我将

我正在VB.NET中开发WinForms解决方案。我已经有一段时间没有主要从事网络开发了。因此,我需要做的是复制Microsoft Office产品的剪切、复制、粘贴和撤消菜单和工具栏的行为。在这种情况下,我需要在表单上有选定文本时启用剪切和复制。只有当剪贴板中有文本时,才能启用“粘贴”菜单

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

如果您有任何建议、样品等,我将不胜感激


非常感谢

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

首先,如果您没有绑定到WinForms,请切换到WPF,因为这更容易实现,因为命令是内置的,而且是一种更友好的技术

对于剪切和复制,您可以分别使用
剪切
/
复制
/
粘贴
方法,这些方法存在于类中,因为.NET 3


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

应用程序。空闲事件很好,它在检索最后一个输入事件后运行。您只需检查当前活动控件是否能够复制/粘贴。使用带有3个按钮的ToolStrip,使表单代码看起来与此类似:

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

您必须在应用程序的全局范围内执行命令,才能启用/禁用工具栏上的按钮,例如复制。这并不是奇迹般的发生。谢谢亚伦!但我敢肯定,已经有人这么做了。这就是为什么我需要一些想法和指导,甚至是源代码示例。只是为了让我走上正轨。谢谢你的回答,雅各布,但是如果它是WinForms控件中的标准,那么它在这里就不起作用了。又是Thaks Aaron!不幸的是,我被WinForms束缚住了。但我会考虑你关于实施命令模式的建议,这对我的案例来说似乎是个好主意。汉斯,非常感谢你!这正是我想要的:一种快速有效的方法。您刚刚创造了我的一天。@ultraman69这与您在引用Application.Idle时使用命令模式时所做的完全相同。但是,当事件发生时,您将使用命令模式,除非您的应用程序不会增长…然后将其全部放在一个文件中就足够了。绝对是Aaron,但我确实错过了特定的应用程序。Idle事件是起点。谢谢大家的帮助!