Visual Studio uzantıları için kural tabanlı kullanıcı arabirimi bağlamı kullanma

Visual Studio, bazı iyi bilinenler UIContextetkinleştirildiğinde VSPackage'ların yüklenmesine izin verir. Ancak, uzantı yazarlarının VSPackage'ın yüklenmesini istedikleri noktadan önce etkinleştirilen kullanılabilir bir KULLANıCı Arabirimi Bağlamı seçmekten başka seçenek bırakmayan bu KULLANıCı Arabirimi Bağlamları ayrıntılı değildir. İyi bilinen kullanıcı arabirimi bağlamlarının listesi için bkz KnownUIContexts. .

Paketlerin yüklenmesi performansı etkileyebilir ve gerektiğinden daha erken yüklemek en iyi yöntem değildir. Visual Studio 2015, uzantı yazarlarının ui bağlamının etkinleştirildiği ve ilişkili VSPackage'ların yüklendiği hassas koşulları tanımlamasına olanak tanıyan Kural Tabanlı UI Bağlamları kavramını kullanıma sunulmuştur.

Kural Tabanlı Kullanıcı Arabirimi Bağlamı

"Kural", mantıksal "ve", "veya", "not" işlemleriyle birlikte bir veya daha fazla "Terim"e başvuran yeni bir UI Bağlamı (GUID) ve Boole ifadelerinden oluşur. "Terimler" çalışma zamanında dinamik olarak değerlendirilir ve terimlerinden herhangi biri değiştiğinde ifade yeniden değerlendirilir. İfade true olarak değerlendirildiğinde, ilişkili KULLANıCı Arabirimi Bağlamı etkinleştirilir. Aksi takdirde KULLANıCı Arabirimi Bağlamı devre dışı bırakılır.

Kural tabanlı kullanıcı arabirimi bağlamı çeşitli şekillerde kullanılabilir:

  1. Komutlar ve araç pencereleri için görünürlük kısıtlamalarını belirtin. Ui Bağlam kuralına uyulana kadar komutları/araç pencerelerini gizleyebilirsiniz.

  2. Otomatik yükleme kısıtlamaları olarak: paketleri yalnızca kural karşılandığında otomatik yükleme.

  3. Gecikmeli görev olarak: Belirtilen bir aralık geçene ve kural karşılanıncaya kadar yüklemeyi geciktirin.

    Mekanizma herhangi bir Visual Studio uzantısı tarafından kullanılabilir.

Kural tabanlı kullanıcı arabirimi bağlamı oluşturma

