TextBox.text 仅在 Messagebox 后工作
TextBox.text only working followed by a Messagebox
我只想用这个简单的代码计算当前鼠标位置的 X 和 Y 值
while (true)
{
textBox1.Text = Cursor.Position.X.ToString();
//MessageBox.Show(""+Cursor.Position);
Thread.Sleep(150);
}
但它似乎只有在取消注释 MessageBox 时才有效,否则它什么也不写。
如果我用 Panel.Handle 初始化 Cursor,它不会显示 .position 成员;
你的问题很有意思。当您使用无限循环时,您的表单永远不会更新(并且您的文本框也是如此)。但是,如果您添加消息框,如果显示消息框,则表单似乎已更新。所以你所要做的就是将无限循环放入异步上下文中:
Task.Run(async () => await Task.Run(() =>
{
while (true)
{
textBox1.Invoke(new Action(() => textBox1.Text = Cursor.Position.X.ToString()));
Thread.Sleep(150);
}
}));
您可以通过使用计时器实现相同的目的:
public Form1()
{
InitializeComponent();
var timer1 = new Timer
{
Enabled = true,
Interval = 150
};
timer1.Tick += timer1_Tick;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
textBox1.Text = Cursor.Position.X.ToString();
}
您通常不应在表单应用程序的主线程上使用无限循环,否则您的 UI 会冻结。实际上你可能会注意到我使用了 textBox1.Invoke
- 这是因为你无法访问另一个线程上的 UI 元素而不是它们创建的线程。
解决这个问题的更优雅的方法是处理 MouseMove
事件:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
textBox1.Text = $"Mouse location: {e.Location.X}, {e.Location.Y}";
}
我还更改了位置的显示方式(我使用了 内插字符串 ),因为我认为这样更漂亮。
有关异步编程的更多信息,请查看:https://msdn.microsoft.com/de-de/library/mt674882.aspx
我只想用这个简单的代码计算当前鼠标位置的 X 和 Y 值
while (true)
{
textBox1.Text = Cursor.Position.X.ToString();
//MessageBox.Show(""+Cursor.Position);
Thread.Sleep(150);
}
但它似乎只有在取消注释 MessageBox 时才有效,否则它什么也不写。
如果我用 Panel.Handle 初始化 Cursor,它不会显示 .position 成员;
你的问题很有意思。当您使用无限循环时,您的表单永远不会更新(并且您的文本框也是如此)。但是,如果您添加消息框,如果显示消息框,则表单似乎已更新。所以你所要做的就是将无限循环放入异步上下文中:
Task.Run(async () => await Task.Run(() =>
{
while (true)
{
textBox1.Invoke(new Action(() => textBox1.Text = Cursor.Position.X.ToString()));
Thread.Sleep(150);
}
}));
您可以通过使用计时器实现相同的目的:
public Form1()
{
InitializeComponent();
var timer1 = new Timer
{
Enabled = true,
Interval = 150
};
timer1.Tick += timer1_Tick;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
textBox1.Text = Cursor.Position.X.ToString();
}
您通常不应在表单应用程序的主线程上使用无限循环,否则您的 UI 会冻结。实际上你可能会注意到我使用了 textBox1.Invoke
- 这是因为你无法访问另一个线程上的 UI 元素而不是它们创建的线程。
解决这个问题的更优雅的方法是处理 MouseMove
事件:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
textBox1.Text = $"Mouse location: {e.Location.X}, {e.Location.Y}";
}
我还更改了位置的显示方式(我使用了 内插字符串 ),因为我认为这样更漂亮。
有关异步编程的更多信息,请查看:https://msdn.microsoft.com/de-de/library/mt674882.aspx