Bagikan melalui


Menu di Xamarin.Mac

Artikel ini membahas cara bekerja dengan menu dalam aplikasi Xamarin.Mac. Ini menjelaskan pembuatan dan pemeliharaan menu dan item menu di Xcode dan Interface Builder dan bekerja dengannya secara terprogram.

Saat bekerja dengan C# dan .NET dalam aplikasi Xamarin.Mac, Anda memiliki akses ke menu Kakao yang sama dengan yang digunakan Objective-C pengembang dan Xcode. Karena Xamarin.Mac terintegrasi langsung dengan Xcode, Anda dapat menggunakan Penyusun Antarmuka Xcode untuk membuat dan memelihara bilah menu, menu, dan item menu Anda (atau secara opsional membuatnya langsung dalam kode C#).

Menu adalah bagian integral dari pengalaman pengguna aplikasi Mac dan umumnya muncul di berbagai bagian antarmuka pengguna:

  • Bilah menu aplikasi - Ini adalah menu utama yang muncul di bagian atas layar untuk setiap aplikasi Mac.
  • Menu kontekstual - Ini muncul saat pengguna mengklik kanan atau mengeklik kontrol item di jendela.
  • Bilah status - Ini adalah area di sisi paling kanan bilah menu aplikasi yang muncul di bagian atas layar (di sebelah kiri jam bilah menu) dan tumbuh di sebelah kiri saat item ditambahkan ke dalamnya.
  • Menu Dock - Menu untuk setiap aplikasi di dock yang muncul saat pengguna mengklik kanan atau mengeklik kontrol ikon aplikasi, atau ketika pengguna mengklik kiri ikon dan menahan tombol mouse ke bawah.
  • Tombol pop-up dan daftar tarik-turun - Tombol pop-up menampilkan item yang dipilih dan menyajikan daftar opsi untuk dipilih saat diklik oleh pengguna. Daftar tarik-turun adalah jenis tombol pop-up yang biasanya digunakan untuk memilih perintah khusus untuk konteks tugas saat ini. Keduanya dapat muncul di mana saja di jendela.

Menu contoh

Dalam artikel ini, kita akan membahas dasar-dasar bekerja dengan bilah menu Kakao, menu, dan item menu dalam aplikasi Xamarin.Mac. Sangat disarankan agar Anda bekerja melalui artikel Hello, Mac terlebih dahulu, khususnya bagian Pengenalan Xcode dan Penyusun Antarmuka dan Outlet dan Tindakan , karena mencakup konsep dan teknik utama yang akan kita gunakan dalam artikel ini.

Anda mungkin ingin melihat kelas / metode Exposing C# keObjective-Cbagian dari dokumen Xamarin.Mac Internals juga, ini menjelaskan Register atribut dan Export yang digunakan untuk menghubungkan kelas C# Anda ke Objective-C objek dan elemen UI.

Bilah menu aplikasi

Tidak seperti aplikasi yang berjalan di OS Windows di mana setiap jendela dapat memiliki bilah menu sendiri yang terpasang padanya, setiap aplikasi yang berjalan di macOS memiliki satu bilah menu yang berjalan di sepanjang bagian atas layar yang digunakan untuk setiap jendela dalam aplikasi tersebut:

Bilah menu

Item pada bilah menu ini diaktifkan atau dinonaktifkan berdasarkan konteks atau status aplikasi saat ini dan antarmuka penggunanya pada saat tertentu. Misalnya: jika pengguna memilih bidang teks, item pada menu Edit akan diaktifkan seperti Salin dan Potong.

Menurut Apple dan secara default, semua aplikasi macOS memiliki sekumpulan menu standar dan item menu yang muncul di bilah menu aplikasi:

  • Menu Apple - Menu ini menyediakan akses ke item luas sistem yang tersedia untuk pengguna setiap saat, terlepas dari aplikasi apa yang berjalan. Item ini tidak dapat dimodifikasi oleh pengembang.
  • Menu aplikasi - Menu ini menampilkan nama aplikasi dalam huruf tebal dan membantu pengguna mengidentifikasi aplikasi apa yang saat ini sedang berjalan. Ini berisi item yang berlaku untuk aplikasi secara keseluruhan dan bukan dokumen atau proses tertentu seperti keluar dari aplikasi.
  • Menu file - Item yang digunakan untuk membuat, membuka, atau menyimpan dokumen yang bekerja dengan aplikasi Anda. Jika aplikasi Anda tidak berbasis dokumen, menu ini dapat diganti namanya atau dihapus.
  • Menu Edit - Perintah penangguhan seperti Potong, Salin, dan Tempel yang digunakan untuk mengedit atau memodifikasi elemen di antarmuka pengguna aplikasi.
  • Menu format - Jika aplikasi berfungsi dengan teks, menu ini menyimpan perintah untuk menyesuaikan pemformatan teks tersebut.
  • Menu tampilan - Menahan perintah yang memengaruhi cara konten ditampilkan (dilihat) di antarmuka pengguna aplikasi.
  • Menu khusus aplikasi - Ini adalah menu apa pun yang khusus untuk aplikasi Anda (seperti menu marka buku untuk browser web). Mereka akan muncul di antara menu Tampilan dan Jendela pada bilah.
  • Menu jendela - Berisi perintah untuk bekerja dengan jendela di aplikasi Anda, serta daftar jendela yang terbuka saat ini.
  • Menu Bantuan - Jika aplikasi Anda menyediakan bantuan di layar, menu Bantuan harus menjadi menu paling kanan di bilah.

Untuk informasi selengkapnya tentang bilah menu aplikasi dan menu standar dan item menu, silakan lihat Pedoman Antarmuka Manusia Apple.

Bilah menu aplikasi default

Setiap kali Anda membuat proyek Xamarin.Mac baru, Anda secara otomatis mendapatkan bilah menu aplikasi default standar yang memiliki item khas yang biasanya dimiliki aplikasi macOS (seperti yang dibahas di bagian di atas). Bilah menu default aplikasi Anda didefinisikan dalam file Main.storyboard (bersama dengan UI aplikasi Anda lainnya) di bawah proyek di Solution Pad:

Pilih papan cerita utama

Klik dua kali file Main.storyboard untuk membukanya untuk pengeditan di Interface Builder Xcode dan Anda akan disajikan dengan antarmuka editor menu:

Mengedit UI di Xcode, memperlihatkan papan cerita Titik utama.