Yalnızca .config uzantısına sahip dosyalara uygulanan bir menü komutu sunan TestPackage adlı bir uzantınız olduğunu varsayalım. VS2015'te en iyi seçenek, KULLANıCı Arabirimi Bağlamı etkinleştirildiğinde SolutionExistsAndFullyLoadedContext TestPackage'ı yüklemekti. Yüklenen çözüm bir .config dosyası bile içerebileceğinden TestPackage'ı bu şekilde yüklemek verimli değildir. Bu adımlar, kural tabanlı UI Bağlamı'nın kullanıcı arabirimi bağlamı etkinleştirmek için yalnızca .config uzantısına sahip bir dosya seçildiğinde nasıl kullanılabileceğini ve bu KULLANıCı Arabirimi Bağlamı etkinleştirildiğinde TestPackage'ı nasıl yükleyebileceğini gösterir.

  1. Yeni bir UIContext GUID tanımlayın ve VSPackage sınıfına ProvideAutoLoadAttribute ve ProvideUIContextRuleAttributeöğesine ekleyin.

    Örneğin, yeni bir UIContext "UIContextGuid" ekleneceğini varsayalım. Oluşturulan GUID (Araç>Oluşturma GUID'sine tıklayarak GUID oluşturabilirsiniz) "8B40D5E2-5626-42AE-99EF-3DD1EFF46E7B" şeklindedir. Ardından aşağıdaki bildirimi paket sınıfınıza eklersiniz:

    public const string UIContextGuid = "8B40D5E2-5626-42AE-99EF-3DD1EFF46E7B";
    

    Öznitelikler için şu değerleri ekleyin: (Bu özniteliklerin ayrıntıları daha sonra açıklanacaktır)

    [ProvideAutoLoad(TestPackage.UIContextGuid)]
    [ProvideUIContextRule(TestPackage.UIContextGuid,
        name: "Test auto load",
        expression: "DotConfig",
        termNames: new[] { "DotConfig" },
        termValues: new[] { "HierSingleSelectionName:.config$" })]
    

    Bu meta veriler, yeni UIContext GUID'sini (8B40D5E2-5626-42AE-99EF-3DD1EFF46E7B) ve tek bir terim olan "DotConfig" ifadesini tanımlar. "DotConfig" terimi, etkin hiyerarşideki geçerli seçimin normal ifade deseni "\.config$" (.config ile biter) ile eşleşen bir ada sahip olduğunda true olarak değerlendirilir. (Varsayılan) değeri, hata ayıklama için kullanışlı kural için isteğe bağlı bir ad tanımlar.

    özniteliğinin değerleri, daha sonra derleme zamanında oluşturulan pkgdef'e eklenir.

  2. TestPackage komutlarının VSCT dosyasında uygun komutlara "DynamicVisibility" bayrağını ekleyin:

    <CommandFlag>DynamicVisibility</CommandFlag>
    
  3. VSCT'nin VisibilityConstraints bölümünde, uygun komutları #1'de tanımlanan yeni UIContext GUID'sine bağlayın:

    <VisibilityConstraints>
        <VisibilityItem guid="guidTestPackageCmdSet" id="TestId"  context="UIContextGuid"/>
    </VisibilityConstraints>
    
  4. Simgeler bölümünde UIContext tanımını ekleyin:

    <GuidSymbol name="UIContextGuid" value="{8B40D5E2-5626-42AE-99EF-3DD1EFF46E7B}" />
    

    *.config dosyaları için bağlam menüsü komutları yalnızca çözüm gezgininde seçilen öğe bir .config dosyası olduğunda görünür ve bu komutlardan biri seçilene kadar paket yüklenmez.

    Ardından, paketin yalnızca beklediğiniz zaman yüklendiğini onaylamak için bir hata ayıklayıcı kullanın. TestPackage hatalarını ayıklamak için:

  5. yönteminde Initialize bir kesme noktası ayarlayın.

  6. TestPackage'ı derleyin ve hata ayıklamaya başlayın.

  7. Proje oluşturun veya bir proje açın.

  8. .config dışında bir uzantıya sahip herhangi bir dosyayı seçin. Kesme noktasına isabet edilmemelidir.

  9. App.Config dosyasını seçin.

    TestPackage, kesme noktasında yüklenir ve durur.

Kullanıcı Arabirimi Bağlamı için daha fazla kural ekleme

UI Bağlam kuralları Boole ifadeleri olduğundan, kullanıcı arabirimi bağlamı için daha kısıtlanmış kurallar ekleyebilirsiniz. Örneğin, yukarıdaki UI Bağlamı'nda kuralın yalnızca proje içeren bir çözüm yüklendiğinde uygulanacağını belirtebilirsiniz. Bu şekilde, bir .config dosyasını projenin bir parçası olarak değil, tek başına dosya olarak açarsanız komutlar gösterilmez.

[ProvideAutoLoad(TestPackage.UIContextGuid)]
[ProvideUIContextRule(TestPackage.UIContextGuid,
    name: "Test auto load",
    expression: "(SingleProject | MultipleProjects) & DotConfig",
    termNames: new[] { "SingleProject", "MultipleProjects","DotConfig" },
    termValues: new[] { VSConstants.UICONTEXT.SolutionHasSingleProject_string , VSConstants.UICONTEXT.SolutionHasMultipleProjects_string , "HierSingleSelectionName:.config$" })]

Şimdi ifade üç terime başvurur. İlk iki terim olan "SingleProject" ve "MultipleProjects", diğer iyi bilinen UI Bağlamlarına (GUID'lerine göre) başvurur. Üçüncü terim olan "DotConfig", bu makalenin önceki bölümlerinde tanımlanan kural tabanlı kullanıcı arabirimi bağlamıdır.

Gecikmeli etkinleştirme

Kurallar isteğe bağlı bir "Gecikme" içerebilir. Gecikme milisaniye cinsinden belirtilir. Varsa, gecikme, kuralın kullanıcı arabirimi bağlamının etkinleştirilmesinin veya devre dışı bırakılmasının bu zaman aralığına kadar gecikmesine neden olur. Kural gecikme aralığından önce değişirse hiçbir şey olmaz. Bu mekanizma, özellikle zamanlayıcılara güvenmeden veya boşta bildirimlere kaydolmadan tek seferlik başlatma gibi başlatma adımlarını "kademelendirmek" için kullanılabilir.

Örneğin, test yükleme kuralınızı 100 milisaniyelik bir gecikme süresine sahip olacak şekilde belirtebilirsiniz:

[ProvideAutoLoad(TestPackage.UIContextGuid)]
[ProvideUIContextRule(TestPackage.UIContextGuid,
    name: "Test auto load",
    expression: "DotConfig",
    termNames: new[] { "DotConfig" },
    termValues: new[] { "HierSingleSelectionName:.config$" },
    delay: 100)]

Terim türleri

Desteklenen çeşitli terim türleri şunlardır:

Süre Açıklama
{nnnnnn-nnnn-nnnn-nnnn-nnnnn} GUID, kullanıcı arabirimi bağlamını ifade eder. Kullanıcı Arabirimi Bağlamı etkin olduğunda ve aksi takdirde false olduğunda terim doğru olur.
HierSingleSelectionName:<pattern> Etkin hiyerarşideki seçim tek bir öğe olduğunda ve seçili öğenin adı "desen" tarafından verilen .NET normal ifadesiyle eşleştiğinde terim doğru olur.
User Ayarlar StoreQuery:<query> "query", kullanıcı ayarları deposunun tam yolunu temsil eder ve sıfır olmayan bir değer olarak değerlendirilmelidir. Sorgu, son eğik çizgide "collection" ve "propertyName" olarak bölünür.
Config Ayarlar StoreQuery:<query> "query", yapılandırma ayarları deposunun tam yolunu temsil eder ve sıfır olmayan bir değere değerlendirilmelidir. Sorgu, son eğik çizgide "collection" ve "propertyName" olarak bölünür.
ActiveProjectFlavor:<projectTypeGuid> Şu anda seçili olan proje aromalı olduğunda (toplandığında) ve verilen proje türü GUID'sine uyan bir türe sahip olduğunda terim true olur.
ActiveEditorContentType:<contentType> Seçilen belge, belirtilen içerik türüne sahip bir metin düzenleyicisi olduğunda terim doğru olur. Not: Seçili belge yeniden adlandırıldığında, dosya kapatılıp yeniden açılana kadar bu terim yenilenmez.
ActiveProjectCapability:<expression> Etkin proje özellikleri sağlanan ifadeyle eşleştiğinde bu terim doğrudur. İfade VB | gibi bir ifade olabilir Csharp.
SolutionHasProjectCapability:<Expression> Yukarıdakine benzer ama çözümde ifadeyle eşleşen yüklü bir proje olduğunda terim doğrudur.
SolutionHasProjectFlavor:<projectTypeGuid> Bir çözümün aromalı (toplanmış) projesi olduğunda ve verilen proje türü GUID'sine uyan bir türe sahip olduğunda bu terim doğru olur.
ProjectAddedItem:<pattern> "Desen" ile eşleşen bir dosya, açılan çözümdeki bir projeye eklendiğinde bu terim geçerlidir.
ActiveProjectOutputType:<outputType> Etkin proje için çıkış türü tam olarak eşleştiğinde bu terim doğrudur. outputType bir tamsayı veya __VSPROJOUTPUTTYPE tür olabilir.
ActiveProjectBuildProperty:<buildProperty>=<regex> Etkin proje belirtilen derleme özelliğine sahip olduğunda ve özellik değeri sağlanan regex filtresiyle eşleştiğinde bu terim doğrudur. Derleme özellikleri hakkında daha fazla bilgi için MSBuild Proje Dosyalarında Verileri Kalıcı Hale Getirmek bölümüne bakın.
SolutionHasProjectBuildProperty:<buildProperty>=<regex> Çözüm, belirtilen derleme özelliğine sahip yüklü bir projeye sahip olduğunda ve özellik değeri sağlanan regex filtresiyle eşleştiğinde bu terim doğrudur.

Sürümler arası uzantıyla uyumluluk

Kural tabanlı UI Bağlamları, Visual Studio 2015'teki yeni bir özelliktir ve önceki sürümlere taşımaz. Önceki sürümlere taşımamak, Visual Studio'nun birden çok sürümünü hedefleyen uzantılar/paketler ile ilgili bir sorun oluşturur. Bu sürümlerin Visual Studio 2013 ve önceki sürümlerinde otomatik olarak yüklenmesi gerekir, ancak Visual Studio 2015'te otomatik yüklenmeyi önlemek için kural tabanlı UI Bağlamlarından yararlanabilir.

Bu tür paketleri desteklemek için, kayıt defterindeki AutoLoadPackages girdileri artık değeri alanında girdinin Visual Studio 2015 ve üzerinde atlanması gerektiğini belirten bir bayrak sağlayabilir. Bu, öğesine PackageAutoLoadFlagsbir bayrak seçeneği ekleyerek yapılabilir. VSPackage'lar artık özniteliğine ProvideAutoLoadAttribute SkipWhenUIContextRulesActive seçeneğini ekleyerek girdinin Visual Studio 2015 ve üzerinde yoksayılması gerektiğini belirtebilir.

Genişletilebilir UI Bağlam kuralları

Bazen paketler statik UI Bağlamı kurallarını kullanamaz. Örneğin, komut durumunun içeri aktarılan MEF sağlayıcıları tarafından desteklenen düzenleyici türlerini temel alarak genişletilebilirliği destekleyen bir paketiniz olduğunu varsayalım. Geçerli düzenleme türünü destekleyen bir uzantı varsa komut etkinleştirilir. Bu gibi durumlarda, koşullar kullanılabilir MEF uzantılarına bağlı olarak değişeceğinden paketin kendisi statik ui Bağlamı kuralını kullanamaz.

Bu tür paketleri desteklemek için kural tabanlı UI Bağlamları, or ile birleştirileceği aşağıdaki tüm terimleri belirten sabit kodlanmış bir "*" ifadesini destekler. Bu, ana paketin bilinen bir kural tabanlı UI Bağlamı tanımlamasını ve komut durumunu bu bağlama bağlamasını sağlar. Daha sonra ana paket için hedeflenen herhangi bir MEF uzantısı, diğer terimleri veya ana ifadeyi etkilemeden desteklediği düzenleyiciler için koşullarını ekleyebilir.

Oluşturucu ProvideExtensibleUIContextRuleAttribute belgelerinde genişletilebilir UI Bağlamı kurallarının söz dizimi gösterilir.