2013-10-31 277 views
0

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

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

public class MainWindow() 
    { 
     public NumberEntry numEntry; 

每当我需要从用户输入一个数字,我称之为勾住ShowAll()像NumberEntry的公共窗口属性:

numEntry.win.ShowAll(); 

而这一切工作正常。之后,得到他们所输入的值,我称之为:

int entered = numEntry.valueEntered; 

问题显然是代码继续勾住ShowAll后立即执行()行结束,numEntry.valueEntered总是0,我想什么要做的(并且一直在试图做的)是暂停主线程,并在第二线程中打开数字输入窗口,并在完成时返回主线程。当我尝试打开数字输入窗口时,暂停主线程似乎可以防止GUI更改,从而使程序冻结。如果可能的话,我也想避免回调方法,看看过了一段时间后会如何变得相当复杂。有什么建议?谢谢!

+0

ShowDialog并返回值作为ModalResult? –

+0

嗯...... ShowDialog不会返回一个值:( –

+0

该窗口比标准对话框更复杂(它就像一个带有16个按钮的计算器)您可以创建自定义对话框还是仅限于标准取消,确定,等? –

回答

1

似乎GTK窗口关闭时,其所有子控件都被清除。所以要从自定义对话窗口得到结果,你可以做以下的事情(我不是gtk大师,但它的作品):

1.用你的控件(我用Xamarin studio)创建一个新的对话窗口。添加结果属性,确定和取消处理程序和覆盖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.在主窗口中创建一个对话框对象,并重视其销毁的事件事件处理程序:

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。

+0

是的,我将自己用类似的方式回答它,你非常接近我最终做的,谢谢。 –