我在某些问题上需要帮助。在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();
}
}
答案 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();
}
}
它仍然非常糟糕,但更清洁和可维护。更重要的是,它实际上会起作用。