Как зафиксировать нажатие клавиши удаления в С#?

Я хочу захватить нажатия клавиш удаления и ничего не делать при нажатии клавиши. Как я могу сделать это в WPF и Windows Forms?


person thuaso    schedule 23.05.2010    source источник
comment
Какой UI-фреймворк? Винформс? ВПФ? ...?   -  person mmx    schedule 24.05.2010
comment
плюс в каком контексте? текстовое поле, форма и т. д.   -  person JaSk    schedule 24.05.2010
comment
@Мехрдад Афшари. Как в WPF, так и в Winforms   -  person thuaso    schedule 24.05.2010


Ответы (5)


При использовании MVVM с WPF вы можете фиксировать нажатия клавиш в XAML с помощью привязок ввода.

            <ListView.InputBindings>
                <KeyBinding Command="{Binding COMMANDTORUN}"
                            Key="KEYHERE" />
            </ListView.InputBindings>
person Eric    schedule 10.09.2012
comment
Интересно, почему это не получило больше голосов: концептуально это намного чище. - person Vlad; 18.09.2013
comment
Я согласен, Влад, это очень чистый способ сделать это. +1 - person Jeff; 06.11.2013
comment
Для некоторых компонентов вы можете поместить привязки прямо в определение (я не знаю, очень ли это распространено или уникально для Telerik): ‹telerik:RadGridView x:Name=radGridView KeyDown=radGridView_KeyDown KeyUp=radGridView_KeyUp/› - person Jeff; 06.11.2013
comment
@Jeff Вы обнаружите, что это не столько привязка, сколько больше кода для обработки событий. - person Eric; 13.12.2013
comment
Можете ли вы предоставить свою реализацию @StevenC.Britton - person Eric; 13.06.2014
comment
Я не реализовал это, Эрик. Вместо этого я переключился на использование ESC, что намного проще и мало что изменило в моем приложении. - person Steven C. Britton; 14.06.2014
comment
Вот рабочая реализация клавиши удаления для дальнейшего использования ‹KeyBinding Key=Delete Command={Binding DeleteCommand} /› - person Eric; 15.06.2014
comment
За исключением того, Эрик, как я уже сказал, эта реализация не работает. Я попробовал это еще раз, прежде чем писать этот комментарий, чтобы перепроверить, и я прав: это не работает. - person Steven C. Britton; 18.06.2014
comment
Должен работать в .NET 4 и выше. Вы также можете добавить модификатор, например. CTRL вот так: Modifiers="Control" - person creativeDev; 29.03.2018

Для WPF добавьте обработчик KeyDown:

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Delete)
    {
        MessageBox.Show("delete pressed");
        e.Handled = true;
    }
}

Что почти так же, как и для WinForms:

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Delete)
    {
        MessageBox.Show("delete pressed");
        e.Handled = true;
    }
}

И не забудьте включить KeyPreview.

Если вы хотите предотвратить выполнение действия клавиш по умолчанию, установите e.Handled = true, как показано выше. То же самое в WinForms и WPF

person ChrisF    schedule 23.05.2010
comment
Спасибо за ответ. Как предотвратить действие «Удалить»? - person thuaso; 24.05.2010
comment
Хорошо знать! Как проверить, нажаты ли CTRL или SHIFT? - person Matt; 27.08.2011
comment
@ Мэтт, посмотри на Keyboard.Modifiers. - person ChrisF; 27.08.2011

Я не знаю о WPF, но попробуйте событие KeyDown вместо события KeyPress для Winforms.

См. статью MSDN об управлении .KeyPress, в частности, фраза «Событие KeyPress не вызывается несимвольными клавишами, однако несимвольные клавиши вызывают события KeyDown и KeyUp».

person LittleBobbyTables - Au Revoir    schedule 23.05.2010

Просто проверьте обработчик событий key_press или Key_Down на конкретном элементе управления и проверьте, как для WPF:

if (e.Key == Key.Delete)
{
   e.Handle = false;
}

Для Windows-форм:

if (e.KeyCode == Keys.Delete)
{
   e.Handled = false;
}
person Johnny    schedule 24.05.2010

Я пробовал все, что упоминалось выше, но у меня ничего не получилось, поэтому я публикую то, что я на самом деле сделал и работал, в надежде помочь другим с той же проблемой, что и я:

В код программной части файла xaml добавьте обработчик событий в конструкторе:

using System;
using System.Windows;
using System.Windows.Input;
public partial class NewView : UserControl
    {
    public NewView()
        {
            this.RemoveHandler(KeyDownEvent, new KeyEventHandler(NewView_KeyDown)); 
            // im not sure if the above line is needed (or if the GC takes care of it
            // anyway) , im adding it just to be safe  
            this.AddHandler(KeyDownEvent, new KeyEventHandler(NewView_KeyDown), true);
            InitializeComponent();
        }
     //....
      private void NewView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Delete)
            {
                //your logic
            }
        }
    }
person Kyriakos Xatzisavvas    schedule 15.07.2019