单击时,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>
- 运行该应用程序。
- 与列表框交互,这应该可以正常工作。
- 切换到另一个应用程序
- 在应用程序未处于活动状态时单击列表框。什么都没发生
- 单击列表框外部的应用程序。
- 单击列表框。它现在正在运作。
我期望在步骤4中发生的是应用程序将获得焦点,并且列表框将选择新项目。
有没有解决这个问题的方法,或者我缺少哪些明显的东西?我正在考虑用完整的窗口重写整个弹出代码,并重新实现我们的行为,但这似乎很复杂只是为了修复这样的小问题。
答案
如果你处理MouseLeftButtonDown
事件,你可以调用Window.Activate()
方法。但你应该为每个元素写一个 - Popup
和所有TextBlock
s。
您可以遇到的问题是,在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不会导致应用程序被聚焦的主要内容,如果未能解决你的问题,请参考以下文章