2008-09-02 5 views
55

Estoy estableciendo el valor .Content de una etiqueta en una cadena que contiene caracteres de subrayado; el primer guión bajo se interpreta como una tecla aceleradora.Desactivar la tecla del acelerador de etiquetas WPF (falta el subrayado del texto)

Sin cambiar la cadena subyacente (reemplazando todo _ con __), ¿hay alguna manera de desactivar el acelerador para las etiquetas?

+1

¿Hay algún motivo por el que desee utilizar una etiqueta en lugar de un bloque de texto? –

+1

Sí - 'Label' hace mucho más que manejar los aceleradores. También se aplica a otros controles (por ejemplo, 'GroupBox') que no pueden ser reemplazados por un' TextBlock'. – GraemeF

+0

esto es útil sobre este tema: http://stackoverflow.com/questions/10452462/make-a-hotkey-to-focus-a-textbox-in-wpf –

Respuesta

76

Si utiliza un TextBlock como contenido de la etiqueta, su texto no absorberá los guiones bajos.

+2

Acabo de utilizar este enfoque en mi aplicación y T trabajó como un campeón. – RQDQ

+0

+1, es de lejos la solución más simple –

+0

No funciona si desea retener un evento doubleclick ya asignado (TextBlock no lo tiene) – SlapY

26

Puede anular la propiedad RecognizesAccessKey del ContentPresenter que está en la plantilla predeterminada para la etiqueta. Por ejemplo:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
    <Grid.Resources> 
     <Style x:Key="{x:Type Label}" BasedOn="{StaticResource {x:Type Label}}" TargetType="Label"> 
     <Setter Property="Template"> 
      <Setter.Value> 
      <ControlTemplate TargetType="Label"> 
       <Border> 
       <ContentPresenter 
        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
        VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
        RecognizesAccessKey="False" /> 
       </Border> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </Grid.Resources> 
    <Label>_This is a test</Label> 
    </Grid> 
</Page> 
+0

Acabo de probar esto, no funciona, en realidad. Tal vez elimine el enlace de la clave de acceso, pero no impide que se elimine el subrayado. – xanadont

+0

Acabo de copiar el código en Kaxaml y funcionó. ¿Intentó tal cual o lo cambió? –

+0

Funciona en mi máquina, también. –

1

Utilice un <"Text Block">"<"/Text Block"> en lugar de <"label"><"/label"> para imprimir el texto exacto que está teniendo caracteres de subrayado.

0

¿Por qué no me gusta?

public partial class LabelEx : Label 
    { 
     public bool PreventAccessKey { get; set; } = true; 

     public LabelEx() 
     { 
      InitializeComponent(); 
     } 

     public new object Content 
     { 
      get 
      { 
       var content = base.Content; 
       if (content == null || !(content is string)) 
        return content; 

       return PreventAccessKey ? 
        (content as string).Replace("__", "_") : content; 
      } 
      set 
      { 
       if (value == null || !(value is string)) 
       { 
        base.Content = value; 
        return; 
       } 

       base.Content = PreventAccessKey ? 
        (value as string).Replace("_", "__") : value; 
      } 
     } 
    } 
+0

¿Qué pasa con las preguntas viejas con una respuesta incorrecta? –

+0

Acabo de resolver ese problema en mi proyecto y no encontré ninguna solución adecuada. Entonces, ¿por qué no discuten qué tan malo en mi respuesta? –

+1

Muchas de las otras respuestas brindan buenas soluciones. Subclassing Label es ridículo. –

Cuestiones relacionadas