1

GTKでC#を使用して、ボタンを含むメインウィンドウを備えたアプリケーションを作成しています。ボタンの1つが押されると、イベントハンドラー関数が呼び出され、ユーザーが入力するフォームを含む新しいウィンドウが開きます。これまでのところ、すべて正常に機能しています。

私が問題を抱えているのは、このイベントハンドラー関数でこのウィンドウを開き、入力されて閉じられるのを待ってから、2番目のウィンドウを開き、入力されて閉じられるのを待ってから処理する必要があることです。このすべてのキャプチャされたデータ。私が意味することを示すために簡単な例を作成しました(以下の例では、2つのコンボボックスで1つのウィンドウを開く方が理にかなっていると理解していますが、これは単なる例だからです!)

using System;
using Gtk;

namespace WaitingTest
{
    public class MainClass
    {       
        static void Main (string[] args)
        {
            Application.Init ();
            MenuWindow myWindow = new MenuWindow();

            Application.Run();
        }
    }

    public class MenuWindow
    {
        static string favDrink = "Water";
        static string favCheese = "Chedder";
        static Label output = new Label();

        public MenuWindow()
        {
            Application.Init ();

            Window test = new Window ("Main Window");

            VBox vb = new VBox();
            Button getData = new Button("Get Data");
            Button quitApp = new Button("Quit");

            getData.Clicked += OnGetData;
            quitApp.Clicked += OnExit;

            vb.PackStart(getData, false, false, 1);
            vb.PackStart(quitApp, false, false, 1);
            vb.PackStart(output, false, false, 1);

            test.Add(vb);
            test.ShowAll();

            Application.Run();
        }

        static void OnGetData(object sender, EventArgs args)
        {
            // Open up Window to select drink
            WindowOne w1 = new WindowOne();

            // Open up Window to select cheese
            WindowTwo w2 = new WindowTwo();

            // Display results in label
            output.Text="Drink: "+favDrink+"\nCheese: "+favCheese;
        }

        public static void SetFavDrink(string d)
        {
            favDrink = d;
            Console.WriteLine(favDrink);
        }

        public static void SetFavCheese(string c)
        {
            favCheese = c;
            Console.WriteLine(favCheese);
        }

        static void OnExit(object sender, EventArgs args)
        {
            Application.Quit();
        }

        protected void OnDeleteEvent(object sender, DeleteEventArgs a)
        {
            Application.Quit ();
            a.RetVal = true;
        }   
    }

    class WindowOne
    {
        ComboBox drink = ComboBox.NewText();
        static string choice;

        public WindowOne ()
        {
            Window w1 = new Window ("Window One");

            VBox vb = new VBox();

            Button sendDrink = new Button("Send Drink");

            sendDrink.Clicked += OnSend;
            drink.Changed += new EventHandler(onDrinkChanged);

            drink.AppendText("Beer");
            drink.AppendText("Red Wine");
            drink.AppendText("White Wine");
            drink.AppendText("Whiskey");

            vb.PackStart(drink, false, false, 1);
            vb.PackStart(sendDrink, false, false, 1);

            w1.Add(vb);
            w1.ShowAll();
        }

        void OnSend(object sender, EventArgs args)
        {
            WaitingTest.MenuWindow.SetFavDrink(choice);
        }

        void onDrinkChanged(object o, EventArgs args)
        {
            ComboBox combo = o as ComboBox;
            if (o == null)
                return;

            TreeIter iter;

            if (combo.GetActiveIter (out iter))
                choice = ((string) combo.Model.GetValue (iter, 0));
        }
    }

    class WindowTwo
    {
        ComboBox cheese = ComboBox.NewText();
        static string choice;

        public WindowTwo ()
        {
            Window w2 = new Window ("Window Two");

            VBox vb = new VBox();

            Button sendCheese = new Button("Send Cheese");

            sendCheese.Clicked += OnSend;
            cheese.Changed += new EventHandler(onCheeseChanged);

            cheese.AppendText("Gorgonzola");
            cheese.AppendText("Edam");
            cheese.AppendText("Brie");
            cheese.AppendText("Feta");

            vb.PackStart(cheese, false, false, 1);
            vb.PackStart(sendCheese, false, false, 1);

            w2.Add(vb);
            w2.ShowAll();
        }

        void OnSend(object sender, EventArgs args)
        {
            WaitingTest.MenuWindow.SetFavCheese(choice);
        }

        void onCheeseChanged(object o, EventArgs args)
        {
            ComboBox combo = o as ComboBox;
            if (o == null)
                return;

            TreeIter iter;

            if (combo.GetActiveIter (out iter))
                choice = ((string) combo.Model.GetValue (iter, 0));
        }
    }
}

