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

时间:2010-10-21 14:47:14

标签: vb.net winforms visual-studio-2008 copy-paste

我正在使用VB.NET中的WinForms解决方案。已经有一段时间了,因为我主要是一个网络开发者。所以我需要做的是复制Microsoft Office产品的行为,用于剪切,复制,粘贴和撤消菜单和工具栏。哪个meens,我需要在时启用剪切和复制,并且仅当在表单上有一些选定的文本时。只有在剪贴板中有一些文本时才必须启用粘贴菜单。

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

如果您有任何建议,样品等,我将非常感激!

非常感谢!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

Application.Idle事件很适合这样做,它在检索到最后一个输入事件后运行。您只需要检查当前活动的控件是否能够复制/粘贴。使用带有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

答案 2 :(得分:0)

首先,如果你没有与WinForms绑定,请切换到WPF,因为这更容易实现,因为内置命令和更友好的技术恕我直言。

对于剪切和复制,您可以分别使用Cut / Copy / Paste方法,这些方法自.NET 3以来就存在于TextBoxBase类中。

您的难题中更难处理的是通过工具栏处理全局范围内的命令。您需要实施command pattern才能实现这一目标。