我希望能够在WindowState=Normal
时设置Visible == false
,但单步执行代码会在设置Maximized
后立即重置为Visibility = true
。
这是重现行为的最小样本。实际的任务是点击最大化表单上的按钮并让它恢复'在没有先恢复然后调整大小和重新定位的情况下,使用与RestoreBounds
不同的位置和大小。它在视觉上分散注意力。当然,它可以很好地通过注释掉的可见性变化。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.Visible = false;
this.WindowState = FormWindowState.Normal;
this.Visible = true;
}
}
表单会闪烁但仍会最大化。我尝试使用SetDesktopBounds
,Show
手动设置边界Refresh
,甚至在visible = true调用上使用BeginInvoke
,以确保基础消息泵有机会处理。
答案 0 :(得分:2)
你正在与Windows本地工作方式进行斗争。 Winforms不遗余力地使它像
这可以通过自己制作winapi电话来修补。像这样:
private void button1_Click(object sender, EventArgs e) {
this.Visible = false;
ShowWindow(this.Handle, SW_SHOWNORMAL);
this.WindowState = FormWindowState.Normal;
this.Visible = true;
}
修改Click事件处理程序:
{{1}}
你想做什么。虽然属性赋值现在看起来多余,但保留它们并确保它们与您传递的ShowWindow()参数匹配非常重要。属性设置器更改了一些内部标志,用于保持Visible和WindowState不相关的错觉。我不能保证这个黑客不会造成麻烦。