0

我正在用 C# 和 gtk# 构建一个 GUI 应用程序。我最近遇到了一个问题,正在寻找解决这个问题的最佳方法:

我有一个弹出的模式窗口供用户输入数字。这个窗口是从我的主窗口访问的一个单独的窗口,它的设置如下:

    public class MainWindow()
    {
        public NumberEntry numEntry;

每当我需要用户输入数字时,我都会在 NumberEntry 的公共 Window 属性上调用 ShowAll(),例如:

    numEntry.win.ShowAll();

所有这一切都很好。之后,为了获得他们输入的值,我调用:

    int entered = numEntry.valueEntered;

问题显然是代码在 ShowAll() 行完成后立即继续执行,并且 numEntry.valueEntered 始终为 0。我想做的(并且一直在尝试做的)是暂停主线程,并且在第二个线程中打开数字输入窗口,并在完成后加入主线程。当我尝试打开数字输入窗口时,暂停主线程似乎可以防止 GUI 更改导致程序冻结。如果可能的话,我还想避免使用回调方法,因为这会在一段时间后变得相当复杂。有什么建议吗?谢谢!

4

1 回答 1

1

好像当 GTK 窗口关闭时,它的所有子控件都被清除了。因此,要从自定义对话框窗口中获取结果,您可以执行以下操作(我不是 gtk 大师,但它对我有用):

1. 使用您的控件创建一个新的对话框窗口(我使用了 Xamarin studio)。添加结果属性、OK 和 Cancel 处理程序并覆盖 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;
}

如果您愿意,您还可以指定对话结果属性等。

于 2013-10-31T22:57:51.853 回答