Quiero globalmente desactivar el enfoque rectángulos en mi aplicación de WPF. Para solo los controles que se pueden hacer a través de

<Style TargetType="Button">
    <Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>

pero cómo se aplican a todos los controles en mi aplicación. Cuando se aplica a FrameworkElement no pasa nada. Lo que necesito sería algo así como «se aplican a la clase x y todas las clases derivadas».

Gracias de antemano,

Stefan

InformationsquelleAutor grayscales | 2009-06-28

7 Comentarios

  1. 3

    Según http://msdn.microsoft.com/en-us/library/bb613567.aspx, usted debe ser capaz de establecer un enfoque global de estilo como este:

    <Style x:Key="{x:Static SystemParameters.FocusVisualStyleKey}">
      <Setter Property="Control.Template">
        <Setter.Value>
          <ControlTemplate>
            <Rectangle StrokeThickness="1"
              Stroke="Black"
              StrokeDashArray="1 2"
              SnapsToDevicePixels="true"/>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style> 

    Yo no lo he probado, pero supongo que cuando se vacía la controltemplate, este sería eficaz que desactivar el rectángulo de selección para toda la aplicación (siempre y cuando incluya este estilo en la aplicación.xaml).

    • No funciona 🙁
  2. 2

    Me topé con esto y me encontré con esto (de hecho no es muy agradable pero eficaz) solución:

    public class FocusVisualStyleRemover
    {
      static FocusVisualStyleRemover()
      {
        EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.GotFocusEvent, new RoutedEventHandler(RemoveFocusVisualStyle), true);
      }
    
      public static void Init()
      {
        //intentially empty
      }
    
      private static void RemoveFocusVisualStyle(object sender, RoutedEventArgs e)
      {
        (sender as FrameworkElement).FocusVisualStyle = null;
      }
    }

    En mi MainWindow constructor de la entonces me acaba de llamar FocusVisualStyleRemover.Init();

  3. 1

    Sé que suena aburrido, pero probablemente tendrás que hacer la misma cosa para todos los otros tipos de control, de forma individual. Hacer una lista de ellos y haciendo un par simple de Buscar/Reemplazar operaciones deben obtener lo que usted necesita, sin embargo.

  4. 0

    Esto no puede ser simple, pero usted podría escribir una función que modifica el estilo de un control. Una vez que está escrita, usted podría escribir una función que de forma recursiva altera el estilo de cada elemento.

    • ¿Por qué esto obtener un -1?
    • Probablemente porque es innecesariamente complejo, lleno de dificultades, tales como asegurarse de que ha cubierto todos los casos de borde posible y ser muy difíciles de mantener, sólo para nombrar 2. En comparación con un Style y Setter para cada tipo (que, aunque tedioso, es simple), su sugerencia suena loco. No me dan el -1.
    • Puesto que él no ha hecho un comentario de que cualquiera de las soluciones de trabajo, no sabemos si las ideas de otros ayudado. Si esta es la única idea que satisfaga sus necesidades, «loco» sería un error en la descripción.
  5. 0

    Puede utilizar OverrideMetadata:

    FrameworkElement.FocusVisualStyleProperty.OverrideMetadata(
        typeof(FrameworkElement),
        new FrameworkPropertyMetadata(null));
    1. usted tiene que llamar a este antes de que cualquier elemento se crea la Aplicación.Evento de inicio es probablemente el mejor lugar.
    2. Esto sólo afectará a los controles que utilizan FrameworkElement enfoque del estilo visual y no va a cambiar los controles que reemplazar en el código o estilos.
    3. No he intenta hacer esto con FocusVisualStyle yo
    • Por desgracia, esto se traduce en un «PropertyMetadata ya está registrado para el tipo ‘FrameworkElement’
    • «Las llamadas a OverrideMetadata sólo debe ser realizado dentro de los constructores estáticos del tipo que se ofrece a sí mismo como el forType parámetro de este método, o a través de la creación de instancias similares.» msdn.microsoft.com/en-us/library/ms597491.aspx
  6. 0

    Parte de la predeterminada Template para la Window clase es una AdornerDecorator. Si anula la Window‘s por defecto Template no incluir un AdornerDecorator, el FocusVisualStyle en todos los controles, no aparecerá.

    Incluso si un Control tiene un válido FocusVisualStyle que establece un Template, no aparecerá sin la AdornerDecorator.

    Una manera fácil de lograr esto es incluir este Style en su Aplicación.archivo xaml bajo Application.Resources.

    <Style TargetType="{x:Type Window}">
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
    <Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="{x:Type Window}">
    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
    <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}"/>
    </Border>
    </ControlTemplate>
    </Setter.Value>
    </Setter>
    <Style.Triggers>
    <Trigger Property="ResizeMode" Value="CanResizeWithGrip">
    <Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="{x:Type Window}">
    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
    <Grid>
    <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}"/>
    <ResizeGrip x:Name="WindowResizeGrip" HorizontalAlignment="Right" IsTabStop="False" Visibility="Collapsed" VerticalAlignment="Bottom"/>
    </Grid>
    </Border>
    <ControlTemplate.Triggers>
    <MultiTrigger>
    <MultiTrigger.Conditions>
    <Condition Property="ResizeMode" Value="CanResizeWithGrip"/>
    <Condition Property="WindowState" Value="Normal"/>
    </MultiTrigger.Conditions>
    <Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/>
    </MultiTrigger>
    </ControlTemplate.Triggers>
    </ControlTemplate>
    </Setter.Value>
    </Setter>
    </Trigger>
    </Style.Triggers>
    </Style>

Dejar respuesta

Please enter your comment!
Please enter your name here