【问题标题】:change topMost at runtime在运行时更改 topMost
【发布时间】:2012-04-12 23:08:37
【问题描述】:

我正在使用此代码.. 现在默认情况下我的应用是 topMost = true

但是当我尝试让按钮在下面执行此功能时,我遇到了一个问题,它会禁用它一次。然后第二次点击不再。

public void setTop()
{
    if (this.TopMost == false)
    {
        this.TopMost = true;
    }
    if (this.TopMost == true)
    {
        this.TopMost = false;
    }

任何想法为什么?过去通过菜单设置热键也发生过这种情况,我能够做到一次,然后就没有工作了:(

编辑:我发现了如何做到这一点,但无法从另一个表单中做到这一点。

private void button1_Click(object sender, EventArgs e)
{
    pwn4g3 mainForm = new pwn4g3();
    mainForm.TopMost = true();
    mainForm.Update();
}

【问题讨论】:

  • 代码提示:永远不要if(x == true),你也应该写if(!x)而不是if(x == false)。不过,在这种情况下,this.TopMost = !this.TopMost; 足以满足整个方法的需求。
  • 你也可以只写 TopMost = !TopMost。
  • 呃,等等,如果它被禁用,你如何点击它第二次?更改 TopMost 有很多可能的副作用,即重新创建本机 Windows 窗口。您需要改进您的证据以帮助我们帮助您。有此问题的小型复制项目最好,如果仍然太大而无法发布,请将其发布到文件共享服务。
  • @minitech 我做了,但它失败了,我将它重写为认为它可能有效。但是没有。
  • @hansPassant 就像我说的那样,我称之为 setTop();在按钮中,如果禁用则启用,如果启用则禁用。但它不会工作不止一次。

标签: c# topmost


【解决方案1】:
public void setTop()
{
    if (this.TopMost == false)
    {
        this.TopMost = true;
    }
    else // change this to else. 
    {
        this.TopMost = false;
    }
}

在您的版本中,当 true 分配给 this.topmost 时,第二个 if 条件满足。这就是问题的根源。

假设代码执行以 false 开始,然后第一个 if 条件满足,更改为 true,检查第二个 if 条件,它也满足,再次更改为 false。

【讨论】:

  • 或者你可以这样做。TopMost = !this.TopMost -> 如果它是假的,那就是真的。如果是真的,那就是假的
  • 这可行,正确.. 但现在问题是从另一种形式改变它。
  • @thorkia 这是一个很好的建议。我喜欢它。但我不确定可读性。
【解决方案2】:

在您的第二个示例中,您不是 Showing 您的 Form

private void button1_Click(object sender, EventArgs e)
{
    pwn4g3 mainForm = new pwn4g3();
    mainForm.Show();
    mainForm.TopMost = true;
    mainForm.Update();
}

另外,如果您使用 mainForm.Show(this);,第二个表单将归您的 Parent Form 所有,并且会自动位于顶部。

private void button1_Click(object sender, EventArgs e)
{
    pwn4g3 mainForm = new pwn4g3();
    mainForm.Show(this);
}

但就个人而言,如果我想切换 Topmost 属性,我会将我的 Form 变量作为类级别变量并执行类似的操作。

public partial class Form1 : Form
{
    pwn4g3 mainForm = new pwn4g3();
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if(mainForm.IsDisposed )   //Check that Form hasn't been destroyed
           mainForm = new pwn4g3();
        if(!mainForm.Visible)  //Make sure it is visible
            mainForm.Show();

        mainForm.TopMost = !mainForm.TopMost;
        this.BringToFront(); //To verify zorder of created form
    }
}

【讨论】:

  • 嗯。可以,是的..但问题是我使用了启动画面,所以它会在保存时一遍又一遍地重新显示启动画面。
  • @Jogn 你想做什么?这个表格的目的是什么。
猜你喜欢
  • 2012-09-04
  • 2011-04-10
  • 2011-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多