TextBox.text仅工作,后跟Messagebox

时间:2017-04-21 22:45:26

标签: c# string winforms textbox messagebox

我想做的就是用这个简单的代码评估当前鼠标位置的X和Y值

 while (true)
            {
                textBox1.Text = Cursor.Position.X.ToString();
                //MessageBox.Show(""+Cursor.Position);
                Thread.Sleep(150);
            }

但它似乎只在取消注释MessageBox时起作用,否则它只会写入任何内容。

如果我使用Panel.Handle初始化Cursor,它不会显示.position成员;

1 个答案:

答案 0 :(得分:2)

你的问题非常有趣。当您使用无限循环时,您的表单永远不会更新(也可能是您的文本框)。但是如果你添加了messageBox,如果显示了messageBox,似乎表单就更新了。因此,您所要做的就是将无限循环置于异步上下文中:

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