gpt4 book ai didi

c# - 切换状态(C#/Windows 窗体)

转载 作者:太空宇宙 更新时间:2023-11-03 20:33:21 25 4
gpt4 key购买 nike

所以我认为枚举可以帮助我处理状态。基本上,我有一个具有 3 种状态的小边栏应用程序:

最小化 - 您可以在其中看到一个小的彩色矩形面板,指示该应用程序已在桌面上打开。

预览 - 这表明应用程序已打开,您可以看到 Logo 。

正常 - 可以看到整个侧边栏。

现在,我设置了一个这样的枚举:

public enum CurrentState
{
Minimized = 0,
Preview,
Normal
};

我正在尝试检查 CurrentState 并在用户单击始终可见的面板时切换到另一个像这样的面板:

    // If Min=Set(Preview). If Preview=Set(Normal). If Normal=Set(Min).
if (State.HasFlag(CurrentState.Minimized))
{
State = CurrentState.Preview;
this.Location = new Point(
Screen.PrimaryScreen.WorkingArea.Right - _minimize.Size.Width - _logo.Size.Width,
this.Location.Y
);
}
else if (State.HasFlag(CurrentState.Preview))
{
State = CurrentState.Normal;
this.Location = new Point(
Screen.PrimaryScreen.WorkingArea.Right - this.Size.Width,
this.Location.Y
);
}
else
{
State = CurrentState.Minimized;
this.Location = new Point(
Screen.PrimaryScreen.WorkingArea.Right - _minimize.Size.Width,
this.Location.Y
);
}

当应用程序加载时,我将初始值设置为:

CurrentState.Minimized;,像这样:

CurrentState State = CurrentState.Preview;

所以,这是预期的行为:

如果表单已最小化,请稍微移动它以使其处于预览模式。如果它处于预览状态,请稍微移动它以使其处于正常模式。如果是普通模式,再设置为最小化。

但是,在第一次单击始终可见的面板时,它会按预期工作。它将其设置为预览模式并稍微移动了表单。

但是,仅此而已。一旦它处于预览模式,它不会在第二次单击面板时进入普通模式,这意味着目前无法使其进入普通 View 。

我是不是做错了什么?

虽然这可能不常见,但这是合乎逻辑的,我无法弄清楚哪里出了问题。

这里有一些视觉效果可以帮助更好地阐明我的意思:

enter image description here

最佳答案

您拥有的代码总是进入 if/else 结构的最小化分支。

下面的代码不使用标志而是比较枚举,它可以正常工作并根据需要在状态之间进行:

if (State == CurrentState.Minimized)    
{
State = CurrentState.Preview;
}
else if (State == CurrentState.Preview)
{
State = CurrentState.Normal;
}
else
{
State = CurrentState.Minimized;
}

不过,有一个想法可能会让这个设计更容易使用,那就是实现 State pattern .

顾名思义,这种设计模式处理的正是您要解决的情况。

基本上,您的三个状态的逻辑将被拆分为三个单独的对象,这些对象实现类似 IWindowState 的东西,其中 IWindow 状态包括一个名为 MoveState 的方法。调用 MoveState 时,最小化窗口的状态对象知道下一个状态是 Preview,并且 Preview 对象知道转到 Normal。

对于您的情况,这可能是设计矫枉过正,但一旦您想要任何更复杂的逻辑,例如“从最小化到预览,除非用户有设置直接移动到正常”,那么该模式就可以通过适当的管理为自己付出代价复杂性。

关于c# - 切换状态(C#/Windows 窗体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6305127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com