Insertar un diagrama en Windows FormsEmbed a Diagram in a Windows Form

Puede insertar un diagrama DSL en un control de Windows, que aparece en la ventana de Visual Studio.You can embed a DSL diagram in a Windows control, which appears in the Visual Studio window.

Incrustar un diagrama DSL en un control de WindowsEmbed a DSL diagram in a Windows control

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

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

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

    Establecer las propiedades de delimitador 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 MyDSLDocView 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 DSL, 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 eventosUpdate the form using store events

  1. En el Diseñador de formularios, agregue un ListBox denominado listBox1.In the form designer, add a ListBox named listBox1. Esto mostrará una lista de los elementos del modelo.This will display a list of the elements in the model. Que se sincronice con el modelo mediante almacenar eventos.It is synchronized with the model using store events. Para obtener más información, consulte controladores propagar los 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 aún 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 los métodos para realizar escuchas para 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 DSL, presione F5 y en la instancia experimental de Visual Studio, abra un archivo de modelo de ejemplo.To test the DSL, press F5 and in the experimental instance of Visual Studio, open a sample model file.

    Tenga en cuenta que el cuadro de lista muestra una lista de los elementos en el modelo y que es correcta después de cualquier adición o eliminación y 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