Поделиться через


Обновление фигур и соединителей в соответствии с моделью

В доменном языке in Visual Studioможно сделать представление фигуры автоматически устанавливать состояние базовой модели.

Примеры кода в этом разделе, должны быть добавлены к a .cs в файл Dsl этот проект.Эти выписки понадобятся в каждом файле.

using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;

Задайте сопоставление свойств формы для контроля видимости оформителя

Можно отслеживать видимость оформителя без написать программный код, настроив сопоставление между формой и доменным классом в определении DSL.Дополнительные сведения см. в следующих разделах.

Предоставьте модель, цвет и стиль фигуры в виде свойств

В определении DSL, щелкните правой кнопкой мыши класс формы, указывающие на Добавьте предоставляется, а затем щелкните один из элементов, такие как Цвет заливки.

Форма теперь имеет свойство домена, которое можно установить в программный код или в качестве пользователя.Например, чтобы установить его в программном коде команды или правила, можно написать:

shape.FillColor = System.Drawing.Color.Red;

Если требуется сделать переменную свойства только в системе управления программы, а не пользователем, выберите новое свойство домена как Цвет заливки в схеме определения DSL.Затем в окне свойств установлено Отображается В false или Пользовательский интерфейс только для чтения В true.

Задайте правила изменения этого свойства элемента модели, зависит от цвета, стиля или расположение

Можно определить правила, которые обновляют представление зависимые фигуры в других частях модели.Например, можно определить правило изменения для элемента модели, обновляет цвет его зависимых фигуры на свойствах элемента модели.Дополнительные сведения о правилах изменения см. в разделе Правила распространяют изменения в пределах модели.

Необходимо использовать правила обновить только свойства, которые поддерживаются в хранилище, поскольку правила не вызываются, когда команда rollback выполняется.Сюда не входят некоторые функции, такие как размер графических фигур и видимость.Чтобы обновить эти функции фигуры см. в разделе функции Non-Магазина обновления графические.

В следующем примере предполагается, что обеспечения доступа к FillColor как свойство домена, как описано в предыдущем разделе.

[RuleOn(typeof(ExampleElement))]
  class ExampleElementPropertyRule : ChangeRule
  {
    public override void ElementPropertyChanged(ElementPropertyChangedEventArgs e)
    {
      base.ElementPropertyChanged(e);
      ExampleElement element = e.ModelElement as ExampleElement;
      // The rule is called for every property that is updated.
      // Therefore, verify which property changed:
      if (e.DomainProperty.Id == ExampleElement.NameDomainPropertyId)
      {
        // There is usually only one shape:
        foreach (PresentationElement pel in PresentationViewsSubject.GetPresentation(element))
        {
          ExampleShape shape = pel as ExampleShape;
          // Replace this with a useful condition:
          shape.FillColor = element.Name.EndsWith("3") 
                     ? System.Drawing.Color.Red : System.Drawing.Color.Green;
        }
      }
    }
  }
  // The rule must be registered:
  public partial class OnAssociatedPropertyExptDomainModel
  {
    protected override Type[] GetCustomDomainModelTypes()
    {
      List<Type> types = new List<Type>(base.GetCustomDomainModelTypes());
      types.Add(typeof(ExampleElementPropertyRule));
      // If you add more rules, list them here. 
      return types.ToArray();
    }
  }

Используйте OnChildConfigured для инициализации свойств формы

Задание свойств формы при первом создании, переопределение OnChildConfigured() в частично определении класса схемы.Класс схемы определен в определении DSL, и созданный код внутри Dsl\Generated Code\Diagram.cs.Примеры.

  partial class MyLanguageDiagram
  {
    protected override void OnChildConfigured(ShapeElement child, bool childWasPlaced, bool createdDuringViewFixup)
    {
      base.OnChildConfigured(child, childWasPlaced, createdDuringViewFixup);
      ExampleShape shape = child as ExampleShape;
      if (shape != null) 
      {
        if (!createdDuringViewFixup) return; // Ignore load from file.
        ExampleElement element = shape.ModelElement as ExampleElement;
        // Replace with a useful condition:
        shape.FillColor = element.Name.EndsWith("3") 
            ? System.Drawing.Color.Red : System.Drawing.Color.Green;
      }
      // else deal with other types of shapes and connectors.
    }
  }

Этот метод может использоваться в качестве свойств домена, так и для функций non-магазина, например размер фигуры.

Используйте AssociateValueWith () для обновления других функций фигуры

Для некоторых функций фигуры, например, имеет ли она тень или стиля стрелки соединителя отсутствует метод предоставления встроенной функции как свойство домена.Изменения к таким функциям не под контролем системы транзакции.Следовательно, не соответствующее обновить их с помощью правила, потому, что правила не вызываются, когда пользователь выполняет команду отката.

Вместо этого можно обновить с помощью таких функций OnAssociatedPropertyChanged.В следующем примере стиль стрелки соединителя управляется значением свойства домена в отношении этом отображается соединителя.

public partial class ArrowConnector // My connector class. 
{
   /// <summary>
    /// Called whenever a registered property changes in the associated model element.
    /// </summary>
    /// <param name="e"></param>
    protected override void OnAssociatedPropertyChanged(VisualStudio.Modeling.Diagrams.PropertyChangedEventArgs e)
    {
      base.OnAssociatedPropertyChanged(e);
      // Can be called for any property change. Therefore,
      // Verify that this is the property we're interested in:
      if ("IsDirected".Equals(e.PropertyName))
      {
        if (e.NewValue.Equals(true))
        { // Update the shape’s built-in Decorator feature:
          this.DecoratorTo = LinkDecorator.DecoratorEmptyArrow;
        }
        else
        {
          this.DecoratorTo = null; // No arrowhead.
        }
      }
    }
    // OnAssociatedPropertyChanged is called only for properties
    // that have been registered using AssociateValueWith().
    // InitializeResources is a convenient place to call this.
    // This method is invoked only once per class, even though
    // it is an instance method. 
    protected override void InitializeResources(StyleSet classStyleSet)
    {
      base.InitializeResources(classStyleSet);
      AssociateValueWith(this.Store, Wire.IsDirectedDomainPropertyId);
      // Add other properties here.
    }
} 

AssociateValueWith() вызываться один раз для каждого свойства домена, необходимо зарегистрировать.После того, как он был вызван, все изменения без доставки указанного свойства OnAssociatedPropertyChanged() во всех фигурах, представляющие свойства элемента модели.

Не следует вызывать AssociateValueWith() для каждого экземпляра.Хотя InitializeResources метод экземпляра, он вызывается только один раз для каждого класса формы.