Bagikan melalui


Menambahkan menu pintasan di jendela alat

Panduan ini menempatkan menu pintasan di jendela alat. Menu pintasan adalah menu yang muncul saat pengguna mengklik kanan tombol, kotak teks, atau latar belakang jendela. Perintah pada menu pintasan berulah sama dengan perintah pada menu atau bilah alat lain. Untuk mendukung menu pintasan, tentukan di file .vsct dan tampilkan sebagai respons terhadap klik kanan mouse.

Jendela alat terdiri dari kontrol pengguna WPF di kelas jendela alat kustom yang mewarisi dari ToolWindowPane.

Panduan ini menunjukkan cara membuat menu pintasan sebagai menu Visual Studio, dengan mendeklarasikan item menu dalam file .vsct , lalu menggunakan Kerangka Kerja Paket Terkelola untuk mengimplementasikannya di kelas yang menentukan jendela alat. Pendekatan ini memfasilitasi akses ke perintah Visual Studio, elemen UI, dan model objek Automation.

Atau, jika menu pintasan Anda tidak akan mengakses fungsionalitas Visual Studio, Anda dapat menggunakan ContextMenu properti elemen XAML dalam kontrol pengguna. Untuk informasi selengkapnya, lihat ContextMenu.

Membuat paket menu pintasan jendela alat

  1. Buat proyek VSIX bernama TWShortcutMenu dan tambahkan templat jendela alat bernama ShortcutMenu ke dalamnya. Untuk informasi selengkapnya tentang membuat jendela alat, lihat Membuat ekstensi dengan jendela alat.

Menentukan menu pintasan

Menu pintasan seperti yang ditunjukkan dalam panduan ini memungkinkan pengguna memilih dari daftar warna yang digunakan untuk mengisi latar belakang jendela alat.

  1. Di ShortcutMenuPackage.vsct, temukan di elemen GuidSymbol bernama guidShortcutMenuPackageCmdSet, dan deklarasikan menu pintasan, grup menu pintasan, dan opsi menu. Elemen GuidSymbol sekarang akan terlihat seperti ini:

    <GuidSymbol name="guidShortcutMenuPackageCmdSet" value="{00000000-0000-0000-0000-0000}"> // your GUID here
        <IDSymbol name="ShortcutMenuCommandId" value="0x0100" />
        <IDSymbol name="ColorMenu" value="0x1000"/>
        <IDSymbol name="ColorGroup" value="0x1100"/>
        <IDSymbol name="cmdidRed" value="0x102"/>
        <IDSymbol name="cmdidYellow" value="0x103"/>
        <IDSymbol name="cmdidBlue" value="0x104"/>
    </GuidSymbol>
    
  2. Tepat sebelum elemen Tombol, buat elemen Menu lalu tentukan menu pintasan di dalamnya.

    <Menus>
      <Menu guid="guidShortcutMenuPackageCmdSet" id="ColorMenu" type="Context">
        <Strings>
          <ButtonText>Color change</ButtonText>
          <CommandName>ColorChange</CommandName>
        </Strings>
      </Menu>
    </Menus>
    

    Menu pintasan tidak memiliki induk karena bukan bagian dari menu atau bilah alat.

  3. Buat elemen Grup dengan elemen Grup yang berisi item menu pintasan, dan kaitkan grup dengan menu pintasan.

    <Groups>
        <Group guid="guidShortcutMenuPackageCmdSet" id="ColorGroup">
            <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorMenu"/>
        </Group>
    </Groups>
    
  4. Di elemen Tombol, tentukan perintah individual yang akan muncul di menu pintasan. Elemen Tombol akan terlihat seperti ini:

    <Buttons>
        <Button guid="guidShortcutMenuPackageCmdSet" id="ShortcutMenuCommandId" priority="0x0100" type="Button">
            <Parent guid="guidSHLMainMenu" id="IDG_VS_WNDO_OTRWNDWS1"/>
            <Icon guid="guidImages" id="bmpPic1" />
            <Strings>
                <ButtonText>ShortcutMenu</ButtonText>
            </Strings>
        </Button>
    
        <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidRed" priority="1" type="Button">
            <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" />
            <Strings>
                <ButtonText>Red</ButtonText>
            </Strings>
        </Button>
    
        <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidYellow" priority="3" type="Button">
            <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" />
            <Strings>
                <ButtonText>Yellow</ButtonText>
            </Strings>
        </Button>
    
        <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidBlue" priority="5" type="Button">
            <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" />
            <Strings>
                <ButtonText>Blue</ButtonText>
            </Strings>
        </Button>
    </Buttons>
    
  5. Di ShortcutMenuCommand.cs, tambahkan definisi untuk GUID set perintah, menu pintasan, dan item menu.

    public const string guidShortcutMenuPackageCmdSet = "00000000-0000-0000-0000-00000000"; // your GUID will differ
    public const int ColorMenu = 0x1000;
    public const int cmdidRed = 0x102;
    public const int cmdidYellow = 0x103;
    public const int cmdidBlue = 0x104;
    

    Ini adalah ID perintah yang sama yang ditentukan di bagian Simbol dari file ShortcutMenuPackage.vsct . Grup konteks tidak disertakan di sini karena hanya diperlukan dalam file .vsct .

Menerapkan menu pintasan

