다음을 통해 공유


모양 및 연결선을 업데이트하여 모델 반영

도메인 관련 언어를 Visual Studio, 원본이 되는 모델의 상태를 반영 하는 도형의 모양을 만들 수 있습니다.

다음 코드 예제에서는이 항목에 추가 해야는 .cs 파일을 Dsl 프로젝트입니다.각 파일에이 명령문을 해야 합니다.

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

데코레이터의 표시 여부를 제어 하려면 맵 셰이프 속성 설정

DSL 정의의 형태 및 도메인 클래스 간의 매핑을 구성 하 여 프로그램 코드를 작성 하지 않고는 데코레이터의 표시 여부를 제어할 수 있습니다.자세한 내용은 다음 항목을 참조하십시오.

색상 및 스타일의 속성으로 노출

DSL 정의에서는 shape 클래스를 마우스 오른쪽 단추로 클릭 하 고 추가 노출, 다음 항목 중 하나를 클릭 하 고 칠 색상.

셰이프 이제 도메인 속성을 사용자 또는 프로그램 코드에서 설정할 수 있습니다.예를 들어, 명령 또는 규칙의 프로그램 코드를 설정 하려면 다음과 같이 작성할 수 있습니다.

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

속성 변수 프로그램 조절 한 사용자가 없습니다만 변경 하려는 경우 새 도메인 속성으로 선택 칠 색상 DSL 정의 다이어그램입니다.그런 다음 속성 창에서 설정 는 찾아볼 수 에 false 또는 설정 UI 읽기 전용입니다 에 true.

색, 스타일 또는 모델 요소 속성에 따라 달라 집니다. 위치 변경 규칙 정의

모델의 다른 부분에서 종속 도형의 모양을 업데이트 하는 규칙을 정의할 수 있습니다.예를 들어, 규칙을 변경 색을 종속 모델 요소의 속성에 있는 셰이프를 업데이트 하는 모델 요소를 정의할 수 있습니다.규칙 변경에 대 한 자세한 내용은 참조 하십시오. 규칙으로 모델 내부의 변경 내용 전파.

규칙 실행 취소 명령을 수행할 때를 호출 하기 때문에 저장소 내에서 유지 관리 되는 속성을 업데이트 하려면 규칙을 사용 해야 합니다.이것의 크기와 셰이프의 표시 여부와 같은 일부 그래픽 기능을 포함 하지 않습니다.도형 기능을 업데이트 하려면를 참조 하십시오 업데이트 되지 않는 저장소 그래픽 기능.

다음은 노출 한 것으로 간주 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.
    }
  }

이 메서드는 도메인 등록 정보 및 도형의 크기 같은 저장소 이외의 기능을 모두 사용할 수 있습니다.

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 인스턴스 메서드가 있지만 각 shape 클래스에 대해 한 번만 호출 됩니다.