WPF — Пользовательское окно с пользовательским ключом DefaultStyleKey теряет FocusVisualStyle

#c# #wpf #styles

#c# #wpf #стили

Вопрос:

Я создал пользовательское окно, переопределяющее его DefaultStyleKey, но я теряю FocusVisualStyle всех элементов управления, которые содержатся внутри окна. Даже пользовательский FocusVisualStyle не работает. Чего мне здесь не хватает?

Вот как я переопределяю ключ DefaultStyleKey по умолчанию в статическом ctor класса CustomWindow:

 DefaultStyleKeyProperty.OverrideMetadata( typeof( CustomWindow ), new FrameworkPropertyMetadata( typeof( CustomWindow ) ) );
  

Вот стиль по умолчанию, определенный в generic.xaml:

 <Style TargetType="{x:Type local:CustomWindow}">
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type local:CustomWindow}">
            <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
               <ContentPresenter />
            </Border>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>
  

Следующий шаг — изменить базовый тип главного окна на CustomWindow и добавить две кнопки. При использовании клавиши Tab для навигации прямоугольник фокусировки не отображается.

Будем признательны за любую помощь!

Ответ №1:

Вам нужно поместить свой ContentPresenter внутри AdornerDecorator вот так:

 <AdornerDecorator>
    <ContentPresenter/>
</AdornerDecorator>
  

Именно декоратор adorner отрисовывает все прямоугольники фокуса.

Когда что-то не работает, вы можете посмотреть на шаблоны элементов управления по умолчанию. Затем вы пробуете их шаблон и свой шаблон и выясняете, почему один работает, а другой нет!

Я посмотрел Window , и это выглядит так:

 <Style x:Key="{x:Type Window}"
       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 Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <AdornerDecorator>
                        <ContentPresenter/>
                    </AdornerDecorator>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Window.ResizeMode"
                 Value="CanResizeWithGrip">
            <Setter Property="Template"
                    Value="{StaticResource WindowTemplateKey}"/>
        </Trigger>
    </Style.Triggers>
</Style>