Dari sini kita dapat mengklik item seperti item menu Buka di menu File dan mengedit atau menyesuaikan propertinya di Pemeriksa Atribut:

Mengedit atribut menu

Kita akan masuk ke menambahkan, mengedit, dan menghapus menu dan item nanti di artikel ini. Untuk saat ini kita hanya ingin melihat menu dan item menu apa yang tersedia secara default dan bagaimana mereka telah secara otomatis diekspos ke kode melalui sekumpulan outlet dan tindakan yang telah ditentukan sebelumnya (untuk informasi lebih lanjut lihat dokumentasi Outlet dan Tindakan kami).

Misalnya, jika kita mengklik pemeriksa Koneksi ion untuk item menu Buka, kita dapat melihatnya secara otomatis terhubung ke openDocument: tindakan:

Menampilkan tindakan terlampir

Jika Anda memilih Responden Pertama dalam Hierarki Antarmuka dan menggulir ke bawah di pemeriksa Koneksi ion, dan Anda akan melihat definisi openDocument: tindakan yang dilampirkan item menu Buka (bersama dengan beberapa tindakan default lainnya untuk aplikasi yang dan tidak secara otomatis terhubung ke kontrol):

Menampilkan semua tindakan terlampir

Mengapa ini penting? Di bagian berikutnya akan melihat cara kerja tindakan yang ditentukan secara otomatis ini dengan elemen antarmuka pengguna Kakao lainnya untuk mengaktifkan dan menonaktifkan item menu secara otomatis, serta, menyediakan fungsionalitas bawaan untuk item.

Nantinya kita akan menggunakan tindakan bawaan ini untuk mengaktifkan dan menonaktifkan item dari kode dan menyediakan fungsionalitas kita sendiri saat dipilih.

Fungsionalitas menu bawaan

Jika Anda menjalankan aplikasi Xamarin.Mac yang baru dibuat sebelum menambahkan item atau kode UI apa pun, Anda akan melihat bahwa beberapa item secara otomatis dikabel dan diaktifkan untuk Anda (dengan fungsionalitas penuh secara otomatis bawaan), seperti item Keluar di menu Aplikasi :

Item menu yang diaktifkan

Sementara item menu lainnya, seperti Potong, Salin, dan Tempel tidak:

Item menu yang dinonaktifkan

Mari kita hentikan aplikasi dan klik dua kali file Main.storyboard di Solution Pad untuk membukanya untuk pengeditan di Penyusun Antarmuka Xcode. Selanjutnya, seret Tampilan Teks dari Pustaka ke pengontrol tampilan jendela di Editor Antarmuka:

Memilih Tampilan Teks dari Pustaka

Di Editor Batasan mari kita sematkan tampilan teks ke tepi jendela dan mengaturnya di mana ia tumbuh dan menyusut dengan jendela dengan mengklik keempat I-beam merah di bagian atas editor dan mengklik tombol Tambahkan 4 Batasan:

Mengedit kontraint

Simpan perubahan Anda ke desain antarmuka pengguna dan alihkan kembali Visual Studio untuk Mac untuk menyinkronkan perubahan dengan proyek Xamarin.Mac Anda. Sekarang mulai aplikasi, ketik beberapa teks ke dalam tampilan teks, pilih, dan buka menu Edit :

Item menu diaktifkan/dinonaktifkan secara otomatis

Perhatikan bagaimana item Potong, Salin, dan Tempel diaktifkan secara otomatis dan berfungsi penuh, semua tanpa menulis satu baris kode pun.

Apa yang terjadi di sini? Ingat tindakan bawaan yang muncul ke item menu default (seperti yang disajikan di atas), sebagian besar elemen antarmuka pengguna Kakao yang merupakan bagian dari macOS telah dibangun dalam kait ke tindakan tertentu (seperti copy:). Jadi, ketika ditambahkan ke jendela, aktif, dan dipilih, item menu atau item terkait yang dilampirkan ke tindakan tersebut diaktifkan secara otomatis. Jika pengguna memilih item menu tersebut, fungsionalitas yang disertakan dalam elemen UI dipanggil dan dijalankan, semuanya tanpa intervensi pengembang.

Mengaktifkan dan menonaktifkan menu dan item

Secara default, setiap kali peristiwa pengguna terjadi, NSMenu secara otomatis mengaktifkan dan menonaktifkan setiap menu dan item menu yang terlihat berdasarkan konteks aplikasi. Ada tiga cara untuk mengaktifkan/menonaktifkan item:

  • Pengaktifan menu otomatis - Item menu diaktifkan jika NSMenu dapat menemukan objek yang sesuai yang merespons tindakan yang dikabeli item. Misalnya, tampilan teks di atas yang memiliki kait bawaan ke copy: tindakan.
  • Tindakan kustom dan validasiMenuItem: - Untuk item menu apa pun yang terikat ke jendela atau melihat tindakan kustom pengontrol, Anda dapat menambahkan validateMenuItem: tindakan dan mengaktifkan atau menonaktifkan item menu secara manual.
  • Menu manual yang mengaktifkan - Anda mengatur Enabled properti masing-masing NSMenuItem secara manual untuk mengaktifkan atau menonaktifkan setiap item dalam menu satu per satu.

Untuk memilih sistem, atur AutoEnablesItems properti .NSMenu true otomatis (perilaku default) dan false manual.

Penting

Jika Anda memilih untuk menggunakan pengaktifan menu manual, tidak ada item menu, bahkan yang dikontrol oleh kelas AppKit seperti NSTextView, diperbarui secara otomatis. Anda akan bertanggung jawab untuk mengaktifkan dan menonaktifkan semua item dengan tangan dalam kode.

Menggunakan validateMenuItem

Seperti yang dinyatakan di atas, untuk item menu apa pun yang terikat ke Jendela atau Lihat Tindakan Kustom Pengontrol, Anda dapat menambahkan validateMenuItem: tindakan dan mengaktifkan atau menonaktifkan item menu secara manual.

Dalam contoh berikut, Tag properti akan digunakan untuk memutuskan jenis item menu yang akan diaktifkan/dinonaktifkan oleh validateMenuItem: tindakan berdasarkan status teks yang dipilih dalam NSTextView. Properti Tag telah diatur dalam Penyusun Antarmuka untuk setiap item menu:

Mengatur properti Tag

