Özellikler, Görev Listesi, Çıktı ve Seçenekler pencerelerini genişletme

Visual Studio'da herhangi bir araç penceresine erişebilirsiniz. Bu kılavuzda, araç pencerenizle ilgili bilgilerin yeni seçenekler sayfasıyla, Özellikler sayfasında yeni bir ayarla nasıl tümleştirilip Görev Listesi ve Çıktı pencerelerine nasıl yazacakları gösterilmektedir.

Araç penceresiyle uzantı oluşturma

  1. VSIX şablonunu kullanarak TodoList adlı bir proje oluşturun ve TodoWindow adlı özel bir araç penceresi öğesi şablonu ekleyin.

    Dekont

    Araç penceresiyle uzantı oluşturma hakkında daha fazla bilgi için bkz . Araç penceresiyle uzantı oluşturma.

Araç penceresini ayarlama

Yeni bir ToDo öğesinin yazıldığı bir TextBox, listeye yeni öğeyi eklemek için bir Düğme ve listedeki öğeleri görüntülemek için bir ListBox ekleyin.

  1. TodoWindow.xaml dosyasında Button, TextBox ve StackPanel denetimlerini UserControl'den silin.

    Dekont

    Bu işlem, sonraki bir adımda yeniden kullanacağınız button1_Click olay işleyicisini silmez.

  2. Araç Kutusu'nun Tüm WPF Denetimleri bölümünden tuval denetimini kılavuza sürükleyin.

  3. TextBox, Düğme ve ListBox'ı Tuval'e sürükleyin. Öğeleri TextBox ve Düğme'nin aynı düzeyde olacak şekilde düzenleyin ve ListBox, aşağıdaki resimde olduğu gibi, bunların altındaki pencerenin kalan kısmını doldurur.

    Finished Tool Window

  4. XAML bölmesinde Düğme'yi bulun ve content özelliğini Ekle olarak ayarlayın. Bir öznitelik ekleyerek Click="button1_Click" düğme olay işleyicisini Düğme denetimine yeniden bağlayın. Tuval bloğu şöyle görünmelidir:

    <Canvas HorizontalAlignment="Left" Width="306">
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="208"/>
            <Button x:Name="button" Content="Add" HorizontalAlignment="Left" Margin="236,13,0,0" VerticalAlignment="Top" Width="48" Click="button1_Click"/>
            <ListBox x:Name="listBox" HorizontalAlignment="Left" Height="222" Margin="10,56,0,0" VerticalAlignment="Top" Width="274"/>
    </Canvas>
    

Oluşturucuyu özelleştirme

  1. TodoWindowControl.xaml.cs dosyasına aşağıdaki using yönergesini ekleyin:

    using System;
    
  2. TodoWindow'a genel başvuru ekleyin ve TodoWindowControl oluşturucusunun bir TodoWindow parametresi almasını sağlayın. Kod şu şekilde görünmelidir:

    public TodoWindow parent;
    
    public TodoWindowControl(TodoWindow window)
    {
        InitializeComponent();
        parent = window;
    }
    
  3. TodoWindow.cs'de, TodoWindowControl oluşturucuyu TodoWindow parametresini içerecek şekilde değiştirin. Kod şu şekilde görünmelidir:

    public TodoWindow() : base(null)
    {
        this.Caption = "TodoWindow";
        this.BitmapResourceID = 301;
        this.BitmapIndex = 1;
    
         this.Content = new TodoWindowControl(this);
    }
    

Seçenekler sayfası oluşturma

Kullanıcıların araç penceresinin ayarlarını değiştirebilmesi için Seçenekler iletişim kutusunda bir sayfa sağlayabilirsiniz. Seçenekler sayfası oluşturmak için hem seçenekleri açıklayan bir sınıf hem de TodoListPackage.cs veya TodoListPackage.vb dosyasındaki bir giriş gerekir.

  1. adlı ToolsOptions.csbir sınıf ekleyin. sınıfını ToolsOptions öğesinden DialogPagedevralın.

    class ToolsOptions : DialogPage
    {
    }
    
  2. Aşağıdaki using yönergesini ekleyin:

    using Microsoft.VisualStudio.Shell;
    
  3. Bu kılavuzdaki Seçenekler sayfası DaysAhead adlı tek bir seçenek sağlar. sınıfına daysAhead adlı özel bir alan ve DaysAhead ToolsOptions adlı bir özellik ekleyin:

    private double daysAhead;
    
    public double DaysAhead
    {
        get { return daysAhead; }
        set { daysAhead = value; }
    }
    

    Şimdi projeyi bu Seçenekler sayfasından haberdar etmeniz gerekir.

Seçenekler sayfasını kullanıcıların kullanımına açma

  1. TodoWindowPackage.cs dosyasında sınıfına TodoWindowPackage bir ProvideOptionPageAttribute ekleyin:

    [ProvideOptionPage(typeof(ToolsOptions), "ToDo", "General", 101, 106, true)]
    
  2. ProvideOptionPage oluşturucusunun ilk parametresi, daha önce oluşturduğunuz sınıfının ToolsOptionstürüdür. İkinci parametre olan "ToDo", Seçenekler iletişim kutusundaki kategorinin adıdır. Üçüncü parametre olan "Genel", Seçenekler sayfasının kullanılabileceği Seçenekler iletişim kutusunun alt kategorisinin adıdır. Sonraki iki parametre, dizeler için kaynak kimlikleridir; birincisi kategorinin adı, ikincisi ise alt kategorinin adıdır. Son parametre, bu sayfaya otomasyon kullanılarak erişilip erişilemeyeceğini belirler.

    Bir kullanıcı Seçenekler sayfanızı açtığında aşağıdaki resme benzemelidir.

    Options Page

    ToDo kategorisine ve genel alt kategorisine dikkat edin.

Verileri Özellikler penceresi kullanılabilir hale getirme

ToDo listesindeki tek tek öğelerle ilgili bilgileri depolayan adlı TodoItem bir sınıf oluşturarak ToDo listesi bilgilerini kullanılabilir hale getirebilirsiniz.

  1. adlı TodoItem.csbir sınıf ekleyin.

    Araç penceresi kullanıcılar tarafından kullanılabilir olduğunda, ListBox içindeki öğeler TodoItems tarafından temsil edilir. Kullanıcı ListBox'ta bu öğelerden birini seçtiğinde, Özellikler penceresinde öğe hakkındaki bilgiler görüntülenir.

    Verileri Özellikler penceresinde kullanılabilir hale getirmek için, verileri ve olmak üzere iki özel özniteliği Description Categoryolan ortak özelliklere dönüştürürsunuz. Description, Özellikler penceresinin en altında görüntülenen metindir. CategoryÖzellikler penceresi Kategorilere Ayrılmış görünümde görüntülendiğinde özelliğin nerede görüneceğini belirler. Aşağıdaki resimde, Özellikler penceresi Kategorilere Ayrılmış görünümdedir, Yapılacaklar Alanları kategorisindeki Name özelliği seçilidir ve pencerenin en altında Name özelliğinin açıklaması görüntülenir.

    Properties Window

  2. TodoItem.cs dosyasını kullanarak aşağıdaki yönergeleri ekleyin.

    using System.ComponentModel;
    using System.Windows.Forms;
    using Microsoft.VisualStudio.Shell.Interop;
    
  3. Sınıf bildirimine public erişim değiştiricisini ekleyin.

    public class TodoItem
    {
    }
    

    ve iki özelliğini Name DueDateekleyin. Ve sonrasını UpdateList() CheckForErrors() yaparız.

    public class TodoItem
    {
        private TodoWindowControl parent;
        private string name;
        [Description("Name of the ToDo item")]
        [Category("ToDo Fields")]
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                parent.UpdateList(this);
            }
        }
    
        private DateTime dueDate;
        [Description("Due date of the ToDo item")]
        [Category("ToDo Fields")]
        public DateTime DueDate
        {
            get { return dueDate; }
            set
            {
                dueDate = value;
                parent.UpdateList(this);
                parent.CheckForErrors();
            }
        }
    }
    
  4. Kullanıcı denetimine özel başvuru ekleyin. Kullanıcı denetimini ve bu ToDo öğesinin adını alan bir oluşturucu ekleyin. değerini bulmak için daysAheadSeçenekler sayfası özelliğini alır.

    private TodoWindowControl parent;
    
    public TodoItem(TodoWindowControl control, string itemName)
    {
        parent = control;
        name = itemName;
        dueDate = DateTime.Now;
    
        double daysAhead = 0;
        IVsPackage package = parent.parent.Package as IVsPackage;
        if (package != null)
        {
            object obj;
            package.GetAutomationObject("ToDo.General", out obj);
    
            ToolsOptions options = obj as ToolsOptions;
            if (options != null)
            {
                daysAhead = options.DaysAhead;
            }
        }
    
        dueDate = dueDate.AddDays(daysAhead);
    }
    
  5. Sınıfın TodoItem örnekleri ListBox'ta depolanacağından ve ListBox işlevi çağıracağından ToString , işlevi aşırı yüklemeniz ToString gerekir. Aşağıdaki kodu TodoItem.cs dosyasına oluşturucudan sonra ve sınıfın sonundan önce ekleyin.

    public override string ToString()
    {
        return name + " Due: " + dueDate.ToShortDateString();
    }
    
  6. TodoWindowControl.xaml.cs dosyasında ve UpdateList yöntemleri için sınıfına CheckForError TodoWindowControl saplama yöntemleri ekleyin. Bunları ProcessDialogChar'ın arkasına ve dosyanın sonuna yerleştirin.

    public void CheckForErrors()
    {
    }
    public void UpdateList(TodoItem item)
    {
    }
    

    CheckForError yöntemi, üst nesnede aynı ada sahip bir yöntemi çağırır ve bu yöntem herhangi bir hata oluşup oluşmadığını denetler ve bunları doğru şekilde işler. UpdateList yöntemi üst denetimde ListBox'ı güncelleştirir; bu sınıftaki ve DueDate özellikleri değiştiğinde yöntemi çağrılırName. Bunlar daha sonra uygulanacaktır.

Özellikler penceresi tümleştirme

Şimdi, Özellikler penceresine bağlanacak ListBox'ı yöneten kodu yazın.

TextBox'ı okumak, bir TodoItem oluşturmak ve ListBox'a eklemek için düğme tıklama işleyicisini değiştirmeniz gerekir.

  1. Mevcut button1_Click işlevi yeni bir TodoItem oluşturan ve ListBox'a ekleyen kodla değiştirin. daha sonra tanımlanacak olan öğesini çağırır TrackSelection().

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        if (textBox.Text.Length > 0)
        {
            var item = new TodoItem(this, textBox.Text);
            listBox.Items.Add(item);
            TrackSelection();
            CheckForErrors();
        }
    }
    
  2. Tasarım görünümünde ListBox denetimini seçin. Özellikler penceresinde Olay işleyicileri düğmesine tıklayın ve SelectionChanged olayını bulun. Metin kutusunu listBox_SelectionChanged ile doldurun. Bunu yaptığınızda SelectionChanged işleyicisi için saplama eklenir ve olayına atanır.

  3. TrackSelection() yöntemini uygulayın. Hizmetleri almanız SVsUIShellSTrackSelection gerekeceğinden, öğesini TodoWindowControl tarafından erişilebilir hale getirmeniz GetService gerekir. TodoWindow sınıfına aşağıdaki yöntemi ekleyin:

    internal object GetVsService(Type service)
    {
        return GetService(service);
    }
    
  4. TodoWindowControl.xaml.cs dosyasına aşağıdaki using yönergelerini ekleyin:

    using System.Runtime.InteropServices;
    using Microsoft.VisualStudio.Shell.Interop;
    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    
  5. SelectionChanged işleyicisini aşağıdaki gibi doldurun:

    private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        TrackSelection();
    }
    
  6. Şimdi, Özellikler penceresiyle tümleştirme sağlayacak TrackSelection işlevini doldurun. Kullanıcı ListBox'a bir öğe eklediğinde veya ListBox'taki bir öğeye tıkladığında bu işlev çağrılır. ListBox içeriğini bir SelectionContainer'a ekler ve SelectionContainer'ı Özellikler penceresinin OnSelectChange olay işleyicisine geçirir. TrackSelection hizmeti, kullanıcı arabiriminde (UI) seçili nesneleri izler ve özelliklerini görüntüler

    private SelectionContainer mySelContainer;
    private System.Collections.ArrayList mySelItems;
    private IVsWindowFrame frame = null;
    
    private void TrackSelection()
    {
        if (frame == null)
        {
            var shell = parent.GetVsService(typeof(SVsUIShell)) as IVsUIShell;
            if (shell != null)
            {
                var guidPropertyBrowser = new
                Guid(ToolWindowGuids.PropertyBrowser);
                shell.FindToolWindow((uint)__VSFINDTOOLWIN.FTW_fForceCreate,
                ref guidPropertyBrowser, out frame);
            }
        }
        if (frame != null)
            {
                frame.Show();
            }
        if (mySelContainer == null)
        {
            mySelContainer = new SelectionContainer();
        }
    
        mySelItems = new System.Collections.ArrayList();
    
        var selected = listBox.SelectedItem as TodoItem;
        if (selected != null)
        {
            mySelItems.Add(selected);
        }
    
        mySelContainer.SelectedObjects = mySelItems;
    
        ITrackSelection track = parent.GetVsService(typeof(STrackSelection))
                                as ITrackSelection;
        if (track != null)
        {
            track.OnSelectChange(mySelContainer);
        }
    }
    

    Özellikler penceresinin kullanabileceği bir sınıfınız olduğuna göre, Özellikler penceresini araç penceresiyle tümleştirebilirsiniz. Kullanıcı araç penceresindeki ListBox'ta bir öğeye tıkladığında, Özellikler penceresi uygun şekilde güncelleştirilmelidir. Benzer şekilde, kullanıcı Özellikler penceresinde bir ToDo öğesini değiştirdiğinde, ilişkili öğe güncelleştirilmelidir.

  7. Şimdi, UpdateList işlev kodunun geri kalanını TodoWindowControl.xaml.cs dosyasına ekleyin. Değiştirilen TodoItem'i ListBox'tan bırakmalı ve yeniden eklemelidir.

    public void UpdateList(TodoItem item)
    {
        var index = listBox.SelectedIndex;
        listBox.Items.RemoveAt(index);
        listBox.Items.Insert(index, item);
        listBox.SelectedItem = index;
    }
    
  8. Kodunuzu test edin. Projeyi derleyin ve hata ayıklamaya başlayın. Deneysel örnek görünmelidir.

  9. Araçlar>Seçenekleri sayfasını açın. Sol bölmede ToDo kategorisini görmeniz gerekir. Kategoriler alfabetik olarak listelendiği için T'lerin altına bakın.

  10. Todo seçenekleri sayfasında, özelliğinin DaysAhead 0 olarak ayarlandığını görmeniz gerekir. 2 olarak değiştirin.

  11. Görünüm / Diğer Windows menüsünde TodoWindow'ı açın. Metin kutusuna EndDate yazın ve Ekle'ye tıklayın.

  12. Liste kutusunda, bugünden iki gün sonra bir tarih görmeniz gerekir.

Çıktı penceresine metin ve Görev Listesi'ne öğe ekleme

Görev Listesi için, Görev türünde yeni bir nesne oluşturur ve ardından yöntemini çağırarak Add bu Görev nesnesini Görev Listesine eklersiniz. Çıkış penceresine yazmak için, bir bölme nesnesi almak için yöntemini GetPane çağırırsınız ve ardından bölme nesnesinin yöntemini çağırırsınızOutputString.

  1. TodoWindowControl.xaml.cs dosyasındaki yönteminde button1_Click Çıkış penceresinin Genel bölmesini (varsayılandır) almak için kod ekleyin ve buna yazın. Yöntem şöyle görünmelidir:

    private void button1_Click(object sender, EventArgs e)
    {
        if (textBox.Text.Length > 0)
        {
            var item = new TodoItem(this, textBox.Text);
            listBox.Items.Add(item);
    
            var outputWindow = parent.GetVsService(
                typeof(SVsOutputWindow)) as IVsOutputWindow;
            IVsOutputWindowPane pane;
            Guid guidGeneralPane = VSConstants.GUID_OutWindowGeneralPane;
            outputWindow.GetPane(ref guidGeneralPane, out pane);
            if (pane != null)
            {
                 pane.OutputString(string.Format(
                    "To Do item created: {0}\r\n",
                 item.ToString()));
        }
            TrackSelection();
            CheckForErrors();
        }
    }
    
  2. Görev Listesi'ne öğe eklemek için TodoWindowControl sınıfına iç içe bir sınıf eklemeniz gerekir. İç içe geçmiş sınıfın öğesinden TaskProvidertüretilmesi gerekir. Sınıfın sonuna TodoWindowControl aşağıdaki kodu ekleyin.

    [Guid("72de1eAD-a00c-4f57-bff7-57edb162d0be")]
    public class TodoWindowTaskProvider : TaskProvider
    {
        public TodoWindowTaskProvider(IServiceProvider sp)
            : base(sp)
        {
        }
    }
    
  3. Ardından sınıfına TodoTaskProvider özel başvuru ve CreateProvider() yöntemi TodoWindowControl ekleyin. Kod şu şekilde görünmelidir:

    private TodoWindowTaskProvider taskProvider;
    private void CreateProvider()
    {
        if (taskProvider == null)
        {
            taskProvider = new TodoWindowTaskProvider(parent);
            taskProvider.ProviderName = "To Do";
        }
    }
    
  4. Görev Listesi'ni temizleyen ve ReportError()sınıfa Görev Listesi'ne TodoWindowControl bir girdi ekleyen öğesini ekleyinClearError().

    private void ClearError()
    {
        CreateProvider();
        taskProvider.Tasks.Clear();
    }
    private void ReportError(string p)
    {
        CreateProvider();
        var errorTask = new Task();
        errorTask.CanDelete = false;
        errorTask.Category = TaskCategory.Comments;
        errorTask.Text = p;
    
        taskProvider.Tasks.Add(errorTask);
    
        taskProvider.Show();
    
        var taskList = parent.GetVsService(typeof(SVsTaskList))
            as IVsTaskList2;
        if (taskList == null)
        {
            return;
        }
    
        var guidProvider = typeof(TodoWindowTaskProvider).GUID;
         taskList.SetActiveProvider(ref guidProvider);
    }
    
  5. Şimdi yöntemini aşağıdaki gibi uygulayın CheckForErrors .

    public void CheckForErrors()
    {
        foreach (TodoItem item in listBox.Items)
        {
            if (item.DueDate < DateTime.Now)
            {
                ReportError("To Do Item is out of date: "
                    + item.ToString());
            }
        }
    }
    

Deneyin

  1. Projeyi derleyin ve hata ayıklamaya başlayın. Deneysel örnek görüntülenir.

  2. TodoWindow'ı açın (Diğer Windows TodoWindow'ları> Görüntüle).>

  3. Metin kutusuna bir şey yazın ve Ekle'ye tıklayın.

    Liste kutusuna bugünden 2 gün sonra bir son tarih eklenir. Hata oluşturulmaz ve Görev Listesi'nde (Görev Listesini Görüntüle>) hiçbir girdi olmamalıdır.

  4. Şimdi Araçlar>Seçenekler>ToDo sayfasındaki ayarı 2'den 0'a geri değiştirin.

  5. TodoWindow'a başka bir şey yazın ve yeniden Ekle'ye tıklayın. Bu, hem bir hatayı hem de Görev Listesi'nde bir girdiyi tetikler.

    Öğeleri eklerken, başlangıç tarihi artık artı 2 gün olarak ayarlanır.

  6. Görünüm menüsünde Çıkış'a tıklayarak Çıkış penceresini açın.

    Her öğe eklediğinizde Görev Listesi bölmesinde bir ileti görüntülendiğine dikkat edin.

  7. ListBox'taki öğelerden birine tıklayın.

    Özellikler penceresinde öğenin iki özelliği görüntülenir.

  8. Özelliklerden birini değiştirin ve Enter tuşuna basın.

    Öğe ListBox'ta güncelleştirilir.