Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TextBox.text-only-working后跟Messagebox_C#_String_Winforms_Textbox_Messagebox - Fatal编程技术网

C# TextBox.text-only-working后跟Messagebox

C# TextBox.text-only-working后跟Messagebox,c#,string,winforms,textbox,messagebox,C#,String,Winforms,Textbox,Messagebox,我只想用这个简单的代码计算当前鼠标位置的X和Y值 while (true) { textBox1.Text = Cursor.Position.X.ToString(); //MessageBox.Show(""+Cursor.Position); Thread.Sleep(150); } 但它似乎只有在MessageBox未注释时才起作用,否则它什

我只想用这个简单的代码计算当前鼠标位置的X和Y值

 while (true)
            {
                textBox1.Text = Cursor.Position.X.ToString();
                //MessageBox.Show(""+Cursor.Position);
                Thread.Sleep(150);
            }
但它似乎只有在MessageBox未注释时才起作用,否则它什么也不写


如果我使用面板.Handle初始化游标,它不会显示.position成员

你的问题很有趣。由于您使用的是无止境的循环,因此您的表单永远不会被更新(或者是您的文本框)。但是如果添加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元素的线程之外的其他线程上访问UI元素

但是,解决此问题的更优雅的方法是处理
MouseMove
事件:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    textBox1.Text = $"Mouse location: {e.Location.X}, {e.Location.Y}";
}
我还改变了位置的显示方式(我使用了一个插值字符串),因为我认为这更漂亮


有关异步编程的更多信息,请查看以下内容:

这就是您的整个程序?如果显示消息框,文本框1是否会更新?您是否已尝试在睡眠行上添加断点并检查光标位置的值?这是按钮单击代码。是,如果显示消息框,则更新文本框1。已经尝试过,游标。Position读取正确的值。问题是将其写入textbox。您只需订阅窗体或面板上的MouseMove事件,然后从那里更新textbox。。。或者一个计时器。但我不认为这是比第二个更好的解决方案,所以我认为在这方面不值得一提。我没有说更好的。只是添加到您的列表中。如果鼠标移动到控件上,窗体的MouseMove事件将不会触发。