Dan kode berikut ditambahkan ke Pengontrol Tampilan:

[Action("validateMenuItem:")]
public bool ValidateMenuItem (NSMenuItem item) {

    // Take action based on the menu item type
    // (As specified in its Tag)
    switch (item.Tag) {
    case 1:
        // Wrap menu items should only be available if
        // a range of text is selected
        return (TextEditor.SelectedRange.Length > 0);
    case 2:
        // Quote menu items should only be available if
        // a range is NOT selected.
        return (TextEditor.SelectedRange.Length == 0);
    }

    return true;
}

Ketika kode ini dijalankan, dan tidak ada teks yang dipilih di NSTextView, dua item menu bungkus dinonaktifkan (meskipun dikabeli ke tindakan pada pengontrol tampilan):

Menampilkan item yang dinonaktifkan

Jika bagian teks dipilih dan menu dibuka kembali, dua item menu bungkus akan tersedia:

Menampilkan item yang diaktifkan

Mengaktifkan dan merespons item menu dalam kode

Seperti yang telah kita lihat di atas, hanya dengan menambahkan elemen antarmuka pengguna Kakao tertentu ke desain UI kami (seperti bidang teks), beberapa item menu default akan diaktifkan dan berfungsi secara otomatis, tanpa harus menulis kode apa pun. Selanjutnya mari kita lihat menambahkan kode C# kita sendiri ke proyek Xamarin.Mac kita untuk mengaktifkan item menu dan menyediakan fungsionalitas saat pengguna memilihnya.

Misalnya, kita ingin pengguna dapat menggunakan item Buka di menu File untuk memilih folder. Karena kami ingin ini menjadi fungsi di seluruh aplikasi dan tidak terbatas pada elemen jendela atau UI pemberian, kami akan menambahkan kode untuk menangani ini ke delegasi aplikasi kami.

Di Pad Solusi, klik AppDelegate.CS dua kali file untuk membukanya untuk pengeditan:

Memilih delegasi aplikasi

Tambahkan kode berikut di bawah DidFinishLaunching metode :

[Export ("openDocument:")]
void OpenDialog (NSObject sender)
{
    var dlg = NSOpenPanel.OpenPanel;
    dlg.CanChooseFiles = false;
    dlg.CanChooseDirectories = true;

    if (dlg.RunModal () == 1) {
        var alert = new NSAlert () {
            AlertStyle = NSAlertStyle.Informational,
            InformativeText = "At this point we should do something with the folder that the user just selected in the Open File Dialog box...",
            MessageText = "Folder Selected"
        };
        alert.RunModal ();
    }
}

Mari kita jalankan aplikasi sekarang dan buka menu File :

Menu File

Perhatikan bahwa item menu Buka sekarang diaktifkan. Jika kita memilihnya, dialog terbuka akan ditampilkan:

Dialog terbuka

Jika kita mengklik tombol Buka , pesan pemberitahuan kita akan ditampilkan:

Contoh pesan dialog

Baris kunci di sini adalah [Export ("openDocument:")], itu memberi tahu NSMenu bahwa AppDelegate kami memiliki metode void OpenDialog (NSObject sender) yang merespons tindakan.openDocument: Jika Anda akan ingat dari atas, item menu Buka secara otomatis terhubung ke tindakan ini secara default di Penyusun Antarmuka:

Menampilkan tindakan terlampir

Selanjutnya mari kita lihat membuat menu, item menu, dan tindakan kita sendiri dan menanggapinya dalam kode.

Bekerja dengan menu buka terbaru

Secara default, menu File berisi item Buka Terbaru yang melacak beberapa file terakhir yang telah dibuka pengguna dengan aplikasi Anda. Jika Anda membuat NSDocument aplikasi Xamarin.Mac berbasis, menu ini akan ditangani untuk Anda secara otomatis. Untuk jenis aplikasi Xamarin.Mac lainnya, Anda akan bertanggung jawab untuk mengelola dan merespons item menu ini secara manual.

Untuk menangani menu Buka Terbaru secara manual, Anda harus terlebih dahulu memberi tahunya bahwa file baru telah dibuka atau disimpan menggunakan yang berikut ini:

// Add document to the Open Recent menu
NSDocumentController.SharedDocumentController.NoteNewRecentDocumentURL(url);

Meskipun aplikasi Anda tidak menggunakan NSDocuments, Anda masih menggunakan NSDocumentController untuk mempertahankan menu Buka Terbaru dengan mengirim NSUrl dengan lokasi file ke NoteNewRecentDocumentURL metode SharedDocumentController.

Selanjutnya, Anda perlu mengambil OpenFile alih metode delegasi aplikasi untuk membuka file apa pun yang dipilih pengguna dari menu Buka Terbaru . Contohnya:

public override bool OpenFile (NSApplication sender, string filename)
{
    // Trap all errors
    try {
        filename = filename.Replace (" ", "%20");
        var url = new NSUrl ("file://"+filename);
        return OpenFile(url);
    } catch {
        return false;
    }
}

Kembalikan true jika file dapat dibuka, jika tidak kembali false dan peringatan bawaan akan ditampilkan kepada pengguna bahwa file tidak dapat dibuka.

Karena nama file dan jalur yang dikembalikan dari menu Buka Terbaru , mungkin menyertakan spasi, kita perlu melepaskan karakter ini dengan benar sebelum membuat NSUrl atau kita akan mendapatkan kesalahan. Kami melakukannya dengan kode berikut:

filename = filename.Replace (" ", "%20");

Terakhir, kita membuat NSUrl yang menunjuk ke file dan menggunakan metode pembantu di delegasi aplikasi untuk membuka jendela baru dan memuat file ke dalamnya:

var url = new NSUrl ("file://"+filename);
return OpenFile(url);

Untuk menyatukan semuanya, mari kita lihat contoh implementasi dalam file AppDelegate.cs :

using AppKit;
using Foundation;
using System.IO;
using System;

namespace MacHyperlink
{
    [Register ("AppDelegate")]
    public class AppDelegate : NSApplicationDelegate
    {
        #region Computed Properties
        public int NewWindowNumber { get; set;} = -1;
        #endregion

        #region Constructors
        public AppDelegate ()
        {
        }
        #endregion

        #region Override Methods
        public override void DidFinishLaunching (NSNotification notification)
        {
            // Insert code here to initialize your application
        }

