最近在用Smart Client写范本,由于是第一次用SC,再加上平时写WinForm比较少,所以拿TaskVision和IssueVision作为参考.昨天看了IssueVision的登陆的实现过程,发现了两个小小的问题.
第一个问题
IV登陆窗口有点酷,是渐渐显示的(渐显),看了下面代码
private void fadeTimer_Tick(object sender, EventArgs e)
{
if (m_showing)
{
double d = 1000.0 / fadeTimer.Interval / 100.0;
if (Opacity + d >= 1.0)
{
Opacity = 1.0;
fadeTimer.Stop(); //fadeTimer从命名上看知道应该是个显示/隐的定时器.
}
else
{
Opacity += d; //控制窗口的不透明度.
}
}
else
{
double d = 1000.0 / fadeTimer.Interval / 100.0;
if (Opacity - d <= 0.0)
{
Opacity = 0.0;
fadeTimer.Stop();
}
else
{
Opacity -= d;
}
}
}
{
if (m_showing)
{
double d = 1000.0 / fadeTimer.Interval / 100.0;
if (Opacity + d >= 1.0)
{
Opacity = 1.0;
fadeTimer.Stop(); //fadeTimer从命名上看知道应该是个显示/隐的定时器.
}
else
{
Opacity += d; //控制窗口的不透明度.
}
}
else
{
double d = 1000.0 / fadeTimer.Interval / 100.0;
if (Opacity - d <= 0.0)
{
Opacity = 0.0;
fadeTimer.Stop();
}
else
{
Opacity -= d;
}
}
}
注意到这段代码的else部分,从程序上看应该是渐隐.
再看一下Closing事件
private void LoginForm_Closing(object sender, CancelEventArgs e)
{
m_showing = false;
fadeTimer.Start();
}
{
m_showing = false;
fadeTimer.Start();
}
查了一下MSDN的Closing事件
"在窗体关闭时,Closing 事件发生。在窗体关闭后,将释放在该对象内创建的所有资源并处置该窗体。"
我的猜想:
虽然Closing 事件中把fadeTimer重新启动了,但是紧接着窗口就被关闭,窗体资源被释放.窗口都没了,这个渐隐变得没有效果了也是当然的.
改进办法,"若要取消窗体的关闭操作,请将传递给事件处理程序的 CancelEventArgs 的 Cancel 属性设置为 true。"(MSDN)
e.Cancel = true;
窗口完全透明时(Opacity <= 0)时才真正去关闭窗口
if (Opacity - d <= 0.0)
{
Opacity = 0.0;
fadeTimer.Stop();
this.Close();
}
{
Opacity = 0.0;
fadeTimer.Stop();
this.Close();
}
还有一个问题是主窗口
IV在Form_Load中先把自已不可见(this.Visible = false;),然后打开登陆窗口,当我关闭登陆窗口时(按"Cancel"或"X"),主窗口会闪一下,WHY?
同样查看代码
Application.Exit();
还是找不到问题所在,然后我试着在Exit()之前加了
this.Close();
最后说一个自己在昨天犯的两个错误:
1.net中的"DateTime.MinValue值等效于 0001 年 1 月 1 日 00:00:00.0000000。","在MS SQL Server中,使用 datetime 数据类型存储从 1753 年 1 月 1 日至 9999 年 12 月 31 日的日期(每个数值要求 8 个字节的存储空间)。"
在程序调试时为了方便,我直接使用DateTime.MinValue作为存储过程参数进行测试,结果可以想像,跟踪了好久才找到了问题~~
2.程序在异步操作时吃掉了异常.