Событие Application.OnKeyDown для winforms? - PullRequest
0 голосов
/ 13 ноября 2011

В библиотеке Borland VCL есть события всего приложения, которые позволяют мне выполнять глобальную обработку нажатий клавиш. Есть ли что-нибудь подобное в .NET Winforms?

На данный момент у меня есть приложение Winforms с около 10 формами, и, к сожалению, я не создал базовый класс, из которого происходят все формы (процесс казался не таким простым, как в VCL), поэтому я не могу просто добавить код в базовый класс. Разве было бы легко добавить это сейчас и быстро подкласс 10 существующих форм?

Мой конечный пользователь хочет, чтобы он улавливал определенные комбинации клавиш, введенные в любом поле, и заменял их другими словами. Подобный ввод "so" будет заменен на "переполнение стека".

Не нужно искать точный код или что-то еще, просто некоторые идеи о том, как справиться с этим. До сих пор я думал о создании подклассов всех форм или о создании подклассов всех элементов управления текстовым полем, но не уверен, какие еще есть варианты? В VCL я бы ловил глобальное событие keydown, проверял активный элемент управления, проверял текст в элементе управления, и на основе текста и текущего выбора я заменял бы при необходимости.

1 Ответ

1 голос
/ 14 ноября 2011

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

   public class AutoTextBehavior
    {
        public void TextChanged(object sender, EventArgs e)
        {
            Console.WriteLine("Text Changed");
        }
    }

Затем вы можете подключиться к TextChanged любого из элементов управления вводом, для которого вы хотите иметь такое поведение.Например, в конструкторе формы, которая имеет два текстовых поля (t1 и t2), вы можете поместить следующее:

public class Form1 : Form
{
     AutoTextBehavior behavior = new AutoTextBehavior();

     public Form1()
     {
         InitializeComponent();
         this.t1.TextChanged += behavior.TextChanged;
         this.t2.TextChanged += behavior.TextChanged;
     }
...
}

Или вы можете заставить элементы управления создавать свои собственные действия:

public class myApplicationTextbox : Textbox
{
   AutoTextBehavior behavior = new AutoTextBehavior();

         public myApplicationTextbox()
         {
             InitializeComponent();
             TextChanged += behavior.TextChanged;
         }
...
}
...