2010-07-23 4 views
4

J'ai un certain contrôle utilisateur et je veux désactiver Alt + F4 opportunité pour l'utilisateur final. Lorsque mes shows de contrôle de l'utilisateur, il y a possibilité de le fermer avec Alt + F4, puis le programme va à la classe de base dans la méthode:Désactiver Alt + F4 dans UserControl

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(); }; 
} 

Ce que je dois faire ici ou ailleurs, faire désactiver mon contrôle d'utilisateur se fermant sur Alt + F4?

+10

Je dois vous demander: pourquoi avez-vous besoin de faire cela? ALT + F4 a été une méthode établie de fermeture des applications tant que Windows a été autour. Je ne me considère pas comme une idée géniale pour supprimer cette option de l'utilisateur. Une meilleure idée, à mon avis, serait de s'assurer que votre application le gère avec élégance. –

+1

Je n'ai besoin de le faire que dans un UserControl personnalisé, où je dois désactiver Esc et Alt + F4, afin que l'utilisateur ne soit pas en mesure de contourner le scénario de gestion. – Vytas999

+0

Si j'étais votre utilisateur et que je n'aimerais pas terminer le scénario de l'entreprise, je tuerais le processus pour ne pas avoir à continuer :) – HCL

Répondre

6

Pour être sûr, je voudrais vraiment question cette Best Practice. Cependant, si vous voulez vraiment faire cela, alors vous devez empêcher la fermeture de la fenêtre contenant le UserControl.

La manière la plus simple de procéder est de définir un DependencyProperty sur votre UserControl qui est simplement un Boolean indiquant si le conteneur peut être fermé. Vous ne définissez ce paramètre que lorsque vous voulez qu'il se ferme (vous avez probablement déjà un bouton ou quelque chose que vous utilisez maintenant pour fermer le contrôle).

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)); 

Puis, dans les fenêtres événement Closing, vous vérifieraient pour cette propriété à définir à true. Si ce n'est pas le cas, vous devez définir e.Cancel = true;

En utilisant votre exemple:

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

Sur ajoutez votre contrôle personnalisé les gestionnaires suivants:
PreviewKeyDown = "Window_PreviewKeyDown" PreviewKeyUp = "Window_PreviewKeyUp"

La mise en œuvre pour les gestionnaires:

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

vous pouvez remplacer les clés de la méthode OnPreviewKeyDown et piège ALT et 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

La façon la plus simple de bloquer Alt +F4 est de bloquer uniquement F4. Ainsi, lorsque F4 n'a pas besoin d'être manipulé, le blocage Alt est inutile.

J'espère que c'est utile.

Questions connexes