放置在内容展示器中时 WPF 按钮焦点样式被覆盖

WPF button focus style being overriden when placed in content presenter

设置

我将以下样式应用于我的应用程序中的大多数 windows:

<ResourceDictionary x:Class="MyNamespace.ChromeWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style x:Key="CustomChromeTest" TargetType="{x:Type Window}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Grid x:Name="GridMain" Background="{StaticResource MainFormColor}">
                        <ContentPresenter HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

我用它来自定义我的 window 周围的 window chrome(我已经删除了那部分)所以 window 的所有实际内容都在里面内容主持人。我这样使用这种风格:

<Window x:Class="MyNamespace.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="Window1" Height="300" Width="300"
    Style="{DynamicResource CustomChromeTest}">
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/WPFControlLibrary;component/Resources/ChromeWindow.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<StackPanel>
    <Button Margin="5" Content="Button"  Width="75"/>
    <Button Margin="5" Content="Button"  Width="75"/>
    <Button Margin="5" Content="Button"  Width="75"/>
    <Button Margin="5"  Content="Button"  Width="75"/>

</StackPanel>

上面的 XAML 生成如下所示的 window:

问题

在正常 window 中,当用户在控件中使用 Tab 键时,当前按钮会突出显示以向用户显示当前按钮。请注意下面第 3 个按钮周围的边框。

出于某种原因,当我使用我的样式时,此功能消失了并且没有指示哪个按钮具有焦点,即使用户可以像平常一样使用 Tab 键。为什么会这样,我该如何恢复 内置 功能。

请注意

我将这种样式与数十个 windows 和数百个控件一起使用。我不想在每个带有触发器的控件上使用一种样式,该触发器在控件具有焦点时显示边框。我想恢复在应用自定义 window 样式之前使用的默认功能。

您只需将 ContentPresenter 定义为 AdornerDecorator for Window,它将按预期工作。我一开始显然也没有弄清楚:)

风格;

<Style x:Key="CustomChromeTest" TargetType="{x:Type Window}">
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type Window}">
            <Grid x:Name="GridMain" Background="Yellow">
              <AdornerDecorator>                    
                <ContentPresenter/>
              </AdornerDecorator>
            </Grid>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>

和你的window...

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
        xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2" x:Name="Testeroo" 
        x:Class="WpfApplication1.MainWindow" 
        mc:Ignorable="d" Style="{StaticResource CustomChromeTest}"
        Title="MainWindow" Height="550" Width="750">

       <StackPanel>
           <Button Margin="5" Content="Button"  Width="75"/>
           <Button Margin="5" Content="Button"  Width="75"/>
           <Button Margin="5" Content="Button"  Width="75"/>
           <Button Margin="5"  Content="Button"  Width="75"/>
       </StackPanel>

</Window>

希望这对您有所帮助,干杯。