Bagian ini mengimplementasikan menu pintasan dan perintahnya.

  1. Di ShortcutMenu.cs, jendela alat bisa mendapatkan layanan perintah menu, tetapi kontrol yang dikandungnya tidak dapat. Langkah-langkah berikut menunjukkan cara membuat layanan perintah menu tersedia untuk kontrol pengguna.

  2. Di ShortcutMenu.cs, tambahkan yang berikut ini menggunakan direktif:

    using Microsoft.VisualStudio.Shell;
    using System.ComponentModel.Design;
    
  3. Ambil alih metode Initialize() jendela alat untuk mendapatkan layanan perintah menu dan menambahkan kontrol, meneruskan layanan perintah menu ke konstruktor:

    protected override void Initialize()
    {
        var commandService = (OleMenuCommandService)GetService(typeof(IMenuCommandService));
        Content = new ShortcutMenuControl(commandService);
    }
    
  4. Di konstruktor jendela alat ShortcutMenu, hapus baris yang menambahkan kontrol. Konstruktor sekarang akan terlihat seperti ini:

    public ShortcutMenu() : base(null)
    {
        this.Caption = "ShortcutMenu";
        this.BitmapResourceID = 301;
        this.BitmapIndex = 1;
    }
    
  5. Di ShortcutMenuControl.xaml.cs, tambahkan bidang privat untuk layanan perintah menu dan ubah konstruktor kontrol untuk mengambil layanan perintah menu. Kemudian gunakan layanan perintah menu untuk menambahkan perintah menu konteks. Konstruktor ShortcutMenuControl sekarang akan terlihat seperti kode berikut. Handler perintah akan ditentukan nanti.

    public ShortcutMenuControl(OleMenuCommandService service)
    {
        this.InitializeComponent();
        commandService = service;
    
        if (null !=commandService)
        {
            // Create an alias for the command set guid.
            Guid guid = new Guid(ShortcutMenuCommand.guidShortcutMenuPackageCmdSet);
    
            // Create the command IDs.
            var red = new CommandID(guid, ShortcutMenuCommand.cmdidRed);
            var yellow = new CommandID(guid, ShortcutMenuCommand.cmdidYellow);
            var blue = new CommandID(guid, ShortcutMenuCommand.cmdidBlue);
    
            // Add a command for each command ID.
            commandService.AddCommand(new MenuCommand(ChangeColor, red));
            commandService.AddCommand(new MenuCommand(ChangeColor, yellow));
            commandService.AddCommand(new MenuCommand(ChangeColor, blue));
        }
    }
    
  6. Di ShortcutMenuControl.xaml, tambahkan MouseRightButtonDown peristiwa ke elemen tingkat UserControl atas. File XAML sekarang akan terlihat seperti ini:

    <UserControl x:Class="TWShortcutMenu.ShortcutMenuControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            Background="{DynamicResource VsBrush.Window}"
            Foreground="{DynamicResource VsBrush.WindowText}"
            mc:Ignorable="d"
            d:DesignHeight="300" d:DesignWidth="300"
            Name="MyToolWindow"
            MouseRightButtonDown="MyToolWindow_MouseRightButtonDown">
        <Grid>
            <StackPanel Orientation="Vertical">
                <TextBlock Margin="10" HorizontalAlignment="Center">ShortcutMenu</TextBlock>
            </StackPanel>
        </Grid>
    </UserControl>
    
  7. Di ShortcutMenuControl.xaml.cs, tambahkan stub untuk penanganan aktivitas.

    private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
    . . .
    }
    
  8. Tambahkan yang berikut ini menggunakan direktif ke file yang sama:

    using Microsoft.VisualStudio.Shell;
    using System.ComponentModel.Design;
    using System;
    using System.Windows.Input;
    using System.Windows.Media;
    
  9. Terapkan MyToolWindowMouseRightButtonDown peristiwa sebagai berikut.

    private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (null != commandService)
        {
            CommandID menuID = new CommandID(
                new Guid(ShortcutMenuCommand.guidShortcutMenuPackageCmdSet),
                ShortcutMenuCommand.ColorMenu);
            Point p = this.PointToScreen(e.GetPosition(this));
            commandService.ShowContextMenu(menuID, (int)p.X, (int)p.Y);
        }
    }
    

    Ini membuat CommandID objek untuk menu pintasan, mengidentifikasi lokasi klik mouse, dan membuka menu pintasan di lokasi tersebut ShowContextMenu dengan menggunakan metode .

  10. Terapkan handler perintah.

    private void ChangeColor(object sender, EventArgs e)
    {
        var mc = sender as MenuCommand;
    
        switch (mc.CommandID.ID)
        {
            case ShortcutMenuCommand.cmdidRed:
                MyToolWindow.Background = Brushes.Red;
                break;
            case ShortcutMenuCommand.cmdidYellow:
                MyToolWindow.Background = Brushes.Yellow;
                break;
            case ShortcutMenuCommand.cmdidBlue:
                MyToolWindow.Background = Brushes.Blue;
                break;
        }
    }
    

    Dalam hal ini, hanya satu metode yang menangani peristiwa untuk semua item menu dengan mengidentifikasi CommandID dan mengatur warna latar belakang yang sesuai. Jika item menu berisi perintah yang tidak terkait, Anda akan membuat penanganan aktivitas terpisah untuk setiap perintah.

Menguji fitur jendela alat

  1. Bangun proyek dan mulai penelusuran kesalahan. Instans eksperimental muncul.

  2. Dalam instans eksperimental, klik Tampilkan / Windows Lain, lalu klik PintasanMenu. Melakukan ini akan menampilkan jendela alat Anda.

  3. Klik kanan di isi jendela alat. Menu pintasan yang memiliki daftar warna harus ditampilkan.

  4. Klik warna pada menu pintasan. Warna latar belakang jendela alat harus diubah ke warna yang dipilih.