问题描述
如果我通过将窗口的所有者设置为父窗口而将非模态窗口设置为子窗口,然后在此子窗口中显示MessageBox,则在关闭子窗口时父窗口将失去焦点.如果Windows资源管理器或其他应用程序打开,此应用程序将获得焦点,我的主窗口将被隐藏.
这似乎是一个已知的问题,因为我在另一个新闻组中看到它,但我没有看到一个很好的解决方案.在OnDeactivate中将所有者设置为null不是一个选项.在将MessageBox显示为null并在此之后重置之前设置所有者没有帮助.在OnClosed事件中将所有者设置为null也没有帮助.
找到简单解决方案
如果您遇到与我所描述的相同的问题,请将以下代码放在所有子窗口的OnClosing中.
void OnClosing(System.ComponentModel.CancelEventArgs e)
base.OnClosing(e);
if (null != Owner) {
Owner.Activate();
}
// ....
Run Code Online (Sandbox Code Playgroud)
它可以跟随任何进一步的处理逻辑,甚至可以容忍打开MessageBoxes.
例如,代码
我认为这个问题似乎要大得多.如果将打开消息框并关闭子窗口,则以下示例将删除父窗口的焦点(将代码复制到Window的已加载事件处理程序中).
Window firstChildWindow = new Window() {
Title = "Floating Window", Width = 100, Height = 70
};
firstChildWindow.Owner = Window.GetWindow(this);
Button button = new Button() { Content="MessageBox"};
button.Click += delegate {
MessageBox.Show("Klicking her breaks the focus-chain."); };
firstChildWindow.Content = button;
firstChildWindow.Show();
Run Code Online (Sandbox Code Playgroud)
此示例也打破了焦点链:
Window firstChildWindow = new Window() {
Title = "Floating Window", Width = 100, Height = …Run Code Online (Sandbox Code Playgroud)