【发布时间】:2023-02-24 01:25:08
【问题描述】:
在我的应用程序中,我有两种形式:主窗口和覆盖。覆盖可以最小化(通过控制它的大小)到屏幕顶部,并且主窗口可以最小化到任务栏或系统托盘。
单击叠加层上的按钮后,它可以在最小化和非最小化之间切换。单击此按钮时,主窗口会输入 FormWindowSate.Normal。
我希望它不仅在单击控制按钮时起作用,而且在叠加层失去焦点时起作用。因此我的问题是:如果我将隐藏覆盖层的代码添加到事件处理程序中,我就可以很好地隐藏覆盖层。但是当我尝试添加将主窗口返回到其原始状态的代码时,该代码在所有地方都停止运行。 这是相关代码:
在叠加形式中:
public event System.EventHandler OnShowOverlay;
public event System.EventHandler OnHideOverlay;
private void ShowOverlay()
{
OnShowOverlay(this, null);
this.Focus();
OverlayPanel.Visible = true;
this.Height = 70;
this.InfoPanel.Location = new Point(25, 35);
this.OverlayShowButton.Location = new Point(0, 35);
}
private void HideOverlay()
{
if(OnHideOverlay != null)
{
OnHideOverlay(this, null); //!!!
this.Focus();
this.OverlayPanel.Visible = false; //***
this.OverlayShowButton.Location = new Point(0, 0); //***
this.InfoPanel.Location = new Point(25, 0); //***
this.Height = 35; //***
}
}
private void OverlayShowButton_Click(object sender, MouseEventArgs e)
{
OverlayPanel.Visible = !OverlayPanel.Visible;
if (OverlayPanel.Visible)
{
ShowOverlay();
}
else
{
HideOverlay();
}
}
public void OverlayNoFocus(object sender, EventArgs e)
{
HideOverlay(); //!!!
}
在叠加设计器中:
this.Deactivate += new System.EventHandler(OverlayNoFocus);
在主要形式中:
public MainForm()
{
//irrelevant code here.
this.overlay.OnShowOverlay += new System.EventHandler(onOverlayShow);
this.overlay.OnHideOverlay += new System.EventHandler(onOverlayHide);
this.overlay.Show();
//irrelevant code here.
}
FormWindowState saveWinState = new FormWindowState();
void onOverlayShow(object sender, EventArgs e)
{
saveWinState = this.WindowState;
this.Show();
this.WindowState = FormWindowState.Normal;
}
void onOverlayHide(object sender, EventArgs e)
{
this.WindowState = saveWinState;
}
//!!! When OnHideOverlay is in OverlayNoFocus, the problem occur.
//*** These line function as expected so long as OnHideOverlay is not in OverlayNoFocus
谁能告诉我我在这里做错了什么?
【问题讨论】:
-
Visible 属性很棘手,它不会返回您分配给它的值。相反,它会告诉您面板是否对用户实际可见。故障模式不是很明显,但 WindowState 的使用是某种提示。如果您曾经最小化覆盖表单,则 OverlayPanel.Visible 将始终返回 false。请改用布尔值。
-
谢谢,不过我确实是。如果您查看 HideOverlay() 和 ShowOverlay() 函数。不过,我确实根据您的建议撤销了 if 语句并删除了分配。可悲的是,它并不影响我手头的实际问题......