【问题标题】:WPF modal window as tool window in WinForms disappearsWPF模式窗口作为WinForms中的工具窗口消失
【发布时间】:2012-06-14 12:01:15
【问题描述】:

我想知道是否有人可以帮助我解决这个相当莫名其妙的情况。我有一个 WPF 表单myForm,我在 WinForm 应用程序中以模态方式显示它(不使用 ElementHost)。如果我使用默认的 WindowStyle 并且它显示在任务栏中,一切正常。但是现在我不希望表单显示在任务栏中或包含最小化按钮,因此我做了以下操作:

MyForm myForm = new MyForm();
myForm.ShowInTaskbar = false;
myForm.WindowStyle = System.Windows.WindowStyle.ToolWindow;
myForm.WindowStartupLocation =System.Windows.WindowStartupLocation.CenterOwner;
myForm.ShowDialog();

现在,wpf 表单以模态方式显示,并且没有最小化按钮。如果我现在在任务栏中选择“父”winform 应用程序,wpf 表单就会消失,并且似乎没有任何方法可以返回它!我读过this,它相似但不一样(纯WPF应用程序),所以我可以理解为什么主应用程序没有出现在ALT+TAB菜单中,但是谁能告诉我如何返回wpf表单?

提前致谢。

【问题讨论】:

  • 澄清一下,问题是如果 WPF ToolWindow 被推到主应用程序或其他应用程序后面,您根本无法将窗口向前推进吗?
  • 您是否尝试过设置工具窗口的所有者?如果您混合使用 winforms 和 wpf,这甚至应该可以工作。您可以使用 WindowsInteropHelper 或直接使用 winapi 调用 SetParent。
  • @CodingGorilla 是的,没错。
  • 所有者是问题。一个很难,你没有一个窗口来成为所有者。您必须调用 SetWindowLongPtr() 来设置所有者。

标签: c# .net wpf windows winforms


【解决方案1】:

WindowsInteropHelper 的使用允许您使用 Winforms-form 包装托管的 WPF-form,并将其父级设置为 Winforms 控件,从而防止 WPF 表单消失(dowhilefor 和 Hans Passant 也指出)

例如:

// Use the interop helper for the specified wpf window hosted by the win32 owner
WindowInteropHelper wih = new WindowInteropHelper(wpfForm);
wih.Owner = this.someWin32FormsControl.Handle;

【讨论】:

    【解决方案2】:

    这与 Winforms 或 WPF 无关,这是 Windows 的运行方式。我认为您拥有的唯一解决方案是连接您的方式;即拦截 Winforms 表单上的 Activated 事件,如果您的 WPF 工具窗口可见,则将该窗口向前移动并赋予其焦点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      相关资源
      最近更新 更多