从弹出窗口编程聚焦父窗口

时间:2013-02-02 16:53:59

标签: .net wpf xaml focus

我目前遇到WPF Popup的问题,其中对所述弹出窗口的操作想要将Focus返回到应用程序的主窗口。

通常,当您单击窗口上的某个位置时,弹出窗口将关闭,这是所需的行为。但是,我发现没有以编程方式将焦点从弹出窗口内的动作以大致相同的方式带回窗口

以下代码概述了问题:

的Xaml:

<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();
        }
    }
}

Screenshot of the running app Popup being open

当我点击弹出窗口中的按钮时,文本框得到正确聚焦,我甚至可以输入文字,但弹出保持打开。另外,请注意将光标切换到手形的矩形上的MouseOver效果。即使窗口具有焦点,效果也不起作用

只有当我点击进入窗口时,弹出窗口才会消失,效果会再次起作用,等等。

我的问题是:鉴于这种情况,如何让主窗口再次激活,就好像我会点击它一样?

更新

我知道在给定的示例中,我可以简单地关闭代码隐藏中的弹出窗口。这是一个简化的示例 - 在另一个应用程序中,从弹出UI 中开始的操作不知道它存在于弹出窗口,并且在主窗口上发生的任何事情都不知道关于弹出窗口

因此,在UI中引入更多耦合之前,我想知道当你点击进入窗口时运行的机制是否能以某种方式以编程方式触发......

1 个答案:

答案 0 :(得分:1)

我不清楚您上面提供的示例是否模仿了所需的方法,但如果您只是添加该行:

 _popup.IsOpen = false;
SwitchFocus方法中的

(我会把它放在_wdw.Activate()之前,但之后也可以使用),然后当您点击按钮时弹出窗口关闭,TextBox获得焦点

这是你要找的吗?