我的visual studio项目设置如下: 在表单面板上,我添加用户控件(UC)代码:
表格:
panel.Controls.Add(UC.Instance);
UC.Instance.Location = new Point(-(panel.Size.Width), 0);
UC.Instance.BringToFront();
roll_in();
用户控件:中的
private static UC _instance;
public static UC Instance
{
get
{
if (_instance == null)
_instance = new UC();
return _instance;
}
}
当我按表单上的按钮时,用户控件会添加到表单面板中,并使用以下代码滑动用户控制到其位置:
private void roll_in()
{
while (UC.Instance.Location.X < panel.Location.X)
{
UC.Instance.Location = new Point((UC.Instance.Location.X + 2));
UC.Instance.Refresh();
if (UC.Instance.Location.X > -10)
System.Threading.Thread.Sleep(10);
}
}
当我使用roll_in()
时,所有其他函数和表单都在等待此过程完成。
有没有办法可以在另一个帖子上滑动User control
?
我尝试通过创建另一个线程来调用roll_in()
,但它说控件是在另一个线程上创建的。
有人可以帮助我指导我走正确的道路吗? 我怎样才能做动画&#34;不影响其他控件?
谢谢你的帮助
答案 0 :(得分:0)
在我看来,你通过调用thread.sleep来阻止UI线程。你通常不想出于任何原因这样做。创建了异步任务来处理这样的UI问题。试试这段代码。
<br>
这可以防止在睡眠周期中阻塞。
答案 1 :(得分:0)
您还可以在循环中使用Application.DoEvents()
定期处理winforms事件队列:
private void roll_in()
{
while (UC.Instance.Location.X < panel.Location.X)
{
UC.Instance.Location = new Point((UC.Instance.Location.X + 2));
UC.Instance.Refresh();
Application.DoEvents();
}
}
Application.DoEvents()
上的信息:https://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents(v=vs.110).aspx