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>