Alt menüye en son kullanılan listeyi ekleme

Bu izlenecek yol, Menüye alt menü ekleme başlığı altında yer alan gösterimleri ve bir alt menüye dinamik listenin nasıl ekleneceğini gösterir. Dinamik liste, En Son Kullanılanlar (MRU) listesi oluşturmanın temelini oluşturur.

Dinamik menü listesi, menüde yer tutucuyla başlar. Menü her gösterildiğinde, Visual Studio tümleşik geliştirme ortamı (IDE) VSPackage'dan yer tutucuda gösterilmesi gereken tüm komutları ister. Dinamik liste, menünün herhangi bir yerinde yer alabilir. Ancak dinamik listeler genellikle alt menülerde veya menülerin alt kısımlarında kendi kendilerine depolanır ve görüntülenir. Bu tasarım desenlerini kullanarak, menüdeki diğer komutların konumunu etkilemeden genişletmek ve daraltmak için dinamik komut listesini etkinleştirirsiniz. Bu kılavuzda, dinamik MRU listesi var olan bir alt menünün alt kısmında, alt menünün geri kalanından bir satırla ayrılmış olarak görüntülenir.

Teknik olarak, dinamik liste bir araç çubuğuna da uygulanabilir. Ancak, kullanıcı bunu değiştirmek için belirli adımlar atmadığı sürece araç çubuğunun değişmeden kalması gerektiğinden bu kullanımı önerilmez.

Bu izlenecek yol, biri her seçildiğinde (seçilen öğe listenin en üstüne taşınır) sıralarını değiştiren dört öğeden oluşan bir MRU listesi oluşturur.

Menüler ve .vsct dosyaları hakkında daha fazla bilgi için bkz . Komutlar, menüler ve araç çubukları.

Önkoşullar

Bu kılavuzu izlemek için Visual Studio SDK'sını yüklemeniz gerekir. Daha fazla bilgi için bkz . Visual Studio SDK'sı.

Uzantı oluşturma

Dinamik öğe listesi oluştur komutu

  1. TestCommandPackage.vsct dosyasını açın.

  2. Symbols bölümünde guidTestCommandPackageCmdSet GuidSymbol adlı düğümde, grup ve komutu için MRUListGroup simgeyi cmdidMRUList aşağıdaki gibi ekleyin.

    <IDSymbol name="MRUListGroup" value="0x1200"/>
    <IDSymbol name="cmdidMRUList" value="0x0200"/>
    
  3. Groups bölümünde, bildirilen grubu var olan grup girdilerinden sonra ekleyin.

    <Group guid="guidTestCommandPackageCmdSet" id="MRUListGroup"
            priority="0x0100">
        <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/>
    </Group>
    
  4. Buttons bölümünde, var olan düğme girdilerinden sonra yeni bildirilen komutu temsil eden bir düğüm ekleyin.

    <Button guid="guidTestCommandPackageCmdSet" id="cmdidMRUList"
        type="Button" priority="0x0100">
        <Parent guid="guidTestCommandPackageCmdSet" id="MRUListGroup" />
        <CommandFlag>DynamicItemStart</CommandFlag>
        <Strings>
            <CommandName>cmdidMRUList</CommandName>
            <ButtonText>MRU Placeholder</ButtonText>
        </Strings>
    </Button>
    

    DynamicItemStart bayrağı komutun dinamik olarak oluşturulmasını sağlar.

  5. Yeni komutun görüntülenmesini test etmek için projeyi derleyin ve hata ayıklamayı başlatın.

    TestMenu menüsünde, yeni MRU Yer Tutucusu komutunu görüntülemek için yeni alt menü olan Alt Menü'ye tıklayın. Sonraki yordamda dinamik bir MRU komut listesi uygulandıktan sonra, alt menü her açıldığında bu komut etiketi bu listeyle değiştirilir.

