自动打开新窗口没有计时器WPF

时间:2014-10-17 23:11:41

标签: c# wpf timer

我在某些问题上需要帮助。在MainWindow WPF中我从设备读取状态,0是正常工作,1是其他状态。我想在status = 1时打开新窗口,当我得到0时关闭它。我尝试使用timer和showDialog。创建了新窗口,但在我关闭新窗口之前,MainWindow中的状态不会改变。任何消化如何没有计时器吗?也许是一些样本。

提前致谢。

MainWindow - 计时器刻度:

public void t1_Tick(Object Sender, EventArgs e)
{
    HttpWebRequest request7 = WebRequest.Create("http://localhost:8080/datasnap/rest/TAutomatServerMethods/uCard") as HttpWebRequest;

    using (HttpWebResponse response7 = request7.GetResponse() as HttpWebResponse)
    {

        StreamReader reader7 = new StreamReader(response7.GetResponseStream());

        string json7 = reader7.ReadToEnd();

        //  MessageBox.Show(json);

        JObject o7 = JObject.Parse(json7);
        int status_int = Convert.ToInt32(o7["result"][0]);

        if (status_int == 1)
        {
            uCard uc1 = new uCard();
            uc1.ShowDialog();
        }
}

Window1 - 关闭窗口

public void t1_Tick(Object Sender, EventArgs e)
{

    if (MainWindow.status_int == 0 )
    {
        this.Close();
    }
}  

1 个答案:

答案 0 :(得分:0)

首先,您需要创建一个在值更改时引发的事件:

public event Action<int> StatusChanged;

当它发生变化时提升它的属性:

//This is very close to a standard INotifyPropertyChanged
private int status_int = 0;
private int Status
{
    get { return status_int; }
    set
    {
       if (Status != value)
       {
           status_int = value;
           StatusChanged(value);
       }
    }
}

摆脱计时器中的状态int检查,只需设置变量:

Status = retrieved_status;

注册活动:

public MainWindow()
{
    StatusChanged += HandleStatusChange;
}

你的&#34; ShowDialog&#34;传递表单的实际实例

private void HandleStatusChange(int newValue)
{
    if (newValue == 1)
    {
       //Threaded so we don't hang the timer callback
       new Thread(() =>
       {
          uCard uc1 = new uCard(this);
          uc1.ShowDialog();
       }).Start();
    }
}

然后在你的弹出窗口中,你的构造函数将是:

public uCard(MainWindow window)
{
    window.StatusChanged += CheckForClose;
}

你可以摆脱那个计时器并拥有:

private void CheckForClose(int newValue)
{
    if (newValue == 0 )
    {
      this.Close();
    }
}

它仍然非常糟糕,但更清洁和可维护。更重要的是,它实际上会起作用。