Управление доступностью кнопки Вырезать, Копировать и вставить. - PullRequest
1 голос
/ 21 октября 2010

Я работаю над решением WinForms в VB.NET. Прошло много времени с тех пор, как я в основном разработчик веб-сайтов. Поэтому мне нужно повторить поведение продукта Microsoft Office для меню и панели инструментов Вырезать, Копировать, Вставить и Отменить . Что означает, мне нужно включить Вырезать и скопировать , когда и только когда есть какой-то выделенный текст в форме. Меню Вставить должно быть включено только при наличии некоторого текста в буфере обмена.

У вас есть идеи о том, как этого добиться? Я, вероятно, должен был бы проверить какое-то событие в TextBox, чтобы проверить, выделен ли какой-либо текст (MouseUp?). Затем в событии Enter я бы проверил, есть ли что-то в буфере обмена, чтобы включить Вставить меню ...

Если у вас есть предложения, образцы и т. Д., Я был бы очень признателен!

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 21 октября 2010

Событие Application.Idle хорошо подходит для этого, оно запускается после получения последнего входного события. Вам просто нужно проверить, способен ли текущий активный элемент управления копировать / вставлять. Сделайте код вашей формы похожим на это, используя ToolStrip с 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
1 голос
/ 21 октября 2010

Это должно быть поведение по умолчанию, если вы используете стандартные элементы управления WinForms. Вам не нужно реализовывать это самостоятельно, если у вас нет настраиваемого контекстного меню.

0 голосов
/ 21 октября 2010

Прежде всего, если вы не привязаны к WinForms, переключитесь на WPF, так как это гораздо проще сделать, так как командование встроено и гораздо более удобная технология IMHO.

Для вырезания и копирования вы можете использоватьиз методов Cut / Copy / Paste, соответственно, они существуют в классе TextBoxBase , так как .NET 3.

Более сложная часть вашей головоломки имеет делос командами в глобальном масштабе, через вашу панель инструментов.Вам потребуется реализовать шаблон команды , чтобы сделать это возможным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...