2010-06-22 10 views
7

He creado un ToggleButton para mostrar y ocultar un trozo de interfaz de usuario y he enviado su Content a un icono.Establecer tecla de acceso directo para ToggleButton con contenido de imagen

Ahora quiero agregar una tecla de acceso directo al ToggleButton pero no estoy seguro de cómo hacerlo sin vincular un comando también. Como todo lo que estoy haciendo es vinculante para el estado IsChecked, no necesito un comando para realizar ninguna otra funcionalidad y crear uno vacío parece incorrecto.

Aquí está mi ToggleButton tal como está actualmente no funciona y no responde cuando presiono la tecla de método abreviado indicada.

<ToggleButton ToolTip="Command History" 
       MinWidth="24" 
       IsChecked="{Binding IsShowHistoryChecked}" 
       Margin="7"> 
    <ToggleButton.InputBindings> 
     <KeyBinding Gesture="Ctrl+H" /> 
    </ToggleButton.InputBindings> 
    <Image Source="/Amuse;component/Images/ComHistory256.png" 
      Width="24" /> 
</ToggleButton> 

Respuesta

11

Un InputBinding en el propio ToggleButton no va a hacer el truco, pero hay dos buenas soluciones para su problema de WPF:

  1. utilizar un RoutedCommand que actualiza el modelo.
  2. Registre una clave de acceso.

Por qué su solución InputBinding no funcionará

El InputBinding ha definido actualmente no funcionará porque no muestra un comando. Es fácil crear un comando que activa o desactiva un botón, de la siguiente manera:

public void Execute(object parameter) 
{ 
    ((ToggleButton)parameter).IsChecked = !((ToggleButton)parameter).IsChecked; 
} 

Sin embargo esto no va a conseguir lo que busca. Desea Ctrl-H para alternar su botón , incluso cuando el botón no está enfocado. Un InputBinding no lo hará por usted, ya que solo funciona cuando el botón tiene foco. Ahora discutiré dos soluciones que puedes usar.

Opción 1: Utilice un RoutedCommand que actualiza el modelo

El objetivo de la arquitectura de WPF es que usted nunca tendrá que "cambiar un botón" en el primer lugar: Conceptualmente todas las acciones del teclado y del ratón en WPF debería servir para alternar una propiedad vinculada en su modelo o modelo de vista. El ToggleButton se convierte en el mecanismo para aceptar clics del mouse, pero no es necesario que sea el único.

El nombre que elija para su propiedad "IsShowHistoryChecked" indica un problema fundamental en la forma en que conceptualiza su modelo de vista. Su modelo de vista no debe diseñarse alrededor de la vista, sino que debe exponer conceptos lógicos como una propiedad "Mostrar historial". La vista puede vincular esto a un CheckBox o ToggleButton, o puede elegir algún otro mecanismo, o puede no exponerlo en absoluto. El punto principal del enlace de datos y los modelos de vista es que cuando crea el modelo de vista no le importa cómo será la vista real. De hecho, durante las pruebas unitarias automatizadas no habrá una casilla de verificación, por lo que "IsShowHistoryChecked" sería claramente un nombre incorrecto.

Digamos que ha separado correctamente su vista de su modelo de vista y tiene una propiedad "MostrarHistorial". Primero implemente un comando "ToggleShowHistory" en su modelo de vista que, cuando se ejecuta, alterna la propiedad ShowHistory. Ahora todo lo que tiene que hacer es asignar este comando a un enlace de entrada de Ctrl-H en el nivel de vista y listo. Incluso si el ToggleButton se elimina de la vista por completo, InputBinding seguirá teniendo efecto y Ctrl-H seguirá funcionando. Nirvanna.

Opción 2: Registrar una clave de acceso

Windows tiene un mecanismo estándar para la asociación de teclas con botones y etiquetas arbitrarias, que es el concepto de "clave de acceso". Si registra una clave de acceso de "h" en el ToggleButton, al presionar Alt-H se alternará el botón y, por lo tanto, será simplemente H si no tiene un TextBox u otro control que lo acepte primero.

Es muy sencillo para registrar la clave de acceso de código:

AccessKeyManager.Register("h", togleButton); 

Esto registra "h" como el texto de acceso. Ahora, si el usuario presiona Alt-H en cualquier lugar del alcance (o "h" simple si no está manejado por un TextBox), su botón se alternará.

También puede hacerlo en XAML. Si se muestra el texto en el botón, sólo tiene que utilizar un subrayado antes de la letra clave de acceso:

<Button Text="Show _History" ... /> 

Si usted está mostrando algo más que sólo texto, incluyen un elemento AccessText oculto en su contenido botón:

<Button ...> 
    <Grid> 
    <AccessText Text="_h" Visibility="Collapsed" /> 
    <Image ...> 
    </Grid> 
</Button> 

En caso de que se lo pregunte, WPF no tiene un mecanismo incorporado para solicitar que los registros de AccessKey respondan a Ctrl en lugar de Alt, por lo que esto no le permitirá configurar Ctrl-H como clave de acceso.

+2

Cuando la visibilidad se contrae, parece que no funciona para mí. ¡Pero intenté establecer Opacidad = 0 y eso funcionó de maravilla! – Haacked

Cuestiones relacionadas