2011-04-09 8 views
1

나는 만족스런 결과없이 이것을 해결하려고 하루 종일 보냈습니다.주어진 컨테이너 안에 여러 객체를 수평 가운데에 배치하는 방법은 무엇입니까?

컨테이너 (패널) 안에 몇 개의 레이블을 가운데에 정렬해야합니다. 단지 하나 개의 레이블이 있다면 그것은 바람 일 것이다, 그러나 생활은 쉽지 않다 나는 여러 개체를 중심으로 두 개의 문제를 극복하는 방법 작성해야합니다 : 그것은 1 사이 라벨의 숫자가 될 수

  1. 을 8, 나는 디자인 타임에 얼마나 많은지 모르겠다.
  2. 레이블 사이의 정확한 간격을 명확하게 지정할 수 있어야합니다. 이 2 아니었다면

이 내가이 함께했다 몇 가지 생각 후, 그렇게 어렵지 않을 것이다 :

private void panel1_Resize(object sender, EventArgs e) 
{ 
    int position = 1; 
    foreach (Label l in panel1.Controls) 
    { 
     CenterToParent(l, panel1.Controls.Count, position); 
     position++; 
    } 
} 

private static void CenterToParent(Label lbl, int qty, int pos) 
{ 
    lbl.SetBounds((lbl.Parent.Bounds.Width - lbl.Width) * pos/(qty + 1), 
        lbl.Location.Y, lbl.Width, lbl.Height); 
} 

그러나 라벨 사이의 공간으로 변경됩니다 이런 식으로 패널의 폭이 변경되고이 간격은 고정 된 크기 여야합니다. 이것이 단순히 TableLayoutPanel을 사용할 수없는 이유이기도합니다.

추신 : 만약 당신이 친절하게, 아주 똑똑한 것 같아요 (내가 단지 같은 속성을 가지고) 객체 유형을 모르면 CenterToParent 방법을 작동합니다. 나는 가까운 미래에 이것을 필요로 할 것 같은 느낌이 들며 그것을하는 방법에 대한 단서가 없다.

답변

1

적어도 두 번째 질문의 경우 Label lblControl ctrl으로 변경하십시오. 그것은 임의적 인 통제를 취할 수 있으며, 그것이 부모라고 가정 할 때 그 부모를 중심으로 할 수 있습니다. 그 상태를 확인하고 싶을 수도 있습니다.

는 업데이트 :

나는 조금 더 문제에 대해 생각했다. 먼저, 제어판에 Label 컨트롤이 없으면 애플리케이션이 foreach 루프 동안 충돌합니다. 이것을 foreach (Control ctrl in panel1.Controls)으로 변경하십시오. 이것은 또한 귀하의 두 번째 질문에 대한 원래의 대답을 사용합니다.

기본 문제는 몇 가지 컨트롤이 주어지면 부모에게 수평 중심에 균등하게 간격을 두어야한다는 것입니다. 총 너비는 (control1.Width + offset) + (control2.Width + offset) ... (controlN.Width + offset) - offset입니다. (Parent.Width/2) - (TotalWidth/2) 인 경우 this의 x 좌표 (startX)입니다. 당신을 내가 틀림없이이를 테스트하지 않았다

const int Offset = 8; // for example 
int totalWidth = panel1.Controls.Cast<Control>().Aggregate(0, (value, ctrl) => value + ctrl.Width + Offset); 

for (int index = 0; index < panel1.Controls.Count; index++) 
{ 
    Control current = panel1.Controls[index]; 

    if (index == 0) 
    { 
     current.Left = startX; 
    } 

    else 
    { 
     current.Left = panel1.Controls[index-1].Right + Offset; 
    } 
} 

,하지만 어쩌면 : 어쩌면이 같은 실제 코드로

control1.Left = startX; 
control2.Left = control1.Right + offset 
controlN.Left = control(N-1).Right + offset 

: 이제 당신은 X 좌표를 알고, 당신은 다음처럼 컨트롤의 레이아웃을 시작할 수 있습니다 여기에서 일하게 될거야. 행운을 빕니다.

+0

그 트릭을 했어, 많이 고마워! 객체는 중심에서 약간 벗어 났지만 마지막 객체에는 오프셋이 필요하지 않기 때문에 _totalWidth_에 '- Offset'을 추가했으며 이제는 완벽합니다. 그 충돌을 알고 있었지만 그 패널 안에는 레이블 만 있다는 것을 알고 있습니다. 마지막 요청을 위해, 나는'Object'를 사용해 보았지만'Control'을 사용하는 것을 결코 생각하지 않았습니다. 그렇게 명백하다. :) –

관련 문제