我目前遇到 WPF 弹出窗口问题,其中对所述弹出窗口的操作希望将焦点返回到应用程序的主窗口。
通常,当您单击窗口上的某个位置时,弹出窗口会关闭,这是所需的行为。但是,我发现没有任何编程方式可以以几乎相同的方式将焦点从弹出窗口内的操作带回窗口。
以下代码概述了该问题:
xml:
<Window x:Class="PopupFocusEtc.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" x:Name="_wdw">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition /><ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox x:Name="_txt" Text="Test"
Grid.ColumnSpan="2" />
<Button Grid.Row="1" x:Name="_btnOpen"
Click="OpenPopup"
Content="Open Popup" Grid.ColumnSpan="2" />
<Popup x:Name="_popup"
Placement="Bottom"
HorizontalOffset="10"
PlacementTarget="{Binding ElementName=_btnOpen}"
StaysOpen="False">
<Button Click="SwitchFocus"
MinHeight="100" MinWidth="100"
Margin="5"
Content="Focus" />
</Popup>
<Rectangle Grid.Column="1" Grid.Row="2"
Fill="DarkOliveGreen">
<Rectangle.Style>
<Style TargetType="Rectangle">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Cursor" Value="Hand" />
</Trigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>
</Grid>
</Window>
代码隐藏:
using System.Windows;
using System.Windows.Input;
namespace PopupFocusEtc
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OpenPopup(object sender, RoutedEventArgs e)
{
_popup.IsOpen = true;
}
private void SwitchFocus(object sender, RoutedEventArgs e)
{
_txt.Focus();
Keyboard.Focus(_txt);
_txt.SelectAll();
_wdw.Activate();
}
}
}
当我单击弹出窗口中的按钮时,会发生文本框正确聚焦,我什至可以输入文本,但弹出窗口保持打开状态。此外,请注意将光标切换为手的矩形上的 MouseOver 效果。即使窗口有焦点,效果也不起作用。
只有当我单击窗口时,弹出窗口才会消失,效果会再次起作用,等等。
我的问题是:鉴于这种情况,我如何让主窗口再次激活,就像我会点击它一样?
更新
我知道在给定的示例中,我可以简单地关闭代码隐藏中的弹出窗口。这是一个简化的示例 - 在另一个应用程序中,从 Popup UI 内开始的操作不知道它存在于 Popup 上,并且主窗口上发生的任何事情也不知道弹出窗口。
因此,在 UI 中引入更多耦合之前,我想知道当您单击窗口时运行的机制是否可以以某种方式以编程方式触发......