Incrustar diagramas en Windows FormsEmbedding a Diagram in a Windows Form

Puede incrustar un diagrama DSL de un Control de Windows, que aparece en el Visual StudioVisual Studio ventana.You can embed a DSL diagram in a Windows Control, which appears in the Visual StudioVisual Studio window.

Incrustar un diagramaEmbedding a Diagram

Para incrustar un diagrama DSL en un Control de WindowsTo embed a DSL diagram in a Windows Control

  1. Agregue un nuevo Control de usuario archivo al proyecto de DslPackage.Add a new User Control file to the DslPackage project.

  2. Agregar un control Panel para el Control de usuario.Add a Panel control to the User Control. Este panel contiene el diagrama de DSL.This panel will contain the DSL Diagram.

    Agregar otros controles que necesite.Add other controls that you require.

    Establecer las propiedades de anclaje de los controles.Set the Anchor properties of the controls.

  3. En el Explorador de soluciones, haga clic en el archivo de control de usuario y haga clic en ver código.In Solution Explorer, right-click the user control file and click View Code. Agregue este constructor y la variable en el código:Add this constructor and variable to the code:

    
    internal UserControl1(MyDSLDocView docView, Control content)  
      : this()  
    {  
      panel1.Controls.Add(content);  
      this.docView = docView;  
    }  
    private MyDSLDSLDocView docView;  
    
  4. Agregue un nuevo archivo al proyecto DslPackage, con el siguiente contenido:Add a new file to the DslPackage project, with the following content:

    using System.Windows.Forms;  
    namespace Company.MyDSL  
    {  
      partial class MyDSLDocView  
      {  
        private UserControl1 container;  
        public override IWin32Window Window  
        {  
          get  
          {  
            if (container == null)  
            {  
              // Put our own form inside the DSL window:  
              container = new UserControl1(this,  
                (Control)base.Window);  
            }  
            return container;  
    } } } }  
    
  5. Para probar el ADSL, presione F5 y abrir un archivo de modelo de ejemplo.To test the DSL, press F5 and open a sample model file. El diagrama aparece dentro del control.The diagram appears inside the control. El cuadro de herramientas y otras características funcionan con normalidad.The toolbox and other features work normally.

Actualizar el formulario con el almacén de eventosUpdating the Form using Store Events

  1. En el Diseñador de formularios, agregar un ListBox denominado listBox1.In the form designer, add a ListBox named listBox1. Se mostrará una lista de los elementos en el modelo.This will display a list of the elements in the model. Se mantendrán en synchronism con el modelo con almacenar eventos.It will be kept in synchronism with the model using store events. Para obtener más información, consulte controladores propagar cambios fuera el modelo de evento.For more information, see Event Handlers Propagate Changes Outside the Model.

  2. En el archivo de código personalizado, invalide más métodos a la clase DocView:In the custom code file, override further methods to the DocView class:

    
    partial class MyDSLDocView  
    {  
     /// <summary>  
     /// Register store event listeners.  
     /// This method is called when the model and diagram    
     /// have completed loading.   
     /// </summary>  
     protected override bool LoadView()  
      {  
        bool result = base.LoadView();  
        Store store = this.DocData.Store;  
        EventManagerDirectory emd = store.EventManagerDirectory;  
        DomainClassInfo componentClass = store.DomainDataDirectory.FindDomainClass(typeof(ExampleElement));  
        emd.ElementAdded.Add(componentClass, new EventHandler<ElementAddedEventArgs>(AddElement));  
        emd.ElementDeleted.Add(componentClass, new EventHandler<ElementDeletedEventArgs>(RemoveElement));  
    
        // Do the initial parts list:  
        container.SetUpFormFromModel();  
        return result;  
      }  
     /// <summary>  
     /// Listener method called on creation of each instance of   
     /// the ExampleElement class or its subclasses.  
     /// </summary>  
     private void AddElement(object sender, ElementAddedEventArgs e)  
     {  
       container.Add(e.ModelElement as ExampleElement);  
     }  
     /// <summary>  
     /// Listener method called after deletion of each instance of   
     /// the ExampleElement class or its subclasses.  
     /// </summary>  
     private void RemoveElement(object sender, ElementDeletedEventArgs e)  
     {  
       container.Remove(e.ModelElement as ExampleElement);  
     }  
    
  3. En el código subyacente del control de usuario, inserte métodos para realizar escuchas de los elementos agregados y quitados:In the code behind the user control, insert methods to listen for elements added and removed:

    
          public partial class UserControl1 : UserControl { ...  
    
    private ExampleModel modelRoot;  
    
    internal void Add(ExampleElement e) { UpdatePartsList(); }  
    internal void Remove(ExampleElement e) { UpdatePartsList(); }  
    
    internal void SetUpFormFromModel()  
    {  
      modelRoot = this.docView.CurrentDiagram.ModelElement as ExampleModel;  
      UpdatePartsList();  
    }  
    
    private void UpdatePartsList()  
    {  
      StringBuilder builder = new StringBuilder();  
      listBox1.Items.Clear();  
      foreach (ExampleElement c in modelRoot.Elements)  
      {  
        listBox1.Items.Add(c.Name);  
      }  
    }  
    
  4. Para probar el ADSL, presione F5 y en la instancia experimental de Visual StudioVisual Studio, abra un archivo de modelo de ejemplo.To test the DSL, press F5 and in the experimental instance of Visual StudioVisual Studio, open a sample model file.

    Observe que el cuadro de lista muestra una lista de los elementos en el modelo, y que es correcta tras cualquier adición o eliminación y después de deshacer y rehacer.Notice that the list box shows a list of the elements in the model, and that it is correct after any addition or deletion, and after Undo and Redo.

Vea tambiénSee Also

Navegar y actualizar un modelo de código de programa Navigating and Updating a Model in Program Code
Escribir código para personalizar lenguajes específicos de dominioWriting Code to Customise a Domain-Specific Language