wpf - 当应用程序失去焦点/替代 IsKeyboardFocusWithin 时,最后一个焦点项目的视觉指示
问题描述
在具有多个要与之交互的面板或文档的应用程序中,需要清楚地指示应用程序的哪个区域具有焦点。Visual Studio 本身就是一个很好的例子。
下面的MCV 示例接近达到预期的效果。
但是,因为它使用IsKeyboardFocusWithin
,所以当应用程序本身失去焦点时,不会维护应用程序中最近获得焦点的项目。
期望行为:当应用程序失去焦点时,保持由蓝色“SelectedColor”指示的焦点项。Visual Studio 执行此操作。
当应用失去焦点时,如何保持焦点指示?
代码
注意:没有代码隐藏。这是完整的例子。
<Window x:Class="TrackFocusMCVE.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="150" Width="300"> <Window.Resources> <SolidColorBrush x:Key="MouseOverColor" Color="#FF1C97EA"/> <SolidColorBrush x:Key="SelectedColor" Color="#FF007ACC"/> <SolidColorBrush x:Key="InactiveColor" Color="#19FFFFFF"/> <SolidColorBrush x:Key="BackgroundColor" Color="#FF44454B"/> <Style x:Key="TabControlStyle" TargetType="{x:Type TabControl}"> <Setter Property="Margin" Value="5,15,5,7"/> <Setter Property="Padding" Value="0"/> <Setter Property="BorderThickness" Value="0,2,0,0"/> <Setter Property="BorderBrush" Value="{DynamicResource InactiveColor}"/> <Setter Property="Foreground" Value="White"/> <Setter Property="Background" Value="{StaticResource BackgroundColor}"/> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Style.Triggers> <Trigger Property="IsKeyboardFocusWithin" Value="True"> <Setter Property="TabControl.BorderBrush" Value="{StaticResource SelectedColor}"/> </Trigger> </Style.Triggers> </Style> <Style x:Key="TabItemStyle" TargetType="{x:Type TabItem}"> <Setter Property="Padding" Value="15,2"/> <Setter Property="Foreground" Value="White"/> <Setter Property="Background" Value="Transparent"/> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type TabItem}"> <Border Name="TabBorder" MinWidth="40" MinHeight="20" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Margin="{TemplateBinding Margin}" Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}"> <ContentPresenter ContentSource="Header" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <ControlTemplate.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="true" /> <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="false"/> </MultiDataTrigger.Conditions> <Setter TargetName="TabBorder" Property="Background" Value="{StaticResource MouseOverColor}"/> </MultiDataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding IsKeyboardFocusWithin, RelativeSource={RelativeSource Self}}" Value="false" /> <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="true"/> </MultiDataTrigger.Conditions> <Setter TargetName="TabBorder" Property="Background" Value="{StaticResource InactiveColor}"/> </MultiDataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding IsKeyboardFocusWithin, RelativeSource={RelativeSource Self}}" Value="true" /> <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="true"/> </MultiDataTrigger.Conditions> <Setter TargetName="TabBorder" Property="Background" Value="{StaticResource SelectedColor}"/> </MultiDataTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Window.Resources> <Grid Background="DimGray"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TabControl Grid.Column="0" x:Name="tc1" Style="{DynamicResource TabControlStyle}"> <TabItem Header="1" Content="Tab Content" Style="{DynamicResource TabItemStyle}"/> <TabItem Header="2" Content="Tab Content" Style="{DynamicResource TabItemStyle}"/> <TabItem Header="3" Content="Tab Content" Style="{DynamicResource TabItemStyle}"/> </TabControl> <TabControl Grid.Column="1" x:Name="tc2" Style="{DynamicResource TabControlStyle}"> <TabItem Header="4" Content="Tab Content" Style="{DynamicResource TabItemStyle}"/> <TabItem Header="5" Content="Tab Content" Style="{DynamicResource TabItemStyle}"/> <TabItem Header="6" Content="Tab Content" Style="{DynamicResource TabItemStyle}"/> </TabControl> </Grid> </Window>
解决方案
部分答案:
当窗口失去焦点时,您可以通过将 MultiDataTrigger 条件更改为使用 IsFocused 而不是 IsKeyboardFocusWithin 来使焦点选项卡保持蓝色,如下所示:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsFocused, RelativeSource={RelativeSource Self}}" Value="true" />
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="true" />
</MultiDataTrigger.Conditions>
<Setter TargetName="TabBorder" Property="Background" Value="{StaticResource SelectedColor}" />
</MultiDataTrigger>
但是,没有直接的方法可以知道 TabControl 的子项何时聚焦,以便您可以将边框变为蓝色。
推荐阅读
- angular - 如何从自定义 Angular 示意图访问 Angular 项目文件夹?
- google-api - grantOfflineAccess 不适用于范围
- linux - 将文件夹中复制的所有文件的权限设置为相同
- java - Itext 5表格行拆分到新页面并重复
- ruby-on-rails - Heroku-18 堆栈升级后无法部署我的 Rails 项目
- wordpress - cms页面的不同标题模板
- javascript - 在注册时,在数据库中创建了用户,但在浏览器中检查时 JWT 令牌是“未定义的”
- javascript - toggleclass 是否适用于 js 生成的 html?
- html - 悬停时按钮下方出现奇怪的线条
- javascript - 单击某些文本JS更改图像