Деактивировать FocusVisualStyle глобально - PullRequest
18 голосов
/ 29 июня 2009

Я хочу глобально деактивировать прямоугольники фокуса в своем приложении WPF. Для отдельных элементов управления, которые можно сделать с помощью

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

но как применить его ко всем элементам управления в моем приложении. При применении к FrameworkElement ничего не происходит. Мне нужно что-то вроде «применить к классу x и ко всем производным классам».

Заранее спасибо,

Stefan

Ответы [ 7 ]

3 голосов
/ 10 февраля 2010

Согласно http://msdn.microsoft.com/en-us/library/bb613567.aspx, вы должны иметь возможность установить глобальный стиль фокуса следующим образом:

<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> 

Я не проверял его, но, полагаю, когда вы очищаете шаблон управления, это фактически отключит прямоугольник фокуса для всего приложения (при условии, что вы включите этот стиль в app.xaml).

3 голосов
/ 15 августа 2009

Похоже, для этого нет волшебной пули:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/141c8bfa-f152-4f8a-aca0-3c3b5440d183

2 голосов
/ 20 июня 2017

Я тоже наткнулся на это и придумал это (действительно не очень хорошее, но эффективное) решение:

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

В конструкторе моего главного окна я просто вызываю FocusVisualStyleRemover.Init();

1 голос
/ 13 августа 2009

Я знаю, это звучит скучно, но вам, вероятно, придется сделать то же самое для всех других типов элементов управления, индивидуально. Составив их список и выполнив пару простых операций поиска / замены, вы получите то, что вам нужно.

0 голосов
/ 05 ноября 2013

Частью по умолчанию Template для класса Window является AdornerDecorator. Если вы переопределите Template по умолчанию *1005*, чтобы не включать AdornerDecorator, FocusVisualStyle на всех элементах управления не появится.

Даже если Control имеет действительный FocusVisualStyle, который устанавливает Template, он не появится без AdornerDecorator.

Самый простой способ сделать это - включить этот Style в файл App.xaml в 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>
0 голосов
/ 29 июня 2009

Вы можете использовать OverrideMetadata:

FrameworkElement.FocusVisualStyleProperty.OverrideMetadata(
    typeof(FrameworkElement),
    new FrameworkPropertyMetadata(null));
  1. Вы должны вызывать это перед созданием любого элемента, событие Application.Startup, вероятно, является лучшим местом.
  2. Это повлияет только на элементы управления, которые используют визуальный стиль фокуса FrameworkElement, и не изменит элементы управления, которые переопределяют его в коде или стилях.
  3. Я сам не пытался делать это с FocusVisualStyle
0 голосов
/ 29 июня 2009

Это может быть непросто, но вы можете написать функцию, которая изменяет существующий стиль элемента управления. Как только это написано, вы можете написать функцию, которая рекурсивно изменяет стиль каждого элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...