Отключить Alt + F4 в UserControl - PullRequest
5 голосов
/ 23 июля 2010

У меня есть пользовательский контроль, и я хочу отключить Alt + F4 возможность для конечного пользователя.Когда мой пользовательский элемент управления показывает, есть возможность закрыть его с помощью Alt + F4 , тогда программа переходит в базовый класс по методу:

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    //Content = null; // Remove child from logical parent - for reusing purposes
    this.RemoveLogicalChild(Content); //this works faster
    base.OnClosing(e);
    { GC.Collect(); };
}

Что ядолжен сделать здесь или где-то еще, чтобы отключить закрытие моего пользовательского элемента управления на Alt + F4 ?

Ответы [ 4 ]

7 голосов
/ 23 июля 2010

Конечно, я бы поставил под сомнение это как Лучшая практика . Однако, если вы действительно хотите это сделать, вам нужно предотвратить закрытие окна, содержащего UserControl.

Самый простой способ сделать это - установить на вашем UserControl значение DependencyProperty, то есть просто Boolean, указывающее, можно ли закрыть контейнер. Вы можете установить значение true только в том случае, если хотите, чтобы оно действительно закрывалось (возможно, у вас уже есть кнопка или что-то, что вы сейчас используете для закрытия элемента управления).

public Boolean AllowClose
{
    get { return (Boolean)GetValue(AllowCloseProperty); }
    set { SetValue(AllowCloseProperty, value); }
}

 public static readonly DependencyProperty AllowCloseProperty =
    DependencyProperty.Register("AllowClose", typeof(Boolean), 
    typeof(MyUserControl), new UIPropertyMetadata(false));

Затем в событии windows Closing вы проверите, установлено ли для этого свойства значение true. Если это не так, вы должны установить e.Cancel = true;

Используя ваш пример:

   protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
   {
    if (! myUserControl.AllowClose)
    {
        MessageBox.Show("Even though most Windows allow Alt-F4 to close, I'm not letting you!");
        e.Cancel = true;
    }
    else
    {
        //Content = null; // Remove child from parent - for reuse
        this.RemoveLogicalChild(Content); //this works faster
        base.OnClosing(e);
        { GC.Collect(); };
    }
}
5 голосов
/ 23 июля 2010

В ваш пользовательский элемент управления добавьте следующие обработчики:
PreviewKeyDown = "Window_PreviewKeyDown" PreviewKeyUp = "Window_PreviewKeyUp"

Реализация для обработчиков:

    bool AltDown = false;
    private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt)
        {
            AltDown = true;
        }
        else if (e.SystemKey == Key.F4 && AltDown)
        {
            e.Handled = true;
        }            
    }
    private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
    {
        if (e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt)
        {
            AltDown = false;
        }
    }
3 голосов
/ 18 ноября 2011

вы можете переопределить метод OnPreviewkeyDown и перехватывать клавиши ALT и F4.

protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
        {
            if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)) && Keyboard.IsKeyDown(Key.F4))
                e.Handled = true;
        }
0 голосов
/ 02 февраля 2013

Самый простой способ заблокировать Alt + F4 - заблокировать только F4 . Таким образом, когда F4 не нужно обрабатывать, блокировка Alt не требуется.

Надеюсь, это полезно.

...