Frage

Die grundlegende Idee hinter einer Schaltfläche "Abbrechen" zu aktivieren, schließen Sie Ihr Fenster mit einem Escape-Keypress.

Sie können die IsCancel Eigenschaft die Schaltfläche Abbrechen auf true, wodurch die Abbrechen-Taste, um automatisch schließen das Dialogfeld ohne Umgang mit den Auf event.

Quelle:Programmierung WPF (Griffith, Verkauft)

So sollte das funktionieren

<Window>
<Button Name="btnCancel" IsCancel="True">_Close</Button>
</Window>

Aber das Verhalten, das ich erwarten, nicht funktioniert für mich.Das übergeordnete Fenster ist das Hauptfenster der Anwendung durch die Anwendung festgelegt.StartupUri-Eigenschaft.Was funktioniert, ist

<Button Name="btnCancel" IsCancel=True" Click="CloseWindow">_Close</Button>

private void CloseWindow(object sender, RoutedEventArgs) 
{
    this.Close();
}
  • Ist das Verhalten der IsCancel verschiedene basierend auf, ob die Fenster ist ein normales Fenster oder einen Dialog?Tut IsCancel funktionieren, wie beworben, nur wenn ShowDialog aufgerufen wurde?
  • Ist eine explizite Click-handler erforderlich für die Schaltfläche (mit IsCancel auf true gesetzt ist) das schließen eines Fensters auf einer Flucht zu drücken?
War es hilfreich?

Lösung

Ja, es funktioniert nur auf Dialoge als normale Fenster hat kein Konzept von "Abbrechen", es ist das gleiche wie DialogResult.Abbrechen der Rückkehr von ShowDialog in WinForms.

Wenn Sie wollte, um ein Fenster zu schließen mit escape-könnte man hinzufügen, eine Prozedur zu PreviewKeyDown auf das Fenster pickup auf, ob es der Schlüssel ist.Flucht-und schließen der form:

public MainWindow()
{
    InitializeComponent();

    this.PreviewKeyDown += new KeyEventHandler(CloseOnEscape);
}

private void CloseOnEscape(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Escape)
        Close();
}

Andere Tipps

Wir können nehmen Steves Antwort einen Schritt weiter und erstellen Sie eine angefügte Eigenschaft, die die "Flucht auf in der Nähe" - Funktion für jedes Fenster.Schreiben Sie die Eigenschaft einmal und verwenden Sie es in jedem Fenster.Fügen Sie einfach die folgenden, um das Fenster XAML:

yournamespace:WindowService.EscapeClosesWindow="True"

Hier ist der code für die Immobilie:

using System.Windows;
using System.Windows.Input;

/// <summary>
/// Attached behavior that keeps the window on the screen
/// </summary>
public static class WindowService
{
   /// <summary>
   /// KeepOnScreen Attached Dependency Property
   /// </summary>
   public static readonly DependencyProperty EscapeClosesWindowProperty = DependencyProperty.RegisterAttached(
      "EscapeClosesWindow",
      typeof(bool),
      typeof(WindowService),
      new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnEscapeClosesWindowChanged)));

   /// <summary>
   /// Gets the EscapeClosesWindow property.  This dependency property 
   /// indicates whether or not the escape key closes the window.
   /// </summary>
   /// <param name="d"><see cref="DependencyObject"/> to get the property from</param>
   /// <returns>The value of the EscapeClosesWindow property</returns>
   public static bool GetEscapeClosesWindow(DependencyObject d)
   {
      return (bool)d.GetValue(EscapeClosesWindowProperty);
   }

   /// <summary>
   /// Sets the EscapeClosesWindow property.  This dependency property 
   /// indicates whether or not the escape key closes the window.
   /// </summary>
   /// <param name="d"><see cref="DependencyObject"/> to set the property on</param>
   /// <param name="value">value of the property</param>
   public static void SetEscapeClosesWindow(DependencyObject d, bool value)
   {
      d.SetValue(EscapeClosesWindowProperty, value);
   }

   /// <summary>
   /// Handles changes to the EscapeClosesWindow property.
   /// </summary>
   /// <param name="d"><see cref="DependencyObject"/> that fired the event</param>
   /// <param name="e">A <see cref="DependencyPropertyChangedEventArgs"/> that contains the event data.</param>
   private static void OnEscapeClosesWindowChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   {
      Window target = (Window)d;
      if (target != null)
      {
         target.PreviewKeyDown += new System.Windows.Input.KeyEventHandler(Window_PreviewKeyDown);
      }
   }

   /// <summary>
   /// Handle the PreviewKeyDown event on the window
   /// </summary>
   /// <param name="sender">The source of the event.</param>
   /// <param name="e">A <see cref="KeyEventArgs"/> that contains the event data.</param>
   private static void Window_PreviewKeyDown(object sender, KeyEventArgs e)
   {
      Window target = (Window)sender;

      // If this is the escape key, close the window
      if (e.Key == Key.Escape)
         target.Close();
   }
}

Dies ist nicht ganz richtig, ist es...MSDN sagt:Wenn Sie die IsCancel-Eigenschaft einer Schaltfläche auf true, erstellen Sie eine Schaltfläche, die registriert ist mit der AccessKeyManager.Die Taste wird aktiviert, wenn ein Benutzer drückt die Taste ESC.Also müssen Sie einen handler im code hinter Und Sie brauchen keine angefügten Eigenschaften oder etwas wie, dass

Ja, das ist richtig.In windows-Anwendung in WPF AcceptButton und Abbrechen-Schaltfläche ist es.Aber eine Sache ist, dass, wenn Sie Ihre Steuern Sie die Sichtbarkeit als falsch, dann wird es nicht funktionieren, wie erwartet.Für die, die Sie brauchen, um Sichtbarkeit als wahr in WPF.Zum Beispiel:(es funktioniert nicht für die Schaltfläche Abbrechen, da hier Sichtbarkeit ist false)

<Button x:Name="btnClose" Content="Close" IsCancel="True" Click="btnClose_Click" Visibility="Hidden"></Button> 

So müssen Sie es machen:

<Button x:Name="btnClose" Content="Close" IsCancel="True" Click="btnClose_Click"></Button>

Dann müssen Sie schreiben btnClose_Click in der code-behind-Datei:

private void btnClose_Click (object sender, RoutedEventArgs e)
    { this.Close(); }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top