2013-03-21 43 views
12

Tôi đang tạo một gói Visual Studio (đây là lần đầu tiên của tôi) và mục tiêu cuối cùng của tôi là tạo một mục menu ngữ cảnh cho trình thám hiểm giải pháp mà chỉ hoạt động trên một số loại tệp nhất định. (Tôi nghĩ rằng đây sẽ là một điều phổ biến, nhưng không tìm thấy bất kỳ hướng dẫn phong nha về nó, vì vậy nếu bạn biết bất kỳ xin vui lòng cho tôi biết)Visual Studio Package: Cài đặt chế độ hiển thị của một mục trình đơn ngữ cảnh Solution Explorer tùy chỉnh

Tôi theo một hướng dẫn MSDN đơn giản để tạo một mục trong thanh công cụ đầu tiên (Tôi quên đâu là liên kết nó) và điều này làm việc tốt.

Sau đó, tôi tìm thấy một cách để di chuyển nó vào menu ngữ cảnh của Solution Explorer. Điều này đạt được bằng cách thao tác các tập tin .vsct và có một yếu tố như thế này:

<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/> 

Điều đó có lẽ không quan trọng, nhưng tôi đang cố gắng để thiết lập các cảnh.

Bây giờ, vì tôi chỉ muốn hiển thị mục cho một số loại tệp nhất định, tôi cần tìm cách kiểm tra tệp khi nhấn nút chuột phải. Cắt một tìm kiếm dài ngắn, tôi found this và kết thúc với đoạn mã sau:

protected override void Initialize() 
{ 
    //stuff 
    OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService; 
    menuItem.BeforeQueryStatus += menuItem_BeforeQueryStatus; 
    //more stuff 
} 

void menuItem_BeforeQueryStatus(object sender, EventArgs e) 
{ 
    var myCommand = sender as OleMenuCommand; 
    myCommand.Text = "NEW NAME"; 
} 

Trong ví dụ trên tôi chỉ cố gắng để thiết lập các văn bản để thử và chứng minh nó hoạt động, tôi biết có một tài sản Visible nhưng Tôi muốn bước này để làm việc đầu tiên. Sự kiện BeforeQueryStatus được kích hoạt và gỡ lỗi cho thấy việc thực thi mã như mong đợi. Tuy nhiên, không có thay đổi trong mục trình đơn ngữ cảnh, nó vẫn giữ nguyên với văn bản gốc.

Tôi thiếu gì ở đây? Tại sao nó không cập nhật?

Trả lời

20

OK, vì vậy tôi cuối cùng đã tìm thấy một giải pháp cho vấn đề này, có một vài điều mà bạn cần phải làm ...

Bước 1:

Chúng ta cần phải xác định rằng VSPackage nên "tự động tải", chúng tôi làm điều này để mã sẽ thực thi khi ContextMenu được hiển thị, vì thông thường VSPackage sẽ không khởi tạo trước khi giao diện người dùng được hiển thị (tức là mục menu đã được nhấp). Để thực hiện điều này, chúng tôi thêm một thuộc tính cho lớp trọn gói, như vậy:

[ProvideAutoLoad("{f1536ef8-92ec-443c-9ed7-fdadf150da82}")] 
public sealed class MyFirstPackage : Package 

Bạn có thể tự hỏi những gì mà giá trị GUID là, cũng trong trường hợp này nó đại diện cho UICONTEXT_SolutionExists liên tục, có nghĩa là các gói sẽ tự động tải khi một giải pháp tồn tại (vì vậy khi chúng ta tạo một giải pháp mới hoặc tải một giải pháp). I got this information from here, như bạn có thể nói có một number of different VSConstants có thể được sử dụng.

Dưới đây là một số tài nguyên khác mà liệt kê các giá trị GUID khác có thể được sử dụng:

BƯỚC 2:

Bây giờ BeforeQueryStatus mã đang thực thi tại vị trí chính xác, nó vẫn còn bị nhầm lẫn ing là tại sao mã không thực sự thay đổi bất cứ điều gì (trong câu hỏi của tôi, tôi cố gắng thay đổi Text).Vâng, câu trả lời là, bởi vì chúng tôi cần phải cho phép gói để làm như vậy (ít nhất đó là cách tôi nhìn thấy nó như là).

Để thực hiện việc này, chúng tôi phải chỉnh sửa tệp .vsct. Bên trong chúng ta có thể tìm thấy một phần tử Buttons, bên trong đó là ContextMenu của chúng tôi Button. Theo mặc định, có một số nhận xét đề cập đến việc sử dụng nút CommandFlag - đây là những gì chúng tôi muốn.

Để cho phép cho gói của chúng tôi để thay đổi Text chúng ta phải bổ sung thêm nút sau:

<CommandFlag>TextChanges</CommandFlag> 

Bây giờ, nếu chúng ta chạy VSPackage nó nên tất cả công việc như mong đợi!

Nếu bạn đang tìm kiếm để cho phép quyền thay đổi các Visibility của menu item (đó là mục đích ban đầu của tôi) sau đó bạn có thể sử dụng sau CommandFlag:

<CommandFlag>DynamicVisibility</CommandFlag> 

Có một full list of command flags here, với giới thiệu về những gì họ làm.

8

Thay vì trực tiếp sử dụng các guid đề cập trong câu trả lời musefan, bạn có thể sử dụng:

[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionExists)] 

Tham khảo: UIContextGuids Class cho tất cả các hằng số guid.

+0

Tìm thấy tuyệt vời, tôi chắc chắn điều này sẽ rất hữu ích cho những người khác quá – musefan

+0

Vì một lý do nào đó, bạn cũng có thể tìm thấy các hướng dẫn tương tự tại đây: Microsoft.VisualStudio.VSConstants.UICONTEXT. Tôi đã tìm thấy thông tin trên trang này. http://www.mztools.com/articles/2013/MZ2013027.aspx –

Các vấn đề liên quan