共用方式為


逐步解說: 擴充的工具視窗 (第 3 部,共 4)

在這個逐步解說中,您加入的工具視窗,您在逐步解說: 建立工具視窗 (第 2 部,共 4)。 您可以新增按鈕,以顯示開啟的檔案 ,因此您可以選取要在媒體播放機播放的檔案] 對話方塊。

這個逐步解說會示範如何將動態的可見性加入至功能表命令。

這個逐步解說會說明如何擴充 Visual Studio 的整合式的開發環境 (IDE) 的一系列的其中一個。 如需詳細資訊,請參閱 使用 VSPackages 自訂 Visual Studio 的逐步解說

功能表命令加入動態的可見性

根據預設,功能表命令所修正位置,而無法被隱藏之後就會顯示。 不過,在這個逐步解說的設計是封裝要決定在執行階段是否應該可以看見命令,根據 [媒體播放程式] 工具視窗是否作用中。

首先,您必須修改 FirstToolWin.vsct,若要啟用動態的可見性],然後實作程式碼中設定可見性的邏輯。 您建立類別來保存工具視窗事件,然後修改封裝,讓功能表命令物件的存取,並一起繫結它們。

若要啟用動態的可見性

  1. 開啟"FirstToolWin"的專案,您在逐步解說: 建立工具視窗 (第 2 部,共 4)

  2. 方案總管] 中,開啟 FirstToolWin.vsct。

  3. 找出<Button>項目具有識別碼、 cmdidWindowsMedia。 介於<icon>定義和<Strings>區段中,新增兩個命令,旗標,如下所示。

    <CommandFlag>DefaultInvisible</CommandFlag>
    <CommandFlag>DynamicVisibility</CommandFlag>
    
  4. 儲存檔案。

