HOW TO:使用 Visual Studio API 開啟 UML 模型
您同樣可以使用 API,在 Visual Studio 使用者介面中開啟模型和圖表。
如果您只要讀取程式碼中的模型,但不想讓使用者看見此模型,可以使用下列方法:
Visual Studio 模型匯流排可讓您存取模型及其中的項目,而且會提供在模型間相互連結的標準方法。 如需詳細資訊,請參閱 HOW TO:整合 UML 模型與其他模型和工具。
您可以在唯讀模式下開啟模型。 如需詳細資訊,請參閱 HOW TO:讀取程式碼中的 UML 模型。
在 Visual Studio 中開啟模型和圖表
若要在使用者介面中開啟模型,請使用標準的 Visual Studio API EnvDTE.DTE。 您可以針對模型專案項目執行下列兩種好用的轉換:
EnvDTE.Project 可與 IModelingProject 相互轉換,但前提是專案為模型專案,並且已經在目前的 AppDomain 中載入。
EnvDTE.ProjectItem 可與 IDiagramContext 相互轉換,但前提是項目為 UML 圖表。
使用下列範例時,您的專案應匯入這些參考:
EnvDTE
Microsoft.VisualStudio.ArchitectureTools.Extensibility
Microsoft.VisualStudio.Modeling.Sdk.10.0
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.10.0
Microsoft.VisualStudio.Uml.Interfaces
System.ComponentModel.Composition
這個範例會在 Visual Studio 中開啟 UML 模型:
using EnvDTE; // Visual Studio API for loading diagrams
using
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
// for ICommandExtension and other handler types
using Microsoft.VisualStudio.Uml.Classes;
// for basic UML types
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
// for model construction methods
using EnvDTE;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility;
Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
// for IDiagram
...
在 Visual Studio 擴充功能中,您可以進行下列宣告來取得主機服務提供者的存取權:
[Import] public Microsoft.VisualStudio.Shell.SVsServiceProvider ServiceProvider {get;set;}
...
您可以在方法中存取專案 (例如目前的專案):
DTE dte = (DTE)ServiceProvider.GetService(typeof(DTE));
Project project = dte.ActiveDocument.ProjectItem.ContainingProject;
IModelingProject modelingProject = project as IModelingProject;
if (modelingProject == null) return; // not a modeling project
// Access the model's store and contents.
IModelStore store = modelingProject.Store;
foreach (IElement element in store.Root.OwnedElements) {...}
// Open all the project's diagrams.
foreach (ProjectItem item in project.ProjectItems)
{
IDiagramContext modelingItem = item as IDiagramContext;
if (modelingItem == null)
continue; // not a model diagram
IDiagram diagram = modelingItem.CurrentDiagram;
if (diagram == null)
{
// Diagram is closed. Open it.
item.Open().Activate();
diagram = modelingItem.CurrentDiagram;
}
// Access the shapes.
foreach (IShape<IElement> shape
in diagram.GetChildShapes<IElement>())
{
IElement displayedElement = shape.Element;
...
}
}
}