노드 오브젝트 생성시 가로줄 생성방법

안녕하세요
먼저 코드를 보여드리겠습니다.

private void DrawSiblingLine(UserControl node)
{
    var dc = node.DataContext as NodeVM;

    int x = dc.X;
    int y = dc.Y;
    int width = 0;

    // 밑아래부터 수정요청

    if (dc.Nodes.Count > 0)
    {
        for (int i = 0; i < dc.Nodes.Count; ++i)
        {
            var child = dc.Nodes[i];
            var childdc = child.DataContext as NodeVM;
            width += NodeVM.NODE_WIDTH + NodeVM.NODE_MARGIN_H;

            if (childdc.Nodes.Count > 0)
            {
                for (int j = 0; j < childdc.Nodes.Count; ++j)
                {
                    width += NodeVM.NODE_WIDTH + NodeVM.NODE_MARGIN_H;
                }
            }
        }
    }
    else
    {
        width = 0;
    }

    // end 수정요청

    if (width > 0)
    {
        var line = new Rectangle
        {
            Fill = Brushes.Black,
            Height = 1,
            Width = width,
            Opacity = 0.3
        };

        Canvas.SetLeft(line, x + NodeVM.NODE_WIDTH / 2);
        Canvas.SetTop(line, y + NodeVM.NODE_HEIGHT + NodeVM.NODE_HEIGHT_V);

        CAN1.Children.Add(line);
    }

    for (int i = 0; i < dc.Nodes.Count; ++i)
    {
        var child = dc.Nodes[i];
        DrawSiblingLine(child);
    }
}

이렇게 노드 생성마다 탑노트부터 세로노드마다 가로트리선 추가하는 코드를 짰는데도

첨부된 사진처럼 자식노드부터 마지막노드오른쪽에 가로트리선이 계속 추가되네요
방법이 있을까요?

1개의 좋아요

재현 가능한 코드를 공유 주시면 답변하는데 도움이 될 것 같아요.

1개의 좋아요

라인의 길이가 100이고 자식 노드가 3개라고 가정하면 width 값이 (3-1) * 100 = 200으로 계산되어야 하는데 지금 코드는 width3 * 100 만큼 계산하고 있네요.
다음 블럭의 레이아웃을 위해 width 계산에서는 마지막 1개 만큼의 길이가 포함되는 것이 맞지만 RectangleWidth 속성을 지정할 때 NodeVM.NODE_WIDTH + NodeVM.NODE_WIDTH_H를 빼주면 될 듯 합니다.

var line = new Rectangle
{
    Fill = Brushes.Black,
    Height = 1,
    Width = width - (NodeVM.NODE_WIDTH+ NodeVM.NODE_WIDTH_H),
    Opacity = 0.3
};
2개의 좋아요

말씀 감사합니다. 그런데 선배님 코드대로 해보니
첫번째 노드의 맨 오른쪽 트리선도 없어지고
두번째 노드 중간에 트리선이 그대로 남아있네요 ㅠㅠ

1개의 좋아요

재현 가느한 소스코드를 공유해주시면 완전 좋을 것 같습니다.

해결완료입니다.

코드 공유드립니다.

 private void DrawSiblingLine(UserControl node)
 {
     var dc = node.DataContext as NodeVM;
     
     if (dc.Nodes.Count > 1)
     {
         int x = dc.X;
         int y = dc.Y;
         int width = (int)(Canvas.GetLeft(dc.Nodes[dc.Nodes.Count - 1]) - Canvas.GetLeft(dc.Nodes[0]));

         if (width > 0)
         {
             var line = new Rectangle
             {
                 Fill = Brushes.Black,
                 Height = 1,
                 Width = width,
                 Opacity = 1
             };

             Canvas.SetLeft(line, x + NodeVM.NODE_WIDTH / 2);
             Canvas.SetTop(line, y + NodeVM.NODE_HEIGHT + NodeVM.NODE_HEIGHT_V);

             CAN1.Children.Add(line);
         }
     } // end if

     for (int i = 0; i < dc.Nodes.Count; ++i)
     {
         var child = dc.Nodes[i];
         DrawSiblingLine(child);
     } // end for
 }