2013-03-21 10 views
12

Tworzę pakiet Visual Studio (jest to mój pierwszy raz), a moim celem końcowym jest utworzenie elementu menu kontekstowego dla eksploratora rozwiązań, który tylko działa na niektórych typach plików. (Pomyślałem, że to normalne, ale nie znalazłem żadnych przyzwoitych tutoriali na ten temat, więc jeśli znasz jakieś, daj mi znać)Pakiet Visual Studio: Ustawia widoczność niestandardowego menu kontekstowego Eksploratora rozwiązań

Podążyłem za prostym przewodnikiem MSDN, aby najpierw utworzyć element na pasku narzędzi (Zapomniałem, gdzie jest link) i wszystko działało dobrze.

Następnie znalazłem sposób przeniesienia go do menu kontekstowego Eksploratora rozwiązań. Cel ten został osiągnięty poprzez manipulowanie plik .vsct i posiadające element tak:

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

To chyba nie ma znaczenia, ale staram się ustawić scenę.

Teraz, ponieważ chcę pokazać element tylko dla niektórych typów plików, muszę znaleźć sposób na sprawdzenie pliku po naciśnięciu przycisku prawego przycisku myszy. Cięcia długich poszukiwaniach skrócie, found this i skończył z następującego kodu:

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"; 
} 

w powyższym przykładzie jestem po prostu próbuje ustawić tekst, aby spróbować udowodnić, że działa, wiem, że tam jest właściwością Visible ale Chcę, aby ten krok był pierwszy. Zdarzenie BeforeQueryStatus jest uruchamiane, a debugowanie pokazuje wykonanie kodu zgodnie z oczekiwaniami. Jednak nie ma zmiany w pozycji menu kontekstowego, pozostaje ona z oryginalnym tekstem.

Czego mi tu brakuje? Dlaczego nie aktualizuje?

Odpowiedz

20

OK, więc w końcu znaleźć rozwiązanie tego problemu, istnieje kilka rzeczy, które trzeba zrobić ...

KROK 1:

Musimy określić, że VSPackage powinno "automatycznie ładować", robimy to, aby kod był wykonywany, gdy wyświetlane jest Menu kontekstowe, ponieważ normalnie VSPackage nie zainicjowałby przed wyświetleniem interfejsu użytkownika (np. Kliknięcie pozycji menu). Aby to zrobić, dodajemy atrybut do klasy pakietu, tak jak poniżej:

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

Można się zastanawiać, co to wartość GUID jest również w tym przypadku reprezentuje UICONTEXT_SolutionExists stała, co oznacza, że ​​pakiet zostanie auto-load kiedy istnieje rozwiązanie (więc kiedy tworzymy nowy lub ładujemy jeden). I got this information from here, ponieważ możesz stwierdzić, że istnieje możliwość użycia number of different VSConstants.

Oto kilka więcej zasobów, które wymienione inne wartości GUID, który może być stosowany:

KROK 2:

Teraz, gdy BeforeQueryStatus kod jest wykonywany w poprawnym miejscu, nadal jest confus co do tego, dlaczego kod niczego nie zmienia (na moje pytanie próbuję zmienić Text).Cóż, odpowiedź brzmi, ponieważ musimy dać temu pakietowi pozwolenie (przynajmniej tak to widzę).

Aby to zrobić, musimy edytować plik .vsct. Wewnątrz znajduje się element Buttons, wewnątrz którego powinno znajdować się nasze ContextMenu Button. Domyślnie istnieją komentarze, które wspominają o użyciu węzła CommandFlag - tego właśnie chcemy.

Aby wyrazić zgodę na nasz pakiet zmienić Text musimy dodać następujące węzła:

<CommandFlag>TextChanges</CommandFlag> 

Teraz, jeśli prowadzimy VSPackage to powinno wszystko działać zgodnie z oczekiwaniami!

Jeśli szukasz, aby umożliwić uprawnień do zmiany Visibility pozycji menu (który był mój pierwotny cel), a następnie można użyć następujących CommandFlag:

<CommandFlag>DynamicVisibility</CommandFlag> 

Jest full list of command flags here z opisami na jakiej oni to robią.

8

Zamiast bezpośrednio za pomocą identyfikatora GUID wymieniony w odpowiedzi musefan, można użyć:

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

Patrz: UIContextGuids Class dla wszystkich GUID stałych.

+0

Świetne znalezisko, jestem pewien, że to będzie bardzo przydatne dla innych też. – musefan

+0

Z jakiegoś powodu te same guidy można znaleźć tutaj: Microsoft.VisualStudio.VSConstants.UICONTEXT. Znalazłem informacje na tej stronie. http://www.mztools.com/articles/2013/MZ2013027.aspx –

Powiązane problemy