若要建立工具視窗事件

  1. 方案總管] 中,請以滑鼠右鍵按一下專案名稱,指向 新增,然後按一下 類別

  2. 加入新項目 對話方塊中,為檔案命名 ToolWindowEvents.cs 或 ToolWindowEvents.vb ,然後按一下 [ 新增

  3. 開啟 ToolWindowEvents.cs 或 ToolWindowEvents.vb,然後加入下列程式碼後任何現有的using或Imports陳述式。

    Imports System
    Imports System.Collections.Generic
    Imports System.Linq
    Imports System.Text
    Imports Microsoft.VisualStudio.Shell.Interop
    Imports System.ComponentModel.Design
    Imports System.Security.Permissions
    
    using Microsoft.VisualStudio.Shell.Interop;
    using System.ComponentModel.Design;
    using System.Security.Permissions;
    
  4. 變更類別宣告,使其public和sealed,(Public和NotInheritable Visual Basic 中) 和繼承自IVsWindowFrameNotify3介面,如下所示。

    Public NotInheritable Class ToolWindowEvents
        Implements IVsWindowFrameNotify3
    
    public sealed class ToolWindowEvents : IVsWindowFrameNotify3
    
  5. 如果您使用的 C#,IVsWindowFrameNotify3 上按一下滑鼠右鍵,指到實作介面,然後按一下 [ 實作介面自動加入所需的介面的方法。

    如果您使用的 「 Visual Basic 」,略過此步驟。

  6. 實作OnShow方法,如下所示。

    Public Function OnShow(ByVal fShow As Integer) As Integer Implements VisualStudio.Shell.Interop.IVsWindowFrameNotify3.OnShow
        If Not fShow = __FRAMESHOW.FRAMESHOW_WinHidden Then
            package.toolMenuItem1.visible = True 
        End If 
        Return Microsoft.VisualStudio.VSConstants.S_OK
    End Function
    
    [PrincipalPermission(SecurityAction.Demand)]
    public int OnShow(int fShow)
    {
        package.toolMenuItem1.Visible
            = ((__FRAMESHOW)fShow
            != __FRAMESHOW.FRAMESHOW_WinHidden);
        return Microsoft.VisualStudio.VSConstants.S_OK;
    }
    
  7. 填滿剩餘的內容中IVsWindowFrameNotify3介面成員,使用下列的 return 陳述式。

    Return Microsoft.VisualStudio.VSConstants.S_OK
    
    return Microsoft.VisualStudio.VSConstants.S_OK;
    

    警告

    在 C# 介面成員會填入throw陳述式,您必須覆寫。在 Visual Basic 函式將空的。

    加入的程式碼會宣告一個類別,都會有一個工具視窗的事件。 用在這裡,事件是的 OnShow 的功能表指令的可見性設有根據傳入事件時的值。 傳入的值是列舉型別之型別的__FRAMESHOW。 雖然這個列舉型別有數種可能的值,如此一來,您必須測試它是否等於FRAMESHOW_WinHidden。 如果不相等,請設定看得見,設為 true。 如果是相等的然後看得見設為 false。

    不過,請注意這段程式碼會使用變數名稱為 「 套件 」。 該變數傳入建構函式。

  8. 將下列程式碼加入至類別,該區域上方的頁首, IVsWindowFrameNotify3所定義的介面成員。

    Private package As FirstToolWinPackage
    Public Sub New(ByVal apackage As FirstToolWinPackage)
        package = apackage
    End Sub
    
    private FirstToolWinPackage package;
    public ToolWindowEvents(FirstToolWinPackage apackage)
    {
        package = apackage;
    }
    

    傳遞至這個建構函式的值是封裝本身,FirstToolWin 執行個體。 在 OnShow 事件中,您必須存取功能表命令。 根據預設,這個功能表命令會是本機範圍內的變數,封裝的 Initialize 方法中。

  9. 儲存檔案。

若要存取的功能表指令

  1. 方案總管] 中,開啟 FirstToolWinPackage.cs 或 FirstToolWinPackage.vb,以便您可以修改 FirstToolWin 類別,讓功能表命令物件的存取。

  2. 宣告MenuCommand物件,代表您的功能表命令類別的頂端。

    Public toolMenuItem1 As MenuCommand
    
    public MenuCommand toolMenuItem1;
    
  3. 捲動至初始化方法。 找出下列兩行,建立第一個命令。

    Dim menuItem As New MenuCommand(New EventHandler(AddressOf MenuItemCallback), menuCommandID)
    mcs.AddCommand(menuItem)
    
    MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID);
    mcs.AddCommand(menuItem);
    
  4. 取代預設的MenuCommand使用稍早所宣告的公用變數的物件。

    Dim toolMenuItem1 As New MenuCommand(New EventHandler(AddressOf MenuItemCallback), menuCommandID)
    mcs.AddCommand(toolMenuItem1)
    
    toolMenuItem1 = new MenuCommand(MenuItemCallback, menuCommandID);
    mcs.AddCommand(toolMenuItem1);                
    
  5. 儲存檔案。

接下來,您將建立的工具視窗執行個體,也要接收事件的新建立類別的執行個體。 然後您可以附加工具視窗執行個體的類別執行個體。

若要將附加事件

  1. 方案總管] 中,開啟 MyToolWindow.cs 或 MyToolWindow.vb。 在類別定義中的右大括號之前的檔案結尾處加入下列程式碼來覆寫 OnToolWindowCreated 方法。

    Public Overrides Sub OnToolWindowCreated()
        MyBase.OnToolWindowCreated()
    
        Dim handler As FirstToolWinPackage = CType( _
            Me.Package, FirstToolWinPackage)
        CType(Me.Frame, IVsWindowFrame).SetProperty( _
            CInt(__VSFPROPID.VSFPROPID_ViewHelper), handler)
    End Sub
    
    public override void OnToolWindowCreated()
    {
        base.OnToolWindowCreated();
    
        var handler = new ToolWindowEvents(
            (FirstToolWinPackage)this.Package);
        ((IVsWindowFrame)this.Frame).SetProperty(
            (int)__VSFPROPID.VSFPROPID_ViewHelper, handler);
    }
    

    這段程式碼會建立先前加入的類別的新執行個體。 接著它會加入執行個體框架的屬性,讓該執行個體可以接收事件。 這樣的 SetProperty 方法優勢時,列舉值VSFPROPID_ViewHelper的第一個參數,而第二個參數的新處理常式執行個體。

  2. 儲存檔案。

