런타임에 하위 요소를 완전히 제어 할 수있는 WPF 요소를 만들려고합니다. 속성이 변경 될 때 자식 UI를 추가하거나 제거합니다. 제 경우에는 하나의 자식 만 있지만 ItemsSource 속성을 수정할 때 ItemsControl이하는 것과 조금 비슷합니다.런타임에 자식을 동적으로 생성 (캡슐화)하는 WPF 요소
MVVM의보기 컨테이너입니다. 모델 또는 ViewModel을 지정하면 마술처럼 올바른보기가 만들어지고 모든 것이 연결됩니다. 뷰 컨테이너를 템플릿으로 만들 필요가 없습니다 (UserControls이며 자체 템플릿이있는 사용자 정의보기를 생성하므로). 가능한 한 캡슐화하는 것이 좋습니다. Grid와 같은 것을 내림으로써 내 속성을 변경할 때 하위 컨트롤을 추가하여 쉽게이 작업을 수행 할 수 있습니다. 그리드는 자식 요소 컬렉션을 공개하고 누구나 물건을 추가하고 제거 할 수 있습니다.
캡슐화를 최대화하기 위해 사용해야하는 WPF 클래스는 무엇이며 런타임에 하위 요소를 어떻게 추가합니까?
문서에 대한 이해를 바탕으로 런타임에 하위 컨트롤을 만들 수 있는지 확인하기 위해 FrameworkElement 및 AddVisualChild를 사용하여 보았습니다. 내가 "ViewContainer을 말하는 TextBlock을 볼 것으로 예상, 나는 창에 ViewContainer를 넣어
public class ViewContainer : FrameworkElement {
private TextBlock _child;
public ViewContainer() {
_child = new TextBlock { Text = "ViewContainer" };
AddLogicalChild(_child);
AddVisualChild(_child);
InvalidateMeasure();
}
public object Content { get; set; }
protected override Size ArrangeOverride(Size finalSize) {
_child.Arrange(new Rect(finalSize));
return finalSize;
}
protected override Size MeasureOverride(Size availableSize) {
_child.Measure(availableSize);
return _child.DesiredSize;
}
}
,이 실행 : 나는 AddLogicalChild가 필요한지 여부에 분명 아니지만, 난 그냥 경우에 넣어 ". 하지만 대신 빈 창이 보입니다. 그래서 분명히 나는 뭔가를 놓친다.
위의 코드를 수정하여 런타임에 "자식"컨트롤이 나타나지만 다른 사람이 혼란에 빠지지 않도록 할 수 있습니다 (피할 수있는 것 이상).
쿨 - 그랬어. AddVisualChild가 실제로 아무 것도 *에 추가하지 않으면 왜 AddVisualChild가 있는지 궁금해합니다. –
아, 알겠습니다. 그것은 부모에 대해 알기 위해 어린이를 설정합니다. 그러나 많은 부모들은 아이들의 목록을 필요로하지 않을 것입니다 (아무도 없거나 하나만 가지고있는). 그래서 부모에게 저장의 선택과 책임을 남겨 둡니다. 공격적인 관심사 분리 : WPF에 대해 내가 좋아하는 것들 중 하나. 그러나 그것은 "AddVisualChild"라는 이름이 오해의 소지가 있음을 의미합니다. 이는 그것이 어떤 종류의리스트에 그것을 추가하고 있음을 암시하기 때문입니다. –