안녕하세요. Avalonia 로 고통의 시간을 보내고 있습니다. ^^
문제의 서론:
저는 사용자 정의 컨트롤 A(ContentControl 에서 상속받은 컨트롤)와 또 다른 사용자 정의 컨트롤 B(Shape 에서 상속받은 컨트롤) 을 만들었습니다.
A 컨트롤은 B 컨트롤에 부가적인 내용을 담기 위해서 만들었습니다.
부가적으로, 설명하면 B 컨트롤이 만들어 질때(기하학적 모양이 렌러링 될때) 거기에 부가적인 정보를 특정 컨트롤에 표시하고자 A 컨트롤을 만든 것입니다.
문제의 핵심 사항
A 컨트롤의 스타일은 아래와 같습니다.
<Design.PreviewWith>
<controls:PendingConnection />
</Design.PreviewWith>
<Style Selector="controls|PendingConnection">
<Setter Property="Template">
<ControlTemplate TargetType="controls:PendingConnection">
<Canvas Background="Red">
<controls:Connection Source="10,10" Target="50,50"
StrokeThickness="2" Stroke="Black"
IsVisible="True" Direction="Forward" Fill="Black" />
<Border Background="Yellow"
Margin="65,65,15,15"
IsVisible="True"
Padding="3"
BorderThickness="2"
BorderBrush="Black"
CornerRadius="3">
<ContentPresenter/>
</Border>
</Canvas>
</ControlTemplate>
</Setter>
</Style>
여기서 ControlTemplate 안에 Canvas 로 자식요소로 B 컨트롤과 기타 다른 컨트롤이 들어가는 형태입니다.
질문 내용:
WPF 에서는 Canvas 가 렌더링이 안되더라도 자식요소들이 렌더링이 됩니다. 하지만 Avalonia 에서는 Canvas 가 렌더링이 안되면 자식요소들이 렌더링이 안됩니다. 이러한 현상은 ControlTemplate 안에 있을때만 발생합니다. MainWindow 에서 동일하게 작성하면 WPF 와는 동일합니다.
이 문제를 해결하는 방법은 1번 방법Canvas 를 Grid 로 교체하는 방법이 있고, 2번 방법 cs 에서 Canvas 의 사이즈를 자식 요소들에 따라 설정해주는 방식이 있는데, 사실 둘다 확신없습니다.
확신이 없는 이유는 1번 방법은 간단하지만, 이러한 컨트롤을 내부적으로 엄청 많이 사용할 예정이라 성능의 문제가 발생할 가능성과 기타 생각지 못한 SideEffects 가능성이 있을 것 같은 생각이 드는 점이 있습니다.
2번 문제는 구현의 복잡함? 이 있을 수 있고, 이렇게 하는게 맞는지에 대한 근본적인 의문이 드는 것입니다. 굳이 이렇게 하면서 Canvas 를 써야 해? 라는 의문 말이죠.
혹시 여러 개발자 선배님들은 어떻게 생각되시나요?
혹시 제가 제공한 정보가 부족하다면, 알려주시면 별도로 깃허브를 추가적으로 올리도록 하겠습니다.
감사합니다.