C# 下面的代码片段有多糟糕?

C# 下面的代码片段有多糟糕?,c#,windows,windows-mobile,mobile,delegates,C#,Windows,Windows Mobile,Mobile,Delegates,我的问题很简单:下面的代码片段有多糟糕?你会怎么做 关键是代码不会关闭表单,而是在表单上显示另一个组件,并设置处理方式(这是移动平台,因此单击顶部的OK按钮会生成关闭事件)。这是因为向用户一个接一个地显示多个表单(4或5)会使应用程序闪烁,而且非常烦人,而只更换组件则会更加流畅。这个模型可以工作,但看起来很糟糕,我希望有一个更干净的方法来处理这个问题 更新: 我更新了代码示例,使变量名有点易懂。尽管如此,我相信这是可怕的,(a)但不确定有多少,更重要的是,(b)如何做得更好 更新2: 所以,代码

我的问题很简单:下面的代码片段有多糟糕?你会怎么做

关键是代码不会关闭表单,而是在表单上显示另一个组件,并设置处理方式(这是移动平台,因此单击顶部的OK按钮会生成关闭事件)。这是因为向用户一个接一个地显示多个表单(4或5)会使应用程序闪烁,而且非常烦人,而只更换组件则会更加流畅。这个模型可以工作,但看起来很糟糕,我希望有一个更干净的方法来处理这个问题

更新: 我更新了代码示例,使变量名有点易懂。尽管如此,我相信这是可怕的,(a)但不确定有多少,更重要的是,(b)如何做得更好

更新2: 所以,代码似乎还是有点神秘

现在问题是: 我向用户展示了一个表单,它用几种语言指导用户做什么。他通过单击窗口上的“确定”继续操作。接下来,我询问他的语言,然后像这样问几个问题(他/她的GPS在哪里等)。在他回答完问题后(每个问题不应该超过几秒钟),我给他看了一个启动屏幕(同时我在一个单独的线程中加载内容),上面有一张图片。一个接一个地显示这些表单会使整个应用程序启动缓慢,并充满UI滞后

我要做的是解决滞后问题:我将窗口的内容放在面板中,然后将这些面板一个接一个地放在面板上,并隐藏其中的每一个,但用户应该可以看到的除外。(
current
variable)每个窗口执行不同的操作,因此我还需要更改窗口
closing
事件的处理程序。在此代码中,启用面板的部件与处理车窗关闭事件的部件具有相同的功能(
handler1
handler2
等)。如果参数为
null
,则执行前者,如果不是(这意味着它是由用户触发的),则执行后者

我需要一个可扩展的解决方案,以便我可以插入和删除对话框,随时我想(函数的顺序和指针存储在
控件
字段中,如果您真的理解它的话,这似乎非常方便。虽然更改表单的整个内容从来都不容易,但应该有一种更简单的方法,也应该有一种更好的方法,这就是我正在寻找的方法


我希望这次我能解释一下这个模型是如何工作的。

不知怎的,你的代码让我想哭,对不起。我读了两遍,我所知道的只是它“doesStuff”和“STATES”


如果你真的想在这个问题上得到一些帮助,你必须首先自己解决它。

我认为理论上可能会使代码更有趣,更有趣,更危险,更快乐,更易变,更不经意地异想天开,但这需要一些认真的思考。

使用,XML!它是人类可读的!

更严重-

似乎您正在尝试创建某种配置向导,因此我将首先对此进行研究。对于您的特定解决方案,我通常非常强烈地反对“分层面板”方法。我这样做是因为我维护由发现这种方法的人编写的应用程序,或相关的“选项卡控件上的隐藏选项卡”方法,这是个好主意。事实并非如此,维护人员会在未来几年诅咒你的名字

话虽如此,还有什么替代方案?好吧,一个替代方案是你已经因为它的“闪烁”而忽略的。我想说的是,一般来说,对于一个快速而肮脏的应用程序来说,闪烁并不是什么大问题。例如,在关闭旧窗口之前,确保调用新窗口可能是一个好主意。(我假设这是可能的,我还没有在移动设备上开发。)

另一种可能是分层面板的不那么邪恶的版本。与其将半打面板扔到一个表单中,不如为每个向导页面创建一个单独的用户控件,然后将用户控件添加/删除到一个包含表单中。这样可以避免闪烁,并且更易于维护,因为每个页面都位于不同的位置租金控制。这还可以简化任何后续的“后退”按钮功能,并使您的数据结构更自然地定义,因为这些用户控制将与特定的逻辑数据位相关联。这仍然不理想,但对于一次性解决方案来说可能已经足够好了

如果您预见到随着产品的成熟会对向导进行大量修改,那么第三种技术可能是通过以更具逻辑性/声明性的方式(例如,通过XML)定义用户控件来概括用户控件的创建。如果基于XML动态生成合理的控件,则修改面板可能与深入XML并执行以下操作一样简单:

<Questions>
    <Question type="Text"> <!-- generate a textbox for the answer field -->
        Favorite Color:
    </Question>
    <Question type="Number" range="0-255"> <!-- Maybe this is a spinner -->
        The answer to life, the universe, and everything:
    </Question>
</Questions>

最喜欢的颜色:
生命、宇宙和一切的答案:

这是我的想法,对于任何一次性应用程序来说,这都是完全超量的,但这是一种可能性。

现在,让我警告一下,这可能会奏效,但它可能不是解决你真正问题的答案——当你有很多表单时,用户界面速度慢且反应迟钝。真正的答案可能是继续并执行所有单独的表单,但在用户注视第一个表单时,让每个表单在后台线程中加载其子表单

但假设您仍然对此有所设置,我将首先创建一个单独的类来处理面板堆叠/层次结构。将其称为PanelManager。您将实例化PanelManager并将其与主窗体关联,然后向其添加面板(可能键入字符串)在主窗体中,让关闭处理程序调用PanelManager.CloseCurrentPanel()和
<Questions>
    <Question type="Text"> <!-- generate a textbox for the answer field -->
        Favorite Color:
    </Question>
    <Question type="Number" range="0-255"> <!-- Maybe this is a spinner -->
        The answer to life, the universe, and everything:
    </Question>
</Questions>
public class PanelManager {
// constructor
public PanelManager (Form ownerForm);

// short-cut properties
public Panel this[int idx]
{ get; set; }

public int Index
{ get; set; }

// main functionality

public int AddPanel (Panel p);
public void SetPanelOrder (Panel p, int idx);
public void RemovePanel (Panel p);
public void RemovePanelAt (int idx);

// shows the first Panel
public void Show ();

// shows Panel[idx]
public void Show (int idx);

// adds the panel to the top of the stack and displays it
// returns the index of the panel
public int AddPanelAndShow (Panel p);

// hides the current panel, displays the one underneath it
// returns false if there are no more panels
public bool HideCurrentPanel ();
}