Cómo: Exportar diagramas UML a archivos de imágenes
Puede exportar un documento UML de Visual Studio a una imagen que está bajo el control de programa. Por ejemplo, le podría interesar hacerlo como parte de la generación de documentos automática.
Si desea exportar un documento a una imagen manualmente, puede copiar y pegar las formas de un diagrama en otros programas, como Word. También puede imprimir documentos en formato XPS. Para obtener más información, vea Cómo: Exportar imágenes de diagramas.
Guardar una imagen
El siguiente código define un comando de menú contextual que guarda una imagen en un archivo.
Nota
Para que este código funcione como un comando de menú, debe incorporarlo a un componente MEF. Para obtener más información, vea Cómo: Definir un comando de menú en un diagrama de modelado.
El código utiliza primero [M:Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation.IDiagram.GetObject`1()] para obtener Diagram de la implementación subyacente. Este tipo tiene un método CreateBitmap().
namespace SaveToImage
{
using System.ComponentModel.Composition;
// for [Import], [Export]
using System.Drawing; // for Bitmap
using System.Drawing.Imaging; // for ImageFormat
using System.Linq; // for collection extensions
using System.Windows.Forms; // for SaveFileDialog
using Microsoft.VisualStudio.Modeling.Diagrams;
// for Diagram
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
// for IGestureExtension, ICommandExtension, ILinkedUndoContext
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
// for IDiagramContext
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
// for designer extension attributes
/// <summary>
/// Called when the user clicks the menu item.
/// </summary>
// Context menu command applicable to any UML diagram
[Export(typeof(ICommandExtension))]
[ClassDesignerExtension]
[UseCaseDesignerExtension]
[SequenceDesignerExtension]
[ComponentDesignerExtension]
[ActivityDesignerExtension]
class CommandExtension : ICommandExtension
{
[Import]
IDiagramContext Context { get; set; }
public void Execute(IMenuCommand command)
{
// Get the diagram of the underlying implementation.
Diagram dslDiagram = Context.CurrentDiagram.GetObject<Diagram>();
if (dslDiagram != null)
{
string imageFileName = FileNameFromUser();
if (!string.IsNullOrEmpty(imageFileName))
{
Bitmap bitmap = dslDiagram.CreateBitmap(
dslDiagram.NestedChildShapes,
Diagram.CreateBitmapPreference.FavorClarityOverSmallSize);
bitmap.Save(imageFileName, GetImageType(imageFileName));
}
}
}
/// <summary>
/// Called when the user right-clicks the diagram.
/// Set Enabled and Visible to specify the menu item status.
/// </summary>
/// <param name="command"></param>
public void QueryStatus(IMenuCommand command)
{
command.Enabled = Context.CurrentDiagram != null
&& Context.CurrentDiagram.ChildShapes.Count() > 0;
}
/// <summary>
/// Menu text.
/// </summary>
public string Text
{
get { return "Save To Image..."; }
}
/// <summary>
/// Ask the user for the path of an image file.
/// </summary>
/// <returns>image file path, or null</returns>
private string FileNameFromUser()
{
SaveFileDialog dialog = new SaveFileDialog();
dialog.AddExtension = true;
dialog.DefaultExt = "image.bmp";
dialog.Filter = "Bitmap ( *.bmp )|*.bmp|JPEG File ( *.jpg )|*.jpg|Enhanced Metafile (*.emf )|*.emf|Portable Network Graphic ( *.png )|*.png";
dialog.FilterIndex = 1;
dialog.Title = "Save Diagram to Image";
return dialog.ShowDialog() == DialogResult.OK ? dialog.FileName : null;
}
/// <summary>
/// Return the appropriate image type for a file extension.
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
private ImageFormat GetImageType(string fileName)
{
string extension = System.IO.Path.GetExtension(fileName).ToLowerInvariant();
ImageFormat result = ImageFormat.Bmp;
switch (extension)
{
case ".jpg":
result = ImageFormat.Jpeg;
break;
case ".emf":
result = ImageFormat.Emf;
break;
case ".png":
result = ImageFormat.Png;
break;
}
return result;
}
}
}
Vea también
Tareas
Cómo: Exportar imágenes de diagramas