0

C# と gtk# で GUI アプリケーションを構築しています。最近問題が発生し、この問題に対する最善の解決策を探していました。

ユーザーが数値を入力するためにポップアップするモーダルウィンドウがあります。このウィンドウは、メイン ウィンドウからアクセスする別のウィンドウであり、次のように設定されています。

    public class MainWindow()
    {
        public NumberEntry numEntry;

ユーザーからの数値入力が必要なときはいつでも、次のように NumberEntry の public Window プロパティで ShowAll() を呼び出します。

    numEntry.win.ShowAll();

そして、これはすべて正常に機能します。その後、入力した値を取得するために、次のように呼び出します。

    int entered = numEntry.valueEntered;

問題は明らかに、ShowAll() 行が終了した直後にコードが実行され続け、numEntry.valueEntered が常に 0 であることです。 2 番目のスレッドで数値入力ウィンドウを開き、これが完了したらメイン スレッドに戻ります。メイン スレッドを一時停止すると、数値入力ウィンドウを開こうとしたときに GUI の変更によってプログラムがフリーズするのを防ぐようです。また、しばらくするとかなり複雑になるので、可能な限りコールバック メソッドを避けたいと思います。何かアドバイス?ありがとう!

4

1 に答える 1

1

GTK ウィンドウを閉じると、すべての子コントロールがクリアされるようです。したがって、カスタム ダイアログ ウィンドウから結果を取得するには、次のようにします (私は gtk の達人ではありませんが、うまくいきます)。

1. コントロールを使用して新しいダイアログ ウィンドウを作成します (私は Xamarin Studio を使用しました)。結果プロパティ、OK およびキャンセル ハンドラーを追加し、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 に答える