        public override void WillTerminate (NSNotification notification)
        {
            // Insert code here to tear down your application
        }

        public override bool OpenFile (NSApplication sender, string filename)
        {
            // Trap all errors
            try {
                filename = filename.Replace (" ", "%20");
                var url = new NSUrl ("file://"+filename);
                return OpenFile(url);
            } catch {
                return false;
            }
        }
        #endregion

        #region Private Methods
        private bool OpenFile(NSUrl url) {
            var good = false;

            // Trap all errors
            try {
                var path = url.Path;

                // Is the file already open?
                for(int n=0; n<NSApplication.SharedApplication.Windows.Length; ++n) {
                    var content = NSApplication.SharedApplication.Windows[n].ContentViewController as ViewController;
                    if (content != null && path == content.FilePath) {
                        // Bring window to front
                        NSApplication.SharedApplication.Windows[n].MakeKeyAndOrderFront(this);
                        return true;
                    }
                }

                // Get new window
                var storyboard = NSStoryboard.FromName ("Main", null);
                var controller = storyboard.InstantiateControllerWithIdentifier ("MainWindow") as NSWindowController;

                // Display
                controller.ShowWindow(this);

                // Load the text into the window
                var viewController = controller.Window.ContentViewController as ViewController;
                viewController.Text = File.ReadAllText(path);
                viewController.SetLanguageFromPath(path);
                viewController.View.Window.SetTitleWithRepresentedFilename (Path.GetFileName(path));
                viewController.View.Window.RepresentedUrl = url;

                // Add document to the Open Recent menu
                NSDocumentController.SharedDocumentController.NoteNewRecentDocumentURL(url);

                // Make as successful
                good = true;
            } catch {
                // Mark as bad file on error
                good = false;
            }

            // Return results
            return good;
        }
        #endregion

        #region actions
        [Export ("openDocument:")]
        void OpenDialog (NSObject sender)
        {
            var dlg = NSOpenPanel.OpenPanel;
            dlg.CanChooseFiles = true;
            dlg.CanChooseDirectories = false;

            if (dlg.RunModal () == 1) {
                // Nab the first file
                var url = dlg.Urls [0];

                if (url != null) {
                    // Open the document in a new window
                    OpenFile (url);
                }
            }
        }
        #endregion
    }
}

Berdasarkan persyaratan aplikasi, Anda mungkin tidak ingin pengguna membuka file yang sama di lebih dari satu jendela secara bersamaan. Dalam contoh aplikasi kami, jika pengguna memilih file yang sudah terbuka (baik dari item menu Open Recent atau Open.. ), jendela yang berisi file dibawa ke depan.

Untuk mencapai hal ini, kami menggunakan kode berikut dalam metode pembantu kami:

var path = url.Path;

// Is the file already open?
for(int n=0; n<NSApplication.SharedApplication.Windows.Length; ++n) {
    var content = NSApplication.SharedApplication.Windows[n].ContentViewController as ViewController;
    if (content != null && path == content.FilePath) {
        // Bring window to front
        NSApplication.SharedApplication.Windows[n].MakeKeyAndOrderFront(this);
        return true;
    }
}

Kami merancang kelas kami ViewController untuk menyimpan jalur ke file di propertinya Path . Selanjutnya, kita mengulangi semua jendela yang saat ini terbuka di aplikasi. Jika file sudah terbuka di salah satu jendela, file tersebut dibawa ke depan semua jendela lainnya menggunakan:

NSApplication.SharedApplication.Windows[n].MakeKeyAndOrderFront(this);

Jika tidak ada kecocokan yang ditemukan, jendela baru dibuka dengan file yang dimuat dan file dicatat di menu Buka Terbaru :

// Get new window
var storyboard = NSStoryboard.FromName ("Main", null);
var controller = storyboard.InstantiateControllerWithIdentifier ("MainWindow") as NSWindowController;

// Display
controller.ShowWindow(this);

// Load the text into the window
var viewController = controller.Window.ContentViewController as ViewController;
viewController.Text = File.ReadAllText(path);
viewController.SetLanguageFromPath(path);
viewController.View.Window.SetTitleWithRepresentedFilename (Path.GetFileName(path));
viewController.View.Window.RepresentedUrl = url;

// Add document to the Open Recent menu
NSDocumentController.SharedDocumentController.NoteNewRecentDocumentURL(url);

Bekerja dengan tindakan jendela kustom

Sama seperti tindakan First Responder bawaan yang datang pra-kabel ke item menu standar, Anda dapat membuat tindakan kustom baru dan menghubungkannya ke item menu di Interface Builder.

Pertama, tentukan tindakan kustom pada salah satu pengontrol jendela aplikasi Anda. Contohnya:

[Action("defineKeyword:")]
public void defineKeyword (NSObject sender) {
    // Preform some action when the menu is selected
    Console.WriteLine ("Request to define keyword");
}

Selanjutnya, klik dua kali file papan cerita aplikasi di Solution Pad untuk membukanya untuk diedit di Penyusun Antarmuka Xcode. Pilih Responden Pertama di bawah Adegan Aplikasi, lalu beralih ke Pemeriksa Atribut:

Pemeriksa Atribut

Klik tombol + di bagian bawah Pemeriksa Atribut untuk menambahkan tindakan kustom baru:

Menambahkan tindakan baru

Beri nama yang sama dengan tindakan kustom yang Anda buat di pengontrol jendela Anda:

Mengedit nama tindakan

Klik kontrol dan seret dari item menu ke Responden Pertama di bawah Adegan Aplikasi. Dari daftar popup, pilih tindakan baru yang baru saja Anda buat (defineKeyword: dalam contoh ini):

Melampirkan tindakan

Simpan perubahan ke papan cerita dan kembali ke Visual Studio untuk Mac untuk menyinkronkan perubahan. Jika Anda menjalankan aplikasi, item menu tempat Anda menyambungkan tindakan kustom akan secara otomatis diaktifkan/dinonaktifkan (berdasarkan jendela dengan tindakan terbuka) dan memilih item menu akan mengaktifkan tindakan:

Menguji tindakan baru

Menambahkan, mengedit, dan menghapus menu

Seperti yang telah kita lihat di bagian sebelumnya, aplikasi Xamarin.Mac dilengkapi dengan jumlah menu default dan item menu yang akan diaktifkan dan direspons secara otomatis. Kami juga telah melihat cara menambahkan kode ke aplikasi kami yang juga akan mengaktifkan dan menanggapi item default ini.

