2013-10-31 161 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

是的,我將自己用類似的方式回答它,你非常接近我最終做的,謝謝。 –