2012-02-27 4 views
1

GDI +를 사용하여 텍스트와 그래픽을 그리는 사용자 지정 UserControl이 있습니다. 일반적으로 다른 컨트롤 내에서 DockStyle.Bottom을 사용하여 도킹합니다.사용자 지정 UserControl에서 AutoSize 구현

이 컨트롤의 크기는 Graphics.MeasureString()을 사용하는 사용자 지정 레이아웃에 의해 결정됩니다. 따라서 너비가 변경 될 때마다 높이를 다시 계산해야하며, 이는 부모 너비가 변경 될 때 변경됩니다.

현재 OnSizeChanged 이벤트에서이 컨트롤의 높이를 설정하고 있습니다. 그러나 나는 이것에 약간의 벌레를 알아 차리고있다. 때로는 부모의 크기를 조정할 때 DockStyle.Bottom으로 설정되어 있어도 컨트롤이 부모의 아래쪽을 터치하지 않습니다. Spy ++를 사용하여 컨트롤 범위를 분석했으며 컨트롤과 부모 가장자리 사이에 약 20 픽셀 정도의 빈 공간이있었습니다.

이 Topic 또는 Bottom DockStyle을 가정하고이 UserControl에서 적절한 AutoSize를 구현하고 싶습니다.

+0

FlowLayoutPanel 및 UserControl 자체에 대해 AutoSize를 true로 설정해 보았습니까? –

+0

FlowLayoutPanel을 사용하지 않습니다. –

+0

여기에 FlowLayoutPanel을 사용하는 데 문제가 있습니까? 앵커 설정 방법은? 사용자 정의 컨트롤의 모든 컨트롤에 앵커 및 도킹을 사용하고 컨트롤의 가장자리를 고정하도록 설정하면 컨트롤의 크기가 UserControl로 조정되므로 이제 앵커/도킹을 UserControl에도 설정할 수 있습니다. UserControl의 Anchor 및 Dock 속성을 결합하여 컨트롤의 가장자리가 UI의 다른 부분에 표시되도록 옵션을 설정합니다. UI의 크기가 조정되면 컨트롤의 크기가 올바르게 조정됩니다. –

답변

1

WindowsForms의 DefaultLayout 엔진은 도킹 된 컨트롤을 레이아웃하기위한 로직이 상당히 있습니다. decompiler (dotPeek, Reflector 등)를 추천하고 DefaultLayout 클래스를 디 컴파일하십시오. 당신이 당신의 GetPreferredSize에서 호출되고있는 상황을 이해할 때

이 GetPreferredSize에서 등 등

을 무시할지 여부를 제어 자체 자식 간의 많은 상호 작용이 있습니다 아마, 당신은 더 나은 아이디어를 얻을 수 있습니다 그것을 구현하는 방법.

예제 구현면에서 Windows가 제어하는 ​​것보다 나은 점은 무엇입니까? 약간의 디 컴파일. 여기 ToolStripItem의 예제

public virtual Size GetPreferredSize(Size constrainingSize) 
    { 
     constrainingSize = LayoutUtils.ConvertZeroToUnbounded(constrainingSize); 
     return this.InternalLayout.GetPreferredSize(constrainingSize - this.Padding.Size) + this.Padding.Size; 
    } 

행운을 빈다!

관련 문제