Search

'layout'에 해당되는 글 1건

  1. 2009.05.21 Layout System in WPF : 프롤로그 (3)

Layout System in WPF : 프롤로그

프로그래밍 2009.05.21 20:49 Posted by 아일레프

모든 일은 그 메일로 부터 시작되었다.

- "Grid 안의 모든 Element 들의 간격을 일정하게 띄울 수 없을 까요? Html의 CellPadding 같은 역할을 할 수 있는 어떤 방법이 있을 것 같은데요" -

   일단 Grid 내의 모든 Element의 간격을 띄울 수 있는 방법은 있다. Grid내에 선언된 모든 Element의 Margin값을 1~2로 설정하는 것이다. ^^;; 그러나 이것은 중복된 코드를 발생시키게 되고 당연히 솔루션이 될 수 없다. 이 문제로 몇 개의 메일이 왔다 갔고 그나마 중복을 줄일 수 있는 방법이 Grid내에 사용되는 모든 Control들의 Default Style을 지정해 Margin을 1로 주는 것이라는 것을 서로 확인 했다.

 물론 가장 쉬운 방법은 코드상에서 해당 Grid에 Loaded 이벤트를 걸어 Grid Children들의 Margin에 특정 값들을 더해주는 것이다. ^^;; …(죄송합니다.)

 몇 번 이 문제에 대해 묵상을 하니 그나마 가장 좋은 방법은 역시 Attached Property 라는 생각이 들었다. 다음과 같이 구현 될 수 있겠다.

 

일단 FrameworkPropertyMetadataOptions.Inherits를 사용하고 있다. 따라서 이 Attached Property는 상속되게 된다.

위 경우 Grid뿐 아니라 RowDefinition과 Button에도 CellPadding Attached Property가 20으로 지정되게 된다. 따라서 2개의 버튼과 RowDefinition 객체가 로드 될 때 저 이벤트가 호출되게 되고 Margin값에 CellPadding값을 더해주게 된다.

왜 굳이 이렇게 했을까? Inherits를 사용하지 않으면 sender를 Grid로 하는 이벤트만 호출 될 테고 그 때 Grid의 모든 Children들의 Margin값에 CellPadding값을 더해주면 간편할텐데 말이다.

위와 같이 하면 더 간편할 것 같은데 이렇게 하지 않은 것은 이유가 있다. 왜 안되는지 잠깐 생각해 보자. 이건 퀴즈 ^^;;;

위 코드에는 또 이상한 점이 있다. SetCellPadding 메소드를 불러 다시 CellPadding 첨부 프로퍼티의 값을 0으로 만드는 것인데, 이는 이 첨부 프로퍼티의 값이 계속 타고 들어가 Grid 내에 또 다른 Grid가 있다면 이 Grid에도 영향을 주기 때문에 추가된 것이다. 물론 위 XAML에서와 같은 경우라면 명시적으로 해당 Grid에서 CellPadding값을 0으로 주면 된다. 그러나 만약 특정 Element의 ControlTemplate내에 Grid가 있다면 문제가 복잡해 질 수 때문에 이를 방지하고자 꼼수지만 0으로 만들었다.

어찌 되었건 위와 같이 잘 적용 되었다. 하지만 이 솔루션에는 단점이 있다. 일단 해당 Attached Property가 Grid가 아닌 다른 Pannel이나 Control에도 정의 될 수 있다는 것이 마음에 안들고 Attached Property가 Tree를 계속 타고 내려가 실제로는 아무 일도 하지 않는 저 메소드를 계속 실행한다는 것이 또 마음에 안든다.

결국 가장 좋은 해답은 Grid를 상속받아 재 정의해 CellPadding 프로퍼티를 추가시키는 것이라는 생각이 들었다. 그래서 과감하게 Grid를 상속받은 GridEx란 클래스를 정의하고 MeasurreOverride와 ArrangeOverride 메소드를 재 정의 했는데... 아… 이 때는 알지 못했다. Grid가 모든 Panel중에서 가장 많은 일을 하고 있는 복잡한 Panel이라는 것을… 결국 멈출 수 없는 수렁으로 빠져 들어가게 되는데…

   

   

   

… 이 시리즈가 계속 될 수 있을까요? ^^;;;

신고