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

Fry*_*Guy 11 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>
Run Code Online (Sandbox Code Playgroud)
  1. 运行该应用程序.
  2. 与列表框交互,这应该可以正常工作.
  3. 切换到另一个应用程序
  4. 在应用程序未处于活动状态时单击列表框.什么都没发生
  5. 单击列表框外部的应用程序.
  6. 单击列表框.它现在正在运作.

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

这个问题是否有任何变通方法,或者我遗漏的一些明显的东西?我正在考虑用完整的窗口重写整个弹出代码,并重新实现我们的行为,但这似乎很复杂只是为了修复这样的小问题.

stu*_*bax 6

如果处理MouseLeftButtonDown事件,则可以调用Window.Activate()方法.但是你应该为每个元素写出来 - Popup对于所有TextBlock的元素.

你可以遇到的问题是在Windows上你可以交换鼠标按钮,左边是正确的,反之亦然(但我不知道它是如何工作的),所以,你可能需要处理MouseRightButtonDown事件.

  • 使用Preview ...鼠标事件将其捕获到弹出窗口上,而不必为其内容添加更多处理程序就足够了. (3认同)