gtk #stight for window

时间:2013-10-31 18:39:13

标签: c# multithreading mono gtk#

我正在用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更改使程序冻结。如果可能的话,我也想避免使用回调方法,看看这会在一段时间后变得相当复杂。有什么建议?谢谢!

1 个答案:

答案 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с。