2010-10-21 2 views
1

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

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

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

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

ответ

1

Событие 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 
+0

Ханс, большое спасибо за это! Это именно то, что я искал: быстрый и эффективный способ сделать это. Вы просто сделали мой день. –

+0

@ ultraman69 Это то же самое, что вы будете делать, когда используете шаблон команды в ссылке на Application.Idle. Однако, когда событие произойдет, вы затем воспользуетесь шаблоном команды, если ваше приложение не будет расти ... тогда его все в одном файле будет достаточно. –

+0

Абсолютно Аарон, но я действительно не заметил конкретного события Application.Idle, которое является отправной точкой. Спасибо всем за вашу помощь ! –

1

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

+0

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

+0

Спасибо Аарон! Но кто-то уже это сделал, я уверен. Вот почему я прошу о некоторых мыслях и рекомендациях, а может быть, и образцах исходного кода. Просто чтобы начать меня на правильном пути. –

+0

Спасибо за ваш ответ Джейкоб, но если он стандартный в элементах управления WinForms, он просто не работает здесь. –

0

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

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

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

+0

Такс снова Аарон! К сожалению, я привязан к WinForms. Но я рассмотрю ваше предложение о внедрении шаблона команды, что кажется хорошей идеей для моего дела. –