2

Windowボタンをクリックしてコード内のGtk# を閉じようとしています。つまり、Xボタンはタイトル バーのボタンと同じ効果を持つ必要があります。

ただし、ウィンドウは閉じますが、タイトル バーのボタンDeleteEventをクリックするのではなく、自分のボタンをクリックしても は起動しません。X

これは最小限のサンプル コードです。

    using System;

    using Gtk;

    namespace GtkSharpTest
    {
        class Program
        {
            [STAThread]
            public static void Main(string[] args)
            {
                Application.Init();

                using (Window win = new Window("Test")) {
                    win.SetSizeRequest(300, 200);
                    win.Hidden += delegate(object sender, EventArgs e) {
                        Application.Quit();
                    };
                    win.DeleteEvent += delegate(object o, DeleteEventArgs e) {
                        using (MessageDialog dlg = new MessageDialog(win,
                                                                     DialogFlags.Modal,
                                                                     MessageType.Question,
                                                                     ButtonsType.YesNo,
                                                                     "Really close?")) {
                            ResponseType result = (ResponseType)dlg.Run();
                            dlg.Destroy();
                            if (result == ResponseType.No) {
                                e.RetVal = true;
                            }
                        }
                    };

                    Button bClose = Button.NewWithLabel("Close");
                    bClose.Clicked += delegate(object sender, EventArgs e) {
                        // ???
                    };
                    win.Add(bClose);

                    win.ShowAll();
                    Application.Run();
                }
            }
        }
    }

私が探している行は でマークされてい// ???ます。

私はそこでさまざまな呼び出しを試みました:

  • win.Hide();
  • win.HideAll();
  • win.Destroy();

Hideとの両方が、このフォーラムで Gtk ウィンドウを閉じるためDestroyに提案されました。この SO 投稿で選択された回答も示唆しており、そのメソッドを呼び出すときにイベントが発生するとさえ主張しています。ただし、その主張を再現することはできません。前述のすべてのメソッドはウィンドウを非表示にするだけですが、タイトルバーボタンでウィンドウを閉じた場合にのみ発生します。DestroydeleteDeleteEventX

言い換えれば、Windows フォーム/WPFClose()メソッドに相当する Gtk# を探していると言えます。これらを呼び出すと、Xタイトル バー ボタンのクリックが正確にシミュレートされます。それぞれのClosingイベントが発生し、フォーム/ウィンドウが閉じられないようにする可能性がまだあるからです。

4

1 に答える 1

2

おっしゃるとおり、delete イベントは、ウィンドウ マネージャーがウィンドウを閉じようとしたとき (つまり、ユーザーが [X] ボタンをクリックしたとき) にのみ発生します。

Destroyウィンドウを閉じるために使用できます。100% 確実ではありませんが、これがDestroyEvent.

ただし、X ボタンのクリックを正確にシミュレートしたい場合は、DeleteEventwithを送信する必要がありますwindow.Event()

于 2013-01-14T12:56:08.107 に答える