MRU Listesini Doldurma

  1. TestCommandPackageGuids.cs dosyasında, sınıf tanımındaki mevcut komut kimliklerinin TestCommandPackageGuids arkasına aşağıdaki satırları ekleyin.

    public const string guidTestCommandPackageCmdSet = "00000000-0000-0000-0000-00000000"; // get the GUID from the .vsct file
    public const uint cmdidMRUList = 0x200;
    
  2. TestCommand.cs dosyasına aşağıdaki using deyimini ekleyin.

    using System.Collections;
    
  3. Son AddCommand çağrısından sonra TestCommand oluşturucusunda aşağıdaki kodu ekleyin. InitMRUMenu daha sonra tanımlanacak

    this.InitMRUMenu(commandService);
    
  4. TestCommand sınıfına aşağıdaki kodu ekleyin. Bu kod, MRU listesinde gösterilecek öğeleri temsil eden dizelerin listesini başlatır.

    private int numMRUItems = 4;
    private int baseMRUID = (int)TestCommandPackageGuids.cmdidMRUList;
    private ArrayList mruList;
    
    private void InitializeMRUList()
    {
        if (null == this.mruList)
        {
            this.mruList = new ArrayList();
            if (null != this.mruList)
            {
                for (int i = 0; i < this.numMRUItems; i++)
                {
                    this.mruList.Add(string.Format(CultureInfo.CurrentCulture,
                        "Item {0}", i + 1));
                }
            }
        }
    }
    
  5. yönteminden InitializeMRUList sonra yöntemini ekleyin InitMRUMenu . Bu, MRU liste menü komutlarını başlatır.

    private void InitMRUMenu(OleMenuCommandService mcs)
    {
        InitializeMRUList();
        for (int i = 0; i < this.numMRUItems; i++)
        {
            var cmdID = new CommandID(
                new Guid(TestCommandPackageGuids.guidTestCommandPackageCmdSet), this.baseMRUID + i);
            var mc = new OleMenuCommand(
                new EventHandler(OnMRUExec), cmdID);
            mc.BeforeQueryStatus += new EventHandler(OnMRUQueryStatus);
            mcs.AddCommand(mc);
        }
    }
    

    MRU listesindeki her olası öğe için bir menü komut nesnesi oluşturmanız gerekir. IDE, başka öğe kalmayıncaya kadar MRU listesindeki her öğe için yöntemini çağırır OnMRUQueryStatus . Yönetilen kodda, IDE'nin başka öğe olmadığını bilmesinin tek yolu, önce tüm olası öğeleri oluşturmaktır. İsterseniz, menü komutu oluşturulduktan sonra kullanarak mc.Visible = false; ek öğeleri ilk başta görünür değil olarak işaretleyebilirsiniz. Bu öğeler daha sonra yöntemi kullanılarak mc.Visible = true; OnMRUQueryStatus görünür hale getirilebilir.

  6. yönteminden InitMRUMenu sonra aşağıdaki OnMRUQueryStatus yöntemi ekleyin. Bu, her MRU öğesinin metnini ayarlayan işleyicidir.

    private void OnMRUQueryStatus(object sender, EventArgs e)
    {
        OleMenuCommand menuCommand = sender as OleMenuCommand;
        if (null != menuCommand)
        {
            int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID;
            if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count)
            {
                menuCommand.Text = this.mruList[MRUItemIndex] as string;
            }
        }
    }
    
  7. yönteminden OnMRUQueryStatus sonra aşağıdaki OnMRUExec yöntemi ekleyin. Bu, MRU öğesini seçme işleyicisidir. Bu yöntem, seçili öğeyi listenin en üstüne taşır ve seçili öğeyi bir ileti kutusunda görüntüler.

    private void OnMRUExec(object sender, EventArgs e)
    {
        var menuCommand = sender as OleMenuCommand;
        if (null != menuCommand)
        {
            int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID;
            if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count)
            {
                string selection = this.mruList[MRUItemIndex] as string;
                for (int i = MRUItemIndex; i > 0; i--)
                {
                    this.mruList[i] = this.mruList[i - 1];
                }
                this.mruList[0] = selection;
                System.Windows.Forms.MessageBox.Show(
                    string.Format(CultureInfo.CurrentCulture,
                                  "Selected {0}", selection));
            }
        }
    }
    

MRU listesini test etme

  1. Projeyi derleyin ve hata ayıklamaya başlayın.

  2. TestMenu menüsünde Test Komutunu Çağır'a tıklayın. Bunu yaptığınızda, komutun seçili olduğunu belirten bir ileti kutusu görüntülenir.

    Dekont

    Bu adım, VSPackage'ı MRU listesini yüklemeye ve doğru şekilde görüntülemeye zorlamak için gereklidir. Bu adımı atlarsanız MRU listesi görüntülenmez.

  3. Test Menüsü menüsünde Alt Menü'ye tıklayın. Alt menünün sonunda, ayırıcının altında dört öğeden oluşan bir liste görüntülenir. Öğe 3'e tıkladığınızda, bir ileti kutusu görünmelidir ve Seçili Öğe 3 metnini görüntülemelidir. (Dört öğenin listesi görüntülenmiyorsa, önceki adımda yer alan yönergeleri izlediğinize emin olun.)

  4. Alt menüyü yeniden açın. Öğe 3'ün artık listenin en üstünde olduğuna ve diğer öğelerin bir konum aşağı gönderildiğine dikkat edin. Öğe 3'e yeniden tıklayın ve ileti kutusunda hala Seçili Öğe 3'in görüntülendiğine dikkat edin. Bu, metnin komut etiketiyle birlikte yeni konuma doğru şekilde taşındığını gösterir.