Di bagian ini kita akan melihat menghapus item menu yang tidak kita butuhkan, mengatur ulang menu dan menambahkan menu, item menu, dan tindakan baru.

Klik dua kali file Main.storyboard di Solution Pad untuk membukanya untuk pengeditan:

Mengklik dua kali file papan cerita untuk mengedit UI di Xcode.

Untuk aplikasi Xamarin.Mac spesifik kami, kami tidak akan menggunakan menu Tampilan default sehingga kami akan menghapusnya. Di Hierarki Antarmuka pilih item menu Tampilan yang merupakan bagian dari bilah menu utama:

Memilih item menu Tampilan

Tekan hapus atau backspace untuk menghapus menu. Selanjutnya, kita tidak akan menggunakan semua item di menu Format dan kita ingin memindahkan item yang akan kita gunakan dari bawah sub menu. Di Hierarki Antarmuka pilih item menu berikut ini:

Menyoroti beberapa item

Seret item di bawah Menu induk dari sub-menu tempat item saat ini berada:

Menyeret item menu ke menu induk

Menu Anda sekarang akan terlihat seperti:

Item di lokasi baru

Selanjutnya mari kita seret sub-menu Teks keluar dari bawah menu Format dan letakkan di bilah menu utama antara menu Format dan Jendela :

Menu Teks

Mari kita kembali di bawah menu Format dan hapus item sub-menu Font . Selanjutnya, pilih menu Format dan ganti namanya menjadi "Font":

Menu Font

Selanjutnya, mari kita buat menu kustom frasa yang telah ditentukan sebelumnya yang akan secara otomatis ditambahkan ke teks dalam tampilan teks saat dipilih. Dalam kotak pencarian di bagian bawah pada jenis Pemeriksa Pustaka di "menu." Ini akan memudahkan untuk menemukan dan bekerja dengan semua elemen antarmuka pengguna menu:

Pemeriksa Pustaka

Sekarang mari kita lakukan hal berikut untuk membuat menu kami:

  1. Seret Item Menu dari Pemeriksa Pustaka ke bilah menu antara menu Teks dan Jendela:

    Memilih item menu baru di Pustaka

  2. Ganti nama item "Frasa":

    Mengatur nama menu

  3. Selanjutnya seret Menu dari Pemeriksa Pustaka:

    Memilih menu dari Pustaka

  4. Jatuhkan lalu Menu pada Item Menu baru yang baru saja kita buat dan ubah namanya menjadi "Frasa":

    Mengedit nama menu

  5. Sekarang mari kita ganti nama tiga Item Menu default "Alamat", "Tanggal," dan "Salam":

    Menu Frasa

  6. Mari kita tambahkan Item Menu keempat dengan menyeret Item Menu dari Pemeriksa Pustaka dan menyebutnya "Tanda Tangan":

    Mengedit nama item menu

  7. Simpan perubahan ke bilah menu.

Sekarang mari kita buat sekumpulan tindakan kustom sehingga item menu baru kita terekspos ke kode C#. Di Xcode mari kita beralih ke tampilan Asisten :

Membuat tindakan yang diperlukan

Mari kita lakukan hal berikut:

  1. Control-drag dari item menu Alamat ke file AppDelegate.h .

  2. Alihkan jenis Koneksi ion ke Tindakan:

    Memilih jenis tindakan

  3. Masukkan Nama "phraseAddress" dan tekan tombol Koneksi untuk membuat tindakan baru:

    Mengonfigurasi tindakan dengan memasukkan nama.

  4. Ulangi langkah-langkah di atas untuk item menu Tanggal, Salam, dan Tanda Tangan :

    Tindakan yang telah selesai

  5. Simpan perubahan ke bilah menu.

Selanjutnya kita perlu membuat outlet untuk tampilan teks kita sehingga kita dapat menyesuaikan kontennya dari kode. Pilih file ViewController.h di Editor Asisten dan buat outlet baru yang disebut documentText:

Membuat outlet

Kembali ke Visual Studio untuk Mac untuk menyinkronkan perubahan dari Xcode. Selanjutnya edit file ViewController.cs dan buat terlihat seperti berikut ini:

using System;

using AppKit;
using Foundation;

namespace MacMenus
{
    public partial class ViewController : NSViewController
    {
        #region Application Access
        public static AppDelegate App {
            get { return (AppDelegate)NSApplication.SharedApplication.Delegate; }
        }
        #endregion

        #region Computed Properties
        public override NSObject RepresentedObject {
            get {
                return base.RepresentedObject;
            }
            set {
                base.RepresentedObject = value;
                // Update the view, if already loaded.
            }
        }

        public string Text {
            get { return documentText.Value; }
            set { documentText.Value = value; }
        }
        #endregion

        #region Constructors
        public ViewController (IntPtr handle) : base (handle)
        {
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Do any additional setup after loading the view.
        }

        public override void ViewWillAppear ()
        {
            base.ViewWillAppear ();

            App.textEditor = this;
        }

        public override void ViewWillDisappear ()
        {
            base.ViewDidDisappear ();

            App.textEditor = null;
        }
        #endregion
    }
}

Ini mengekspos teks tampilan teks kami di luar ViewController kelas dan menginformasikan delegasi aplikasi ketika jendela mendapatkan atau kehilangan fokus. Sekarang edit file AppDelegate.cs dan buat terlihat seperti berikut ini:

using AppKit;
using Foundation;
using System;

namespace MacMenus
{
    [Register ("AppDelegate")]
    public partial class AppDelegate : NSApplicationDelegate
    {
        #region Computed Properties
        public ViewController textEditor { get; set;} = null;
        #endregion

        #region Constructors
        public AppDelegate ()
        {
        }
        #endregion

        #region Override Methods
        public override void DidFinishLaunching (NSNotification notification)
        {
            // Insert code here to initialize your application
        }

        public override void WillTerminate (NSNotification notification)
        {
            // Insert code here to tear down your application
        }
        #endregion

        #region Custom actions
        [Export ("openDocument:")]
        void OpenDialog (NSObject sender)
        {
            var dlg = NSOpenPanel.OpenPanel;
            dlg.CanChooseFiles = false;
            dlg.CanChooseDirectories = true;

            if (dlg.RunModal () == 1) {
                var alert = new NSAlert () {
                    AlertStyle = NSAlertStyle.Informational,
                    InformativeText = "At this point we should do something with the folder that the user just selected in the Open File Dialog box...",
                    MessageText = "Folder Selected"
                };
                alert.RunModal ();
            }
        }