上記で何が起こるかというと、両方のウィンドウが同時に開き、ラベルは2つのウィンドウで選択されるデータではなく、デフォルトのデータですぐに更新されます。だから私は2つの質問があります:

1)WindowOneを開き、データが取得されるまで待ってからWindowTwoを開き、データが取得されるまで待ってからラベルを更新するにはどうすればよいですか?

2)「OnSend」関数を編集して、SetFavDrink / SetFaveCheese関数を呼び出した後にウィンドウを閉じるにはどうすればよいですか?

誰かが私をここで正しい方向に向けてくれませんか?私はこのプログラミングラークに不慣れなので、優しくしてください!

4

1 に答える 1

0

I think this is what you are going for (note this could probably be cleaned up...):

using System;
using Gtk;


    namespace WaitingTest
    {
        public class MainClass
        {       
            static void Main (string[] args)
            {
                Application.Init ();
                new MenuWindow();
                Application.Run();
            }
        }
        public class MenuWindow
        {
            public static string favDrink = "Water";
            public static string favCheese = "Chedder";
            public static Label output = new Label();

            public MenuWindow()
            {
                Application.Init ();

                Window test = new Window ("Main Window");

                VBox vb = new VBox();
                Button getData = new Button("Get Data");
                Button quitApp = new Button("Quit");

                getData.Clicked += OnGetData;
                quitApp.Clicked += OnExit;

                vb.PackStart(getData, false, false, 1);
                vb.PackStart(quitApp, false, false, 1);
                vb.PackStart(output, false, false, 1);

                test.Add(vb);
                test.ShowAll();

                Application.Run();
            }

            static void OnGetData(object sender, EventArgs args)
            {
                // Open up Window to select drink
                new WindowOne();
            }

            public static void SetFavDrink(string d)
            {
                MenuWindow.favDrink = d;
                Console.WriteLine(favDrink);
            }

            public static void SetFavCheese(string c)
            {
                MenuWindow.favCheese = c;
                Console.WriteLine(favCheese);
            }

            static void OnExit(object sender, EventArgs args)
            {
                Application.Quit();
            }

            protected void OnDeleteEvent(object sender, DeleteEventArgs a)
            {
                Application.Quit ();
                a.RetVal = true;
            }   
        }

        class WindowOne
        {
            ComboBox drink = ComboBox.NewText();
            static string choice;
            static Window w1 = new Window ("Window One");
            public WindowOne ()
            {


                VBox vb = new VBox();

                Button sendDrink = new Button("Send Drink");

                sendDrink.Clicked += OnSend;
                drink.Changed += new EventHandler(onDrinkChanged);

                drink.AppendText("Beer");
                drink.AppendText("Red Wine");
                drink.AppendText("White Wine");
                drink.AppendText("Whiskey");

                vb.PackStart(drink, false, false, 1);
                vb.PackStart(sendDrink, false, false, 1);

                w1.Add(vb);
                w1.ShowAll();
            }

            void OnSend(object sender, EventArgs args)
            {
                WaitingTest.MenuWindow.SetFavDrink(choice);
                WindowOne.w1.Destroy();
                new WindowTwo();

            }

            void onDrinkChanged(object o, EventArgs args)
            {
                ComboBox combo = o as ComboBox;
                if (o == null)
                    return;

                TreeIter iter;

                if (combo.GetActiveIter (out iter))
                    choice = ((string) combo.Model.GetValue (iter, 0));
            }
        }

        class WindowTwo
        {
            ComboBox cheese = ComboBox.NewText();
            static string choice;
            static Window w2 = new Window ("Window Two");
            public WindowTwo ()
            {


                VBox vb = new VBox();

                Button sendCheese = new Button("Send Cheese");

                sendCheese.Clicked += OnSend;
                cheese.Changed += new EventHandler(onCheeseChanged);

                cheese.AppendText("Gorgonzola");
                cheese.AppendText("Edam");
                cheese.AppendText("Brie");
                cheese.AppendText("Feta");

                vb.PackStart(cheese, false, false, 1);
                vb.PackStart(sendCheese, false, false, 1);

                w2.Add(vb);
                w2.ShowAll();
            }

            void OnSend(object sender, EventArgs args)
            {
                WaitingTest.MenuWindow.SetFavCheese(choice);
                WindowTwo.w2.Destroy();
                MenuWindow.output.Text="Drink: "+MenuWindow.favDrink+"\nCheese: "+MenuWindow.favCheese;
            }

            void onCheeseChanged(object o, EventArgs args)
            {
                ComboBox combo = o as ComboBox;
                if (o == null)
                    return;

                TreeIter iter;

                if (combo.GetActiveIter (out iter))
                    choice = ((string) combo.Model.GetValue (iter, 0));
            }
        }
    }

`
于 2013-03-20T16:25:13.697 に答える