问题场景:Winform下常常通过订阅窗体或者用户控件的Load事件来加载各种需要一次性加载的数据(业务数据初始化),但是当加载的数据量加多或者较多时,不免会对窗体的加载显示产生影响,从而影响用户的体验。
解决思路一: 通过显示Waiting画面,这种方式是通过转移用户的注意力来达到一定程度上的用户体验的改善。
解决思路二: 为加快Winform窗体或者用户控件的加载,对于Form,我们还可以通过订阅OnShown事件,在窗体Load之后进行业务数据的初始化;但是用户控件(UserControl)本身没有提供OnShown事件,那如何实现数据的lazy loading呢?
在对UserControl现有的事件摸索后,并没发现能够达到这一目的的事件可以订阅,后经过尝试发现可以通过借助Windows的消息机制来实现用户控件的业务数据lazy loading,现记录下来以备查忘。
Step1. 导入windows API函数
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
Step2. 定义用户消息代码
public const int WM_USER = 0x0400;
public const int WM_LOADMYBIZDATA = WM_USER + 101;(101这个代码随你喜欢定义,只要不跟现有已定义的重复即可)
Ste3. 处理windows消息(在你需要加载业务数据的UserControl类里面覆盖WndProc函数)
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_LOADMYBIZDATA:
//TO DO YOUR WORK
break;
default:
base.WndProc(ref m);
break;
}
}
Step4. 用户控件使用者加载完成用户控件后,发送windows消息
private void btnLazyLoading_Click(object sender, EventArgs e)
{
MyUserControl userControl = new MyUserControl();
try
{
//add your control to a tab or some form,then show them
}
fianlly
{
//after control and form initialized,then tell my control to load my biz data
SendMessage(userControl.Handle, WM_LOADMYBIZDATA, 0,0);
}
}
TIP: 因为记性不好,所以记录下来,希望对需要用到的博友有一定帮助,也便于自己查忘。也欢迎博友提供更多的实现Winform下lazy loading的思路。