        partial void phrasesAddress (Foundation.NSObject sender) {

            textEditor.Text += "Xamarin HQ\n394 Pacific Ave, 4th Floor\nSan Francisco CA 94111\n\n";
        }

        partial void phrasesDate (Foundation.NSObject sender) {

            textEditor.Text += DateTime.Now.ToString("D");
        }

        partial void phrasesGreeting (Foundation.NSObject sender) {

            textEditor.Text += "Dear Sirs,\n\n";
        }

        partial void phrasesSignature (Foundation.NSObject sender) {

            textEditor.Text += "Sincerely,\n\nKevin Mullins\nXamarin,Inc.\n";
        }
        #endregion
    }
}

Di sini kita telah membuat AppDelegate kelas parsial sehingga kita dapat menggunakan tindakan dan outlet yang kita tentukan di Interface Builder. Kami juga mengekspos textEditor untuk melacak jendela mana yang saat ini sedang dalam fokus.

Metode berikut digunakan untuk menangani menu kustom dan item menu kami:

partial void phrasesAddress (Foundation.NSObject sender) {

    if (textEditor == null) return;
    textEditor.Text += "Xamarin HQ\n394 Pacific Ave, 4th Floor\nSan Francisco CA 94111\n\n";
}

partial void phrasesDate (Foundation.NSObject sender) {

    if (textEditor == null) return;
    textEditor.Text += DateTime.Now.ToString("D");
}

partial void phrasesGreeting (Foundation.NSObject sender) {

    if (textEditor == null) return;
    textEditor.Text += "Dear Sirs,\n\n";
}

partial void phrasesSignature (Foundation.NSObject sender) {

    if (textEditor == null) return;
    textEditor.Text += "Sincerely,\n\nKevin Mullins\nXamarin,Inc.\n";
}

Sekarang jika kita menjalankan aplikasi kita, semua item di menu Frasa akan aktif dan akan menambahkan frasa pemberian ke tampilan teks saat dipilih:

Contoh aplikasi yang berjalan

Sekarang setelah kita memiliki dasar-dasar bekerja dengan bilah menu aplikasi, mari kita lihat membuat menu kontekstual kustom.

Membuat menu dari kode

Selain membuat menu dan item menu dengan Penyusun Antarmuka Xcode, mungkin ada kalanya aplikasi Xamarin.Mac perlu membuat, memodifikasi, atau menghapus menu, sub-menu, atau item menu dari kode.

Dalam contoh berikut, kelas dibuat untuk menyimpan informasi tentang item menu dan sub-menu yang akan dibuat secara dinamis dengan cepat:

using System;
using System.Collections.Generic;
using Foundation;
using AppKit;

namespace AppKit.TextKit.Formatter
{
    public class LanguageFormatCommand : NSObject
    {
        #region Computed Properties
        public string Title { get; set; } = "";
        public string Prefix { get; set; } = "";
        public string Postfix { get; set; } = "";
        public List<LanguageFormatCommand> SubCommands { get; set; } = new List<LanguageFormatCommand>();
        #endregion

        #region Constructors
        public LanguageFormatCommand () {

        }

        public LanguageFormatCommand (string title)
        {
            // Initialize
            this.Title = title;
        }

        public LanguageFormatCommand (string title, string prefix)
        {
            // Initialize
            this.Title = title;
            this.Prefix = prefix;
        }

        public LanguageFormatCommand (string title, string prefix, string postfix)
        {
            // Initialize
            this.Title = title;
            this.Prefix = prefix;
            this.Postfix = postfix;
        }
        #endregion
    }
}

Menambahkan menu dan item

Dengan kelas ini ditentukan, rutinitas berikut akan mengurai kumpulan LanguageFormatCommandobjek dan secara rekursif membangun menu baru dan item menu dengan menambahkannya ke bagian bawah menu yang ada (dibuat di Pembangun Antarmuka) yang telah diteruskan:

private void AssembleMenu(NSMenu menu, List<LanguageFormatCommand> commands) {
    NSMenuItem menuItem;

    // Add any formatting commands to the Formatting menu
    foreach (LanguageFormatCommand command in commands) {
        // Add separator or item?
        if (command.Title == "") {
            menuItem = NSMenuItem.SeparatorItem;
        } else {
            menuItem = new NSMenuItem (command.Title);

            // Submenu?
            if (command.SubCommands.Count > 0) {
                // Yes, populate submenu
                menuItem.Submenu = new NSMenu (command.Title);
                AssembleMenu (menuItem.Submenu, command.SubCommands);
            } else {
                // No, add normal menu item
                menuItem.Activated += (sender, e) => {
                    // Apply the command on the selected text
                    TextEditor.PerformFormattingCommand (command);
                };
            }
        }
        menu.AddItem (menuItem);
    }
}

Untuk objek apa pun LanguageFormatCommand yang memiliki properti kosong Title , rutinitas ini membuat item menu Pemisah (garis abu-abu tipis) di antara bagian menu:

menuItem = NSMenuItem.SeparatorItem;

Jika judul disediakan, item menu baru dengan judul tersebut dibuat:

menuItem = new NSMenuItem (command.Title);

LanguageFormatCommand Jika objek berisi objek anakLanguageFormatCommand, sub-menu dibuat dan metode secara rekursif dipanggil untuk membangun menu tersebutAssembleMenu:

menuItem.Submenu = new NSMenu (command.Title);
AssembleMenu (menuItem.Submenu, command.SubCommands);

Untuk item menu baru yang tidak memiliki sub-menu, kode ditambahkan untuk menangani item menu yang dipilih oleh pengguna:

menuItem.Activated += (sender, e) => {
    // Do something when the menu item is selected
    ...
};

Menguji pembuatan menu

Dengan semua kode di atas di tempat, jika kumpulan LanguageFormatCommand objek berikut dibuat:

