0

在我的主窗口中,我创建了一个线程,它正在执行一个 while() 循环。主要任务有两部分:从套接字接收数据并在 GUI 上显示。

现在我需要同时在另一个窗口上显示数据。所以我首先创建它,如下所示。

ShowForm showForm = new ShowForm();

public MainWindow()
{
    InitializeComponent();

    mainThread();

    showForm.Show();
}

并将数据发送到 showForm 如下所示:(coordinateValue在主窗口中生成)

showForm.setter(coordinateValue);

而在 ShowForm.Designer.cs 的代码中:

int xValue;

public void setter(int val)
{
    xValue = val;
}

现在我不知道如何在showForm 上重复显示xValue(需要及时更新),例如textBox 或将xValue 转换为坐标并显示在pictureBox 上。同时,主窗口的 while() 循环应该继续接收数据并将其显示在其 GUI 上。

有人可以帮忙吗?谢谢!

4

3 回答 3

0

您可以在 MainWindow 中创建一个事件。并在您的 ShowForm 中订阅该事件。

每当您的数据更改时,MainWindow 都应该引发该事件。请记住,如果您在另一个线程中获取数据,则不能将其传递给在主线程上运行的 GUI。在这种情况下,您将需要使用 Dispatcher。

于 2013-11-10T14:47:36.917 回答
0

您可能想使用Timer该类。它可以以均匀的间隔执行方法(Tick 事件)。

于 2013-11-10T14:57:55.930 回答
0

我编写了一个示例,解释了如何使用事件将数据从一种形式传输到另一种形式。如果它在另一个线程中运行,您应该在控件中使用 Invoke 方法来防止错误。

public partial class AdditionalForm : Form
{
    private Label l_dataToShow;

    public Label DataToShow { get { return l_dataToShow; } }

    public AdditionalForm()
    {
        InitializeComponent();

        SuspendLayout();
        l_dataToShow = new Label();
        l_dataToShow.AutoSize = true;
        l_dataToShow.Location = new Point(12, 9);
        l_dataToShow.Size = new Size(40, 13);
        l_dataToShow.TabIndex = 0;
        l_dataToShow.Text = "Data will be shown here";
        Controls.Add(l_dataToShow);
        ResumeLayout();
    }
}

public partial class MainForm : Form
{
    private AdditionalForm af;
    public MainForm()
    {
        InitializeComponent();

        SuspendLayout();
        txtbx_data = new TextBox();
        txtbx_data.Location = new System.Drawing.Point(12, 12);
        txtbx_data.Name = "txtbx_data";
        txtbx_data.Size = new System.Drawing.Size(100, 20);
        txtbx_data.TabIndex = 0;
        Controls.Add(txtbx_data);
        ResumeLayout();

        txtbx_data.TextChanged += new EventHandler(txtbx_data_TextChanged);
        af = new AdditionalForm();
        af.Show();
    }
    /// <summary>
    /// The data that contains textbox will be transfered to another form to a label when you will change text in a textbox. You must make here your own event that will transfer data.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void txtbx_data_TextChanged(object sender, EventArgs e)
    {
        af.DataToShow.Text = txtbx_data.Text;
    }
}
于 2013-11-10T16:02:29.157 回答