11

我有一个控件正在使用一个弹出窗口,其中包含一些 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 步中发生的事情是应用程序将获得焦点,并且列表框将选择新项目。

这个问题是否有任何解决方法,或者我缺少什么明显的东西?我正在考虑用成熟的窗口重写整个弹出代码,并重新实现我们的行为,但这似乎真的很复杂,只是为了解决这样的一个小问题。

4

2 回答 2

6

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

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

于 2012-04-24T08:37:33.867 回答
0

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

如果需要,可以通过在 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();
}
于 2019-02-15T09:52:45.623 回答