// Define formatting commands
FormattingCommands.Add(new LanguageFormatCommand("Strong","**","**"));
FormattingCommands.Add(new LanguageFormatCommand("Emphasize","_","_"));
FormattingCommands.Add(new LanguageFormatCommand("Inline Code","`","`"));
FormattingCommands.Add(new LanguageFormatCommand("Code Block","```\n","\n```"));
FormattingCommands.Add(new LanguageFormatCommand("Comment","<!--","-->"));
FormattingCommands.Add (new LanguageFormatCommand ());
FormattingCommands.Add(new LanguageFormatCommand("Unordered List","* "));
FormattingCommands.Add(new LanguageFormatCommand("Ordered List","1. "));
FormattingCommands.Add(new LanguageFormatCommand("Block Quote","> "));
FormattingCommands.Add (new LanguageFormatCommand ());

var Headings = new LanguageFormatCommand ("Headings");
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 1","# "));
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 2","## "));
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 3","### "));
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 4","#### "));
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 5","##### "));
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 6","###### "));
FormattingCommands.Add (Headings);

FormattingCommands.Add(new LanguageFormatCommand ());
FormattingCommands.Add(new LanguageFormatCommand("Link","[","]()"));
FormattingCommands.Add(new LanguageFormatCommand("Image","![](",")"));
FormattingCommands.Add(new LanguageFormatCommand("Image Link","[![](",")](LinkImageHere)"));

Dan koleksi tersebut AssembleMenu diteruskan ke fungsi (dengan Menu Format diatur sebagai dasar), menu dinamis dan item menu berikut akan dibuat:

Item menu baru di aplikasi yang sedang berjalan

Menghapus menu dan item

Jika Anda perlu menghapus menu atau item menu apa pun dari antarmuka pengguna aplikasi, Anda dapat menggunakan RemoveItemAt metode NSMenu kelas hanya dengan memberinya indeks berbasis nol item untuk dihapus.

Misalnya, untuk menghapus menu dan item menu yang dibuat oleh rutinitas di atas, Anda dapat menggunakan kode berikut:

public void UnpopulateFormattingMenu(NSMenu menu) {

    // Remove any additional items
    for (int n = (int)menu.Count - 1; n > 4; --n) {
        menu.RemoveItemAt (n);
    }
}

Dalam kasus kode di atas, empat item menu pertama dibuat di Penyusun Antarmuka Xcode dan tandang yang tersedia di aplikasi, sehingga tidak dihapus secara dinamis.

Menu kontekstual

Menu kontekstual muncul saat pengguna mengklik kanan atau mengeklik kontrol item di jendela. Secara default, beberapa elemen UI yang disertakan dalam macOS sudah memiliki menu kontekstual yang melekat padanya (seperti tampilan teks). Namun, mungkin ada kalanya kita ingin membuat menu kontekstual kustom kita sendiri untuk elemen UI yang telah kita tambahkan ke jendela.

Mari kita edit file Main.storyboard kami di Xcode dan tambahkan jendela Window ke desain kami, atur Kelas ke "NSPanel" di Inspektur Identitas, tambahkan item Asisten baru ke menu Jendela, dan lampirkan ke jendela baru menggunakan Show Segue:

Mengatur jenis segue dalam file storyboard titik utama.

Mari kita lakukan hal berikut:

  1. Seret Label dari Pemeriksa Pustaka ke jendela Panel dan atur teksnya ke "Properti":

    Mengedit nilai label

  2. Selanjutnya seret Menu dari Pemeriksa Pustaka ke Pengontrol Tampilan di Hierarki Tampilan dan ganti nama tiga item menu default Dokumen, Teks, dan Font:

    Item menu yang diperlukan

  3. Sekarang seret kontrol dari Label Properti ke Menu:

    Menyeret untuk membuat segue

  4. Dari dialog popup, pilih Menu:

    Mengatur jenis segue dengan memilih menu dari Outlet di menu Konteks label.

  5. Dari Inspektur Identitas, atur kelas Lihat Pengontrol ke "PanelViewController":

    Mengatur kelas segue

  6. Beralih kembali ke Visual Studio untuk Mac untuk disinkronkan, lalu kembali ke Penyusun Antarmuka.

  7. Beralih ke Editor Asisten dan pilih file PanelViewController.h .

  8. Buat tindakan untuk item menu Dokumen yang disebut propertyDocument:

    Mengonfigurasi tindakan bernama propertyDocument.

  9. Ulangi membuat tindakan untuk item menu yang tersisa:

    Mengulangi tindakan untuk item menu yang tersisa.

  10. Akhirnya buat outlet untuk Label Properti yang disebut propertyLabel:

    Mengonfigurasi outlet

  11. Simpan perubahan Anda dan kembali ke Visual Studio untuk Mac untuk disinkronkan dengan Xcode.

Edit file PanelViewController.cs dan tambahkan kode berikut:

partial void propertyDocument (Foundation.NSObject sender) {
    propertyLabel.StringValue = "Document";
}

partial void propertyFont (Foundation.NSObject sender) {
    propertyLabel.StringValue = "Font";
}

partial void propertyText (Foundation.NSObject sender) {
    propertyLabel.StringValue = "Text";
}

Sekarang jika kita menjalankan aplikasi dan klik kanan pada label properti di panel, kita akan melihat menu kontekstual kustom kita. Jika kita memilih dan item dari menu, nilai label akan berubah:

Menu kontekstual yang berjalan

Selanjutnya mari kita lihat membuat menu bilah status.

Menu bilah status

Menu bilah status menampilkan kumpulan item menu status yang menyediakan interaksi dengan atau umpan balik kepada pengguna, seperti menu atau gambar yang mencerminkan status aplikasi. Menu bilah status aplikasi diaktifkan dan aktif meskipun aplikasi berjalan di latar belakang. Bilah status seluruh sistem berada di sisi kanan bilah menu aplikasi dan merupakan satu-satunya Bilah Status yang saat ini tersedia di macOS.

Mari kita edit file AppDelegate.cs kita dan buat DidFinishLaunching metodenya terlihat seperti berikut:

public override void DidFinishLaunching (NSNotification notification)
{
    // Create a status bar menu
    NSStatusBar statusBar = NSStatusBar.SystemStatusBar;

    var item = statusBar.CreateStatusItem (NSStatusItemLength.Variable);
    item.Title = "Text";
    item.HighlightMode = true;
    item.Menu = new NSMenu ("Text");

    var address = new NSMenuItem ("Address");
    address.Activated += (sender, e) => {
        PhraseAddress(address);
    };
    item.Menu.AddItem (address);

    var date = new NSMenuItem ("Date");
    date.Activated += (sender, e) => {
        PhraseDate(date);
    };
    item.Menu.AddItem (date);

    var greeting = new NSMenuItem ("Greeting");
    greeting.Activated += (sender, e) => {
        PhraseGreeting(greeting);
    };
    item.Menu.AddItem (greeting);

    var signature = new NSMenuItem ("Signature");
    signature.Activated += (sender, e) => {
        PhraseSignature(signature);
    };
    item.Menu.AddItem (signature);
}

NSStatusBar statusBar = NSStatusBar.SystemStatusBar; memberi kami akses ke bilah status di seluruh sistem. var item = statusBar.CreateStatusItem (NSStatusItemLength.Variable); membuat item bilah status baru. Dari sana kita membuat menu dan sejumlah item menu dan melampirkan menu ke item bilah status yang baru saja kita buat.

Jika kita menjalankan aplikasi, item bilah status baru akan ditampilkan. Memilih item dari menu akan mengubah teks dalam tampilan teks:

Menu bilah status berjalan

Selanjutnya, mari kita lihat membuat item menu dock kustom.

Menu dock kustom

Menu dock muncul untuk aplikasi Mac Anda saat pengguna mengklik kanan atau mengeklik kontrol ikon aplikasi di dok:

Menu dock kustom

Mari kita buat menu dock kustom untuk aplikasi kita dengan melakukan hal berikut:

  1. Di Visual Studio untuk Mac, klik kanan proyek aplikasi dan pilih Tambahkan>File Baru... Dari dialog file baru, pilih Definisi Antarmuka Kosong Xamarin.Mac>, gunakan "DockMenu" untuk Nama dan klik tombol Baru untuk membuat file DockMenu.xib baru:

    Menambahkan definisi antarmuka kosong

  2. Di Solution Pad, klik dua kali file DockMenu.xib untuk membukanya untuk diedit di Xcode. Buat Menu baru dengan item berikut: Alamat, Tanggal, Salam, dan Tanda Tangan

    Menata UI

  3. Selanjutnya, mari kita sambungkan item menu baru kita ke tindakan yang sudah ada yang kita buat untuk menu kustom kita di bagian Menambahkan, Mengedit, dan Menghapus Menu di atas. Beralih ke Pemeriksa Koneksi ion dan pilih Responder Pertama di Hierarki Antarmuka. Gulir ke bawah dan temukan phraseAddress: tindakan. Seret garis dari lingkaran pada tindakan tersebut ke item menu Alamat :

    Menyeret garis ke item menu Alamat.

  4. Ulangi untuk semua item menu lain yang melampirkannya ke tindakan yang sesuai:

    Mengulangi untuk item menu lain yang melampirkannya ke tindakan yang sesuai.

  5. Selanjutnya, pilih Aplikasi di Hierarki Antarmuka. Di pemeriksa Koneksi ion, seret garis dari lingkaran di dockMenu outlet ke menu yang baru saja kami buat:

    Menyeret kabel ke atas outlet

  6. Simpan perubahan Anda dan beralih kembali ke Visual Studio untuk Mac untuk disinkronkan dengan Xcode.

  7. Klik dua kali file Info.plist untuk membukanya untuk pengeditan:

    Mengedit file Info.plist

  8. Klik tab Sumber di bagian bawah layar:

    Memilih tampilan Sumber

  9. Klik Tambahkan entri baru, klik tombol plus hijau, atur nama properti ke "AppleDockMenu" dan nilai ke "DockMenu" (nama file .xib baru kami tanpa ekstensi):

    Menambahkan item DockMenu

Sekarang jika kita menjalankan aplikasi kita dan klik kanan pada ikonnya di Dock, item menu baru kita akan ditampilkan:

Contoh menu dock yang berjalan

Jika kita memilih salah satu item kustom dari menu, teks dalam tampilan teks kita akan dimodifikasi.

Tombol pop-up dan daftar tarik-turun

Tombol pop-up menampilkan item yang dipilih dan menyajikan daftar opsi untuk dipilih saat diklik oleh pengguna. Daftar tarik-turun adalah jenis tombol pop-up yang biasanya digunakan untuk memilih perintah khusus untuk konteks tugas saat ini. Keduanya dapat muncul di mana saja di jendela.

Mari kita buat tombol pop-up kustom untuk aplikasi kita dengan melakukan hal berikut:

  1. Edit file Main.storyboard di Xcode dan seret Tombol Popup dari Pemeriksa Pustaka ke jendela Panel yang kami buat di bagian Menu Kontekstual:

    Menambahkan tombol popup

  2. Tambahkan item menu baru dan atur judul Item di Popup ke: Alamat, Tanggal, Salam, dan Tanda Tangan

    Mengonfigurasi item menu

  3. Selanjutnya, mari kita sambungkan item menu baru kita ke tindakan yang sudah ada yang kita buat untuk menu kustom kita di bagian Menu Menambahkan, Mengedit, dan Menghapus di atas. Beralih ke Pemeriksa Koneksi ion dan pilih Responder Pertama di Hierarki Antarmuka. Gulir ke bawah dan temukan phraseAddress: tindakan. Seret garis dari lingkaran pada tindakan tersebut ke item menu Alamat :

    Menyeret untuk menghubungkan tindakan

  4. Ulangi untuk semua item menu lain yang melampirkannya ke tindakan yang sesuai:

    Semua tindakan yang diperlukan

  5. Simpan perubahan Anda dan beralih kembali ke Visual Studio untuk Mac untuk disinkronkan dengan Xcode.

Sekarang jika kita menjalankan aplikasi dan memilih item dari popup, teks dalam tampilan teks kita akan berubah:

Contoh popup yang berjalan

Anda dapat membuat dan bekerja dengan daftar pull-down dengan cara yang sama persis seperti tombol pop-up. Alih-alih melampirkan ke tindakan yang ada, Anda dapat membuat tindakan kustom Anda sendiri seperti yang kami lakukan untuk menu kontekstual kami di bagian Menu Kontekstual.

Ringkasan

Artikel ini telah melihat secara rinci tentang bekerja dengan menu dan item menu dalam aplikasi Xamarin.Mac. Pertama kita memeriksa bilah menu aplikasi, kemudian kita melihat membuat menu kontekstual, selanjutnya kita memeriksa menu bilah status dan menu dock kustom. Akhirnya, kami membahas menu pop-up dan Daftar pull-down.