单击时,WPF Popup不会导致应用程序被聚焦

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单击时,WPF Popup不会导致应用程序被聚焦相关的知识,希望对你有一定的参考价值。

我有一个控件,它使用一个带有一些WPF控件的弹出窗口,并且StaysOpen =“True”。问题是当应用程序没有焦点时单击弹出窗口,应用程序无法获得焦点。我做了一些研究,似乎这可能是因为弹出窗口用于菜单,所以他们没有连接所有正确的Windows消息处理程序。这是演示问题的准系统示例:

<Window x:Class="TestWindowPopupBehavior.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:TestWindowPopupBehavior="clr-namespace:TestWindowPopupBehavior" Title="MainWindow" Height="350" Width="525">
<Grid>
    <Popup StaysOpen="True" IsOpen="True" Placement="Center">
        <ListBox>
            <TextBlock>123</TextBlock>
            <TextBlock>123</TextBlock>
            <TextBlock>123</TextBlock>
            <TextBlock>123</TextBlock>
            <TextBlock>123</TextBlock>
            <TextBlock>123</TextBlock>
        </ListBox>
    </Popup>

</Grid>
</Window>
  1. 运行该应用程序。
  2. 与列表框交互,这应该可以正常工作。
  3. 切换到另一个应用程序
  4. 在应用程序未处于活动状态时单击列表框。什么都没发生
  5. 单击列表框外部的应用程序。
  6. 单击列表框。它现在正在运作。

我期望在步骤4中发生的是应用程序将获得焦点,并且列表框将选择新项目。

有没有解决这个问题的方法,或者我缺少哪些明显的东西?我正在考虑用完整的窗口重写整个弹出代码,并重新实现我们的行为,但这似乎很复杂只是为了修复这样的小问题。

答案

如果你处理MouseLeftButtonDown事件,你可以调用Window.Activate()方法。但你应该为每个元素写一个 - Popup和所有TextBlocks。

您可以遇到的问题是,在Windows上您可以交换鼠标按钮,左侧变为正确,反之亦然(但我不知道这是如何工作的),因此,您可能需要处理MouseRightButtonDown事件。

另一答案

今天我亲自遇到了这个问题。

如果需要,可以通过在app.xaml.cs中注册Popup类本身的类处理程序来全局修复它:

C#:

/// <inheritdoc />
protected override void OnStartup(StartupEventArgs e)

    EventManager.RegisterClassHandler(typeof(Popup), UIElement.PreviewMouseDownEvent, new RoutedEventHandler(Popup_PreviewMouseDownEvent));


/// <summary>
/// Ensures that the application is activated before the <see cref="UIElement.MouseDownEvent"/> is invoked on the Popup.
/// This solves an issue where the Popup seemed to be frozen if you focused out to another application and clicked back in the Popup itself.
/// </summary>
/// <param name="_"></param>
/// <param name="__"></param>
private void Popup_PreviewMouseDownEvent(object _, RoutedEventArgs __)

    Current?.MainWindow?.Activate();

以上是关于单击时,WPF Popup不会导致应用程序被聚焦的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac 上单击主窗口时,QDialog as Popup 不会隐藏

WPF 用Popup做下拉菜单

WPF popup被截断的原因和修改方法

除非主窗口未聚焦,否则不会更新 QLabel

除非主窗口未聚焦,否则不会更新 QLabel

从 ASP.NET 页面按钮启动 WPF 单击