若要測試的程式碼

  1. 按 F5 以編譯專案,並在 Visual Studio 的實驗組建執行它。

  2. 按一下 [工具] 功能表。

    WindowsMedia 不應顯示功能表指令。

  3. 檢視 功能表上指向 其他視窗 ,然後按一下 Windows Media Player 以顯示 [媒體播放程式視窗。

  4. 按一下 [ 工具功能表一次。

    現在, WindowsMedia 應該會出現功能表命令,因為它有動態的可見性。 也就是是否看得見為基礎的媒體播放程式] 視窗是否可見。

  5. 關閉 [媒體播放程式] 視窗,然後再檢查工具功能表一次。

    現在, WindowsMedia 不應顯示功能表指令。

  6. 關閉實驗性質的組建。

加入 Windows Form 的程式碼與工具視窗互動

現在,加入至功能表命令的回應封裝類別的程式碼。 這段程式碼便會開啟開啟的檔案 ] 對話方塊,接著再呼叫新的 LoadFile 方法,才能載入媒體的播放程式中的檔案。

若要啟動的程式碼中的 [工具] 視窗

  1. 開啟 [FirstToolWinPackage.cs]。

  2. 新增System.Windows.Forms後將現有的命名空間使用陳述式,如下所示。

    Imports System.Windows.Forms
    
    using System.Windows.Forms;
    
  3. 找出MenuItemCallback功能表處理常式。 這是在功能表指令的 click 事件處理常式。 藉由使用下列程式碼來取代此功能表處理常式的主體。

    Dim openFileDialog As System.Windows.Forms.OpenFileDialog = New System.Windows.Forms.OpenFileDialog()
    Dim result As DialogResult = openFileDialog.ShowDialog()
    If (result = DialogResult.OK) Then 
        Dim window As MyToolWindow = TryCast(Me.FindToolWindow(GetType(MyToolWindow), 0, True), MyToolWindow)
        If (window IsNot Nothing) Then
            window.LoadFile(openFileDialog.FileName)
        End If 
    End If
    
    System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog();
    DialogResult result = openFileDialog.ShowDialog();
    if (result == DialogResult.OK)
    {
        MyToolWindow window = (MyToolWindow)(this.FindToolWindow(
            typeof(MyToolWindow), 0, true));
        if (window != null)
        {
            window.LoadFile(openFileDialog.FileName);
        }
    }
    
  4. 儲存您的工作。

這段程式碼便會開啟開啟的檔案 ,讓您可以瀏覽至您想要載入媒體的播放程式中的媒體檔案] 對話方塊。 然後它會找出 MyToolWindow 的執行個體,並會呼叫 LoadFile 方法,您會建立先前載入的媒體檔案。

若要測試的程式碼

  1. 按 F5 以編譯專案,並在實驗 Visual Studio 的執行個體中執行。

  2. 工具 ] 功能表中,按一下 WindowsMedia

    開啟的檔案應該會出現對話方塊。

  3. 開啟的檔案 ] 對話方塊,選取有效的媒體檔,然後按一下 確定

    檔案應該播放的媒體播放程式。

  4. 關閉實驗性的執行個體。

下一步

本逐步解說會示範如何加入功能表命令具有動態的可視性。 它也會示範如何將控制項加入至 [工具] 視窗中的其他控制項進行互動的工具視窗。 這些概念的一般套用於工具視窗。 密切加入工具視窗的控制項就像您在 Windows Form 應用程式將使用使用者控制項。

在下一個逐步解說中, 逐步解說: 將整合至 [屬性] 視窗、 工作清單,輸出] 視窗中及選項] 對話方塊 (步驟 4 之 4),您可以學習到如何將您的工具視窗,加上現有的工具視窗,在 Visual Studio,例如屬性 ] 視窗中, 輸出 ] 視窗中,以及工作清單視窗。

請參閱

其他資源

擴充 Visual Studio 的概觀