在某处打开窗口或上下文菜单会使弹出元素无法聚焦(按钮除外)

本文关键字:聚焦 按钮 元素 开窗口 上下文 菜单 在某处 | 更新日期: 2023-09-27 18:33:54

我们有几个弹出窗口,如下所示:

   <Popup Name="Popup1" AllowsTransparency="True" Placement="Center" PlacementTarget="{Binding ElementName=FirstGrid}" StaysOpen="True">
        <i:Interaction.Behaviors>
            <behavior:MouseDragPopupBehavior/>
        </i:Interaction.Behaviors>
        <Popup.Style>
            <Style TargetType="{x:Type Popup}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsPopupVisible}" Value="True">
                        <Setter Property="IsOpen" Value="True"></Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding IsPopupVisible}" Value="False">
                        <Setter Property="IsOpen" Value="False"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Popup.Style>
        <ItemsControl ItemsSource="{Binding CenterView}" Grid.Row="2">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </Popup>
基本上,这些

弹出窗口是可拖动的,其可见性绑定到视图模型。ItemsPanel 用于添加用户控件(或者准确地说,是绑定到视图的视图模型)。这通常效果很好。

问题是当我们在其他地方打开上下文菜单或另一个窗口时。这会将焦点带到该窗口或菜单上,我们可以再次将焦点放在窗口上的唯一方法是关闭它并重新打开它。

编辑:我忘了提到聚焦窗口并不完全是问题,而是聚焦弹出窗口中的元素:textboxbuttons

我们设法在 Windows 10 和 8.1 中解决了这个问题,方法是在我们绑定到 ItemsControl 的每个视图上使用此代码:

    private void Grid_MouseEnter(object sender, MouseEventArgs e)
    {
        if(!Application.Current.MainWindow.IsActive)
        {
            Application.Current.MainWindow.Activate();
            this.Focus();
        }
    }

但它仍然不适用于我们的测试 Windows 8 或 Windows 7 PC,奇怪的是!

有什么建议吗?

在某处打开窗口或上下文菜单会使弹出元素无法聚焦(按钮除外)

我们通过Application.Current.MainWindow.Activate();挂接 UserControl 主网格的MouseDownMouseEnterMouseMove以及每个子控件(文本框、列表框等)来解决此问题。