【发布时间】:2009-02-11 20:33:08
【问题描述】:
我的问题很简单:下面的 sn-p 代码有多糟糕? 你会怎么做呢?
CancelEventHandler _windowClosing;
private CancelEventHandler WindowClosing
{
set
{
clearEventHandlerList();
this.Closing += value;
_windowClosing = value;
/*
* if calling the method with null parameters,
* it will set up itself as the primary control on the Window
*/
_windowClosing(null,null);
}
get
{
return _windowClosing;
}
}
private readonly CancelEventHandler[] CONTROLS = null;
private int current = 0;
public InitializerForm()
{
InitializeComponent();
/*
* these are the handlers for the different controls,
* in the order of appereance to the user
*/
STATES = new CancelEventHandler[] { handler1, handler2, etc. };
WindowClosing = CONTROLS[0];
}
private void clearEventHandlerList()
{
foreach (CancelEventHandler c in CONTROLS)
{
this.Closing -= c;
}
}
private void handler1(object obj, CancelEventArgs e)
{
if (obj == null)
{
//hide every other control, but this one, also set up if necessary
}
else
{
//do something
WindowClosing = CONTROLS[++current]; // set the next control to show
e.Cancel = true;
}
}
关键是代码不会关闭表单,而是在其上显示另一个组件,并设置处理方式(这是移动平台,因此单击顶部的确定按钮会生成关闭事件)。这是因为一个接一个地向用户显示多个表单(4 个或 5 个)会使应用程序闪烁,也很烦人,而仅替换组件则更加顺畅。这个模型有效,但看起来很讨厌,我想要一种更简洁的方法来处理这个问题。
更新: 我更新了代码示例,使变量名有点说话。不过,我确信这很糟糕,(a) 但不确定有多少,更重要的是,(b) 如何做得更好。
更新 2: 所以,看来代码还是有点神秘。
现在问题出在: 我向用户展示了一个表单,该表单以多种语言指示他该做什么。他继续单击窗口上的“确定”。接下来,我问他的语言,然后像这样的几个问题(他/她的 GPS 在哪里等)。在他回答完问题后(每个问题不应该超过几秒钟),我给他看一个启动画面(同时我在一个单独的线程中加载内容),上面有一张图片。一个接一个地显示这些表单会使整个应用程序启动缓慢,并充满 UI 滞后。
以下是我为解决滞后问题所做的工作:我将窗口的内容放入面板中,然后将这些面板一个接一个地放置,并隐藏除应该对用户可见的每个面板之外的每个面板。 (current 变量)每个窗口做不同的事情,所以我需要另外更改窗口closing 事件的处理程序。在此代码中,启用面板的部分与处理窗口关闭事件的部分具有相同的功能(handler1、handler2 等)。如果参数是null,则执行前者,如果不是(这意味着它是由用户触发的),则执行后者。
我需要一个可扩展的解决方案,以便我可以随时插入和删除对话框(函数的顺序和指针存储在 CONTROLS 字段中,这似乎非常方便,如果你真的理解它。虽然改变表单的全部内容从来都不是一件容易的事,但应该有一种更简单的方法来做到这一点,而且还有一种更好的方法,这就是我正在寻找的。p>
我希望这次我能解释一下这个模型是如何工作的。
【问题讨论】:
-
我建议您阅读一些 .NET 或 C# 编码指南。例如变量命名。我第二个 LDomagala...
-
你为什么这么快地向用户展示 4 或 5 个表单?
-
忘记上面的代码。你想达到什么目的?
-
+1:对于马特,告诉我们你想要做什么,我既没有时间也没有意志力去理解上述内容(无论如何也不是一时兴起,如果我也有的话......)
-
哈哈,我不认为变量命名是上面代码的关键。
标签: c# windows windows-mobile mobile delegates