style wpf button

wpf - style xaml



¿Cómo funciona la propiedad WPF Button.IsCancel? (4)

La idea básica detrás de un botón Cancelar es habilitar el cierre de su ventana con una tecla de escape.

Puede establecer la propiedad IsCancel en el botón Cancelar en verdadero, lo que hace que el botón Cancelar cierre automáticamente el cuadro de diálogo sin manejar el evento Click.

Fuente: Programación WPF (Griffith, Sells)

Entonces esto debería funcionar

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

Sin embargo, el comportamiento que espero no me funciona. La ventana principal es la ventana principal de la aplicación especificada por la propiedad Application.StartupUri. Lo que funciona es

<Button Name="btnCancel" IsCancel=True" Click="CloseWindow">_Close</Button> private void CloseWindow(object sender, RoutedEventArgs) { this.Close(); }

  • ¿El comportamiento de IsCancel es diferente en función de si la Ventana es una ventana normal o un Diálogo? ¿Funciona IsCancel como se anuncia solo si se ha llamado a ShowDialog?
  • ¿Se requiere un controlador de Click explícito para el botón (con IsCancel configurado en verdadero) para cerrar una ventana en una prensa de Escape?

Esto no es correcto ... MSDN dice esto: cuando establece la propiedad IsCancel de un botón en verdadero, crea un Botón que está registrado con AccessKeyManager. El botón se activa cuando un usuario presiona la tecla ESC. Entonces necesitas un controlador detrás de tu código Y no necesitas ninguna propiedad adjunta ni nada de eso


Podemos llevar la respuesta de Steve un paso más allá y crear una propiedad adjunta que proporcione la funcionalidad "escape al cerrar" para cualquier ventana. Escriba la propiedad una vez y úsela en cualquier ventana. Simplemente agregue lo siguiente a la ventana XAML:

yournamespace:WindowService.EscapeClosesWindow="True"

Aquí está el código de la propiedad:

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


Sí, esto es correcto. En Windows, la aplicación en WPF AcceptButton y el botón Cancelar están ahí. Pero una cosa es que si configura su visibilidad de control como falsa, entonces no funcionará como se esperaba. Para eso, necesita hacer que la visibilidad sea verdadera en WPF. Por ejemplo: (no funciona para el botón Cancelar porque aquí la visibilidad es falsa)

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

Entonces, necesitas hacerlo:

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

Luego tiene que escribir btnClose_Click en el código detrás del archivo:

private void btnClose_Click (object sender, RoutedEventArgs e) { this.Close(); }


Sí, solo funciona en los diálogos ya que una ventana normal no tiene el concepto de "cancelar", es lo mismo que DialogResult.Cancel que regresa de ShowDialog en WinForms.

Si desea cerrar una ventana con escape, puede agregar un controlador a PreviewKeyDown en la ventana, elija si es Key.Escape y cierre el formulario:

public MainWindow() { InitializeComponent(); this.PreviewKeyDown += new KeyEventHandler(CloseOnEscape); } private void CloseOnEscape(object sender, KeyEventArgs e) { if (e.Key == Key.Escape) Close(); }