C# 为什么窗口突然失去焦点? 脚本

C# 为什么窗口突然失去焦点? 脚本,c#,wpf,xaml,focus,C#,Wpf,Xaml,Focus,考虑以下场景: 您可以在WPF中启动一个应用程序 主窗口打开(非模式)Window1(属于MainWindow) 将焦点更改为其他窗口(例如,VisualStudio) 当其他应用程序具有焦点时,按下Window1中的按钮 Window1显示一个消息框 你把留言盒关上 效果:你们的主窗口突然位于你们在第二步选择的窗口下方 图像: 第一步 步骤2 步骤3 步骤4 资料来源: MainWindow.xaml MainWindow.xaml.cs 名称空间WpfApp1 { ///

考虑以下场景: 您可以在WPF中启动一个应用程序

  • 主窗口打开(非模式)
    Window1
    (属于
    MainWindow
  • 将焦点更改为其他窗口(例如,VisualStudio)
    • 当其他应用程序具有焦点时,按下
      Window1中的按钮
    • Window1显示一个消息框
  • 你把留言盒关上
  • 效果:你们的主窗口突然位于你们在第二步选择的窗口下方

    图像: 第一步

    步骤2

    步骤3

    步骤4

    资料来源: MainWindow.xaml
    
    
    MainWindow.xaml.cs
    名称空间WpfApp1
    {
    /// 
    ///MainWindow.xaml的交互逻辑
    /// 
    公共部分类主窗口:窗口
    {
    公共主窗口()
    {
    初始化组件();
    }
    私有无效按钮\u单击(对象发送者,路由目标e)
    {
    Window1 Window1=新的Window1();
    window1.Owner=this;
    window1.Show();
    }
    }
    }
    
    Window1.xaml
    
    
    Window1.xaml.cs
    名称空间WpfApp1
    {
    /// 
    ///Window1.xaml的交互逻辑
    /// 
    公共部分类Window1:Window
    {
    公共窗口1()
    {
    初始化组件();
    }
    私有无效按钮\u单击(对象发送者,路由目标e)
    {
    MessageBox.Show(“测试”);
    Close();
    }
    }
    }
    
    问题:
    从另一个窗口关闭messagebox后,如何在主窗口中保持焦点?

    当您按预期打开新窗体时,旧窗口将失去控制,但是:在关闭旧窗口之前,您需要执行类似于
    Form1.Current.focus()的操作。您必须将Form1的实例传递给子窗体。因此,在调用show之前,在预览窗体上创建一个设置的属性。然后从预览表单的实例访问主表单的实例。我更新了我的评论。@Joel看起来这样行得通。只是一个上升,因为
    Window1
    属于
    MainWindow
    ,调用
    this.Owner.Focus()
    就足够了。要我将其作为答案提交吗?如果对Owner使用重载会发生什么?
    <Window x:Class="WpfApp1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <StackPanel Orientation="Vertical">
                <TextBox />
                <Button Content="Open window" Click="Button_Click" />
            </StackPanel>
        </Grid>
    </Window>
    
    namespace WpfApp1
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                Window1 window1 = new Window1();
                window1.Owner = this;
    
                window1.Show();
            }
        }
    }
    
    <Window x:Class="WpfApp1.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1"
            mc:Ignorable="d"
            Title="Window1" Height="450" Width="800" ShowInTaskbar="False">
        <Grid>
            <Button Click="Button_Click"/>
        </Grid>
    </Window>
    
    namespace WpfApp1
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("Test");
    
                Close();
            }
        }
    }