public partial class Form4 : Form
{
int x, y = 10;
Graphics g;
public Form4()
{
InitializeComponent();
}
private void Form4_Load(object sender, EventArgs e)
{
g = this.CreateGraphics();
System.Threading.Thread th = new System.Threading.Thread(threadmethod);
th.Start();
}
void threadmethod()
{
Timer t = new Timer();
t.Enabled = true;
t.Interval = 100;
t.Tick += T_Tick;
}
private void T_Tick(object sender, EventArgs e)
{
g.DrawRectangle(new Pen(Brushes.Blue), new Rectangle(x++, y++, 20, 20));
}
}
在没有线程运行此代码时动画一个矩形。但矩形不是动画或在此代码中绘制的。请让我知道我应该做出的改变
答案 0 :(得分:0)
想想它就像你的线程不知道UI线程一样,你需要调用你的绘图方法到UI线程。类似的东西:
App.Current.Dispatcher.Invoke(() => { g.DrawRectangle(new Pen(Brushes.Blue),
new Rectangle(x++, y++, 20, 20)); });
答案 1 :(得分:0)
您使用的是错误的计时器。使System.Windows.Forms.Timer在UI线程上运行。
此Windows计时器专为使用UI线程执行处理的单线程环境而设计。
未绘制矩形,因为永远不会触发Tick
事件!
解决方案:改为使用在后台运行的计时器:
System.Timers.Timer是一个可能的傻瓜。将我们的代码简单地改为:
void threadmethod()
{
System.Timers.Timer t = new System.Timers.Timer();
t.Enabled = true;
t.Interval = 100;
t.Elapsed += T_Tick;
t.AutoReset = true;
}
其余部分可保持不变,您可以看到蓝色矩形在GUI表面上蔓延