让主窗体重新获得焦点

3

我有一个包含两个窗体的C#应用程序。

第一个是主窗体,应该一直保持打开状态。

第二个是用户可以启用的预览窗格。

当用户选择显示预览窗格(菜单选项)时,会打开预览窗格。

这正是我想要的。

然而,我想阻止预览窗格获得焦点。否则,如果用户想要访问菜单(位于主窗体上),他们首先点击,看起来好像什么都没有发生(但实际上焦点从预览窗格切换到主窗体)。只有在第二次点击后,他们才能访问菜单。

所以我认为我有一个相当简单的解决方案:

如果预览窗格获得焦点,只需将焦点设置为主窗体。

然而,看起来我无法从预览窗格访问主窗体。

要显示预览窗格,我只需执行以下操作(在主窗体上):

QRcodeGenerator.QrCodePreview preview = new QRcodeGenerator.QrCodePreview();
preview.show();

我试图通过以下方式(在预览窗口中)将焦点返回主表单:
private void QrCodePreview_GotFocus(object sender, EventArgs e)
{
    QrCodeGenerator.QrCodeSampleApp.focus();
}

但是,正如所述,看起来我无法访问它。 表单已消失

+1 给这张图片和难过的表情,希望这些答案能帮到你,它们听起来对我来说是正确的,但如果错了,你的悲伤让我微笑 =D。 - Paul C
@CodeBlend:这不仅是错误的,而且是一种精神疾病。它被称为:反社会人格障碍 :) - PeeHaa
4个回答

2
如果您调用
preview.show();

as

preview.show(this);

您可以使用preview.Parent访问预览对象中的主表单。

我尝试了这个,但它不起作用。即使我修复了你的拼写错误。如果在预览窗格中使用,preview.Parent 应该改为 this.Parent - PeeHaa
我最终采用了你的答案和kmcc049的结合。 - PeeHaa
抱歉,是应该使用 this.Parent 位于预览对象内部。谢谢! - Arun
我意识到我指向了错误的属性。应该使用的属性是“Owner”,而不是“Parent”-抱歉! - Arun

2

您需要将主窗体的实例传递给子窗体。因此,在调用show之前,请在预览窗体上创建一个属性并设置该属性。然后从预览窗体的实例访问主窗体的那个实例。


@mkcc049:我最终采用了你的答案和Arun的结合。 - PeeHaa
是的,我想建议使用他的调用方法,并将 Parent 属性包装在您自己的一个中,转换为正确的类型,这样您就可以访问父窗体的所有成员。 - kmcc049

1
你可以尝试,
对于Form1,做如下操作,
public static Form1 Current;

public Form1()
{
    InitializeComponent();
    Current = this;
}

然后从预览表单中,

Form1.Current.Focus();

0

使用ShowDialog()启动预览,然后在调用ShowDialog()之后的下一行调用this.Focus()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接