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