IsKeyboardFocusWithin 弹出窗口
IsKeyboardFocusWithin Popup
我使用 IsKeyboardFocusWithin 值在我的布局中将 IsSelected 设置为 ListViewItem。
到目前为止它工作正常,直到我发现,我的项目中的 Popup 没有将 IsKeyboardFocus 值传递给它的父级,使得这个 属性 在 Popup 的祖先中设置为 false,而 Popup 及其子级已将它设置为是的。
当您单击某些 Popup 的子项(如 Button 或 ListBoxItem)时,此问题会重现。
我创建了一个简单的项目来重现它:
当您单击该按钮时,IsKeyboardFocusWithin 在按钮的父 Popup 中设置为 true,但不会进一步。
Popup 的祖先是否有办法接收其 IsKeyboardFocusWithin 值?
<Window
x:Class="PopupDemo.MainWindow"
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:local="clr-namespace:PopupDemo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<Grid>
<Popup IsOpen="True" StaysOpen="True">
<Button Content="Test" />
</Popup>
</Grid>
<Window.Style>
<Style TargetType="{x:Type Window}">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="Background" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Style>
</Window>
弹出窗口、工具提示、上下文菜单 - 他们创建了自己的小 Window。
因此,这些元素不是为其创建的元素的子元素。
而当弹出一个带有这些元素的Window时,焦点就转到这个Window.
而既然焦点已经转移到它身上,那么,相应地,它就不在主要的Window.
在您的协调中,这可以通过确定 Popup 显示的附加触发器来解决。
但是这样的解决方案对于任务来说是非常具体的,可能不适合其他任务。
例如,对于 ListView、ListBox - 这将不起作用。
对于它们,您不需要创建触发器,而是更改 IsSelected 的值 属性.
<Grid>
<Popup x:Name="popup" IsOpen="True" StaysOpen="True">
<Button Content="Test" />
</Popup>
</Grid>
<Window.Style>
<Style TargetType="{x:Type Window}">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="Background" Value="Red" />
</Trigger>
<DataTrigger Binding="{Binding IsKeyboardFocusWithin, ElementName=popup}" Value="True">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Style>
我使用 IsKeyboardFocusWithin 值在我的布局中将 IsSelected 设置为 ListViewItem。 到目前为止它工作正常,直到我发现,我的项目中的 Popup 没有将 IsKeyboardFocus 值传递给它的父级,使得这个 属性 在 Popup 的祖先中设置为 false,而 Popup 及其子级已将它设置为是的。
当您单击某些 Popup 的子项(如 Button 或 ListBoxItem)时,此问题会重现。
我创建了一个简单的项目来重现它:
当您单击该按钮时,IsKeyboardFocusWithin 在按钮的父 Popup 中设置为 true,但不会进一步。
Popup 的祖先是否有办法接收其 IsKeyboardFocusWithin 值?
<Window
x:Class="PopupDemo.MainWindow"
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:local="clr-namespace:PopupDemo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<Grid>
<Popup IsOpen="True" StaysOpen="True">
<Button Content="Test" />
</Popup>
</Grid>
<Window.Style>
<Style TargetType="{x:Type Window}">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="Background" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Style>
</Window>
弹出窗口、工具提示、上下文菜单 - 他们创建了自己的小 Window。
因此,这些元素不是为其创建的元素的子元素。
而当弹出一个带有这些元素的Window时,焦点就转到这个Window.
而既然焦点已经转移到它身上,那么,相应地,它就不在主要的Window.
在您的协调中,这可以通过确定 Popup 显示的附加触发器来解决。
但是这样的解决方案对于任务来说是非常具体的,可能不适合其他任务。
例如,对于 ListView、ListBox - 这将不起作用。
对于它们,您不需要创建触发器,而是更改 IsSelected 的值 属性.
<Grid>
<Popup x:Name="popup" IsOpen="True" StaysOpen="True">
<Button Content="Test" />
</Popup>
</Grid>
<Window.Style>
<Style TargetType="{x:Type Window}">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="Background" Value="Red" />
</Trigger>
<DataTrigger Binding="{Binding IsKeyboardFocusWithin, ElementName=popup}" Value="True">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Style>