我正在用C#和gtk#构建一个GUI应用程序。我最近遇到了一个问题,正在寻找这个问题的最佳解决方案:
我有一个模态窗口,弹出供用户输入数字。这个窗口是一个从我的主窗口访问的单独窗口,它的设置如下:
public class MainWindow()
{
public NumberEntry numEntry;
每当我需要来自用户的数字输入时,我在NumberEntry的公共Window属性上调用ShowAll(),如:
numEntry.win.ShowAll();
所有这一切都很好。之后,为了获得他们输入的价值,我打电话给:
int entered = numEntry.valueEntered;
问题显然是代码在ShowAll()行完成后立即继续执行,而numEntry.valueEntered始终为0.我想做的(并且一直在尝试做)是暂停main线程,并在第二个线程中打开数字输入窗口,并在完成后连接回主线程。当我尝试打开数字输入窗口时,暂停主线程似乎会阻止GUI更改使程序冻结。如果可能的话,我也想避免使用回调方法,看看这会在一段时间后变得相当复杂。有什么建议?谢谢!
答案 0 :(得分:1)
似乎当GTK窗口关闭时,它的所有子控件都被清除。因此,要从自定义对话框窗口获取结果,您可以执行以下操作(我不是gtk guru,但它适用于我):
<强> 1。用你的控件创建一个新的对话窗口(我使用了Xamarin工作室)。添加结果属性,确定和取消处理程序并覆盖OnDeleteEvent方法:
public partial class MyDialog : Gtk.Dialog
{
public string Results {
get;
private set;
}
public MyDialog ()
{
this.Build ();
}
protected override bool OnDeleteEvent (Gdk.Event evnt)
{
Results = entry2.Text; // if user pressed on X button..
return base.OnDeleteEvent (evnt);
}
protected void OnButtonOkClicked (object sender, EventArgs e)
{
Results = entry2.Text;
Destroy ();
}
protected void OnButtonCancelClicked (object sender, EventArgs e)
{
Results = string.Empty;
Destroy ();
}
}
<强> 2。在主窗口中创建一个对话框对象,并将其事件处理程序附加到其Destroyed事件:
protected void OnButtonClicked (object sender, EventArgs e)
{
var dialog = new MyDialog ();
dialog.Destroyed += HandleClose;
}
第3。在对话框关闭时获取结果:
void HandleClose (object sender, EventArgs e)
{
var dialog = sender as MyDialog;
var textResult = dialog.Results;
}
如果你想要,你也可以指定一个对话结果属性和etс。