我试图为WinForm调用ShowDialog(创建表单的实际代码位于.linq脚本中)并且一切正常,但对话框未显示在LINQPad应用程序中居中。当多个监视器正在运行时,这是有问题的,我正在盯着LINQPad,运行我的脚本并在不同的监视器上弹出对话框。我假设将IWin32Window传递给ShowDialog将显示以所有者为中心的对话框,但我不知道如何从LINQPad获取IWin32Window ......它甚至可能吗?
答案 0 :(得分:1)
您尝试将表单设为父级时遇到的困难是您的查询在与LINQPad.exe不同的进程中运行。
您可以使用LINQPad.Util.HostProcessID
获取LINQPad的进程ID,然后使用Process.GetProcessById (Util.HostProcessID).MainWindowHandle
获取Windows句柄,但是您仍然无法为您的表单提供帮助。您可以做的最好的事情是调用Win32函数(如GetWindowRect
)以获取LINQPad的主窗口位置,然后手动居中显示您的表单。
您是否考虑过倾倒所需的控件?然后,LINQPad将在输出窗格中呈现它并启动消息循环。例如:
var panel = new Panel { Padding = new Padding(10) };
panel.Controls.Add (new TextBox { Dock = DockStyle.Top });
panel.Controls.Add (new Label { Dock = DockStyle.Top, AutoSize=true, Text="Testing" });
panel.Dump();
请注意,您随后在控件上的事件处理程序中显示的任何表单都将居中于父级:
panel.Controls[1].Click += (sender, args) =>
new Form { StartPosition = FormStartPosition.CenterParent }.ShowDialog();
答案 1 :(得分:1)
作为@Albahari答案的一小部分:
var dialog = new FolderBrowserDialog();
var handle = Process.GetProcessById(Util.HostProcessID).MainWindowHandle;
var win32Window = new NativeWindow();
win32Window.AssignHandle(handle);
if (dialog.ShowDialog(win32Window) != DialogResult.OK)
{
"Aborted".Dump();
return;
}