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