2012-09-28 2 views
0

저는 Windows 8 Metro 용 앱을 작성 중이며 Canvas의 자녀 - 부모 관계가 어떻게 작동하는지 이해하는 데 문제가 있습니다. 하나의 캔버스를 다른 하나의 자식에 추가하면 부모 캔버스가 시각적 트리에 추가 될 때까지 subcanvas '-> parent 속성은 null과 같습니다. 아래는 문제를 보여주는 샘플 코드입니다.Canvas에는 시각적 트리의 일부가 아닌 부모가 없습니다.

Xaml::Controls::Canvas^ testCanvas = ref new Xaml::Controls::Canvas(); 
Xaml::Controls::Canvas^ childCanvas = ref new Xaml::Controls::Canvas(); 
testCanvas->Children->Append(childCanvas); 

int size = testCanvas->Children->Size; // size will be equal to 1 
if(!childCanvas->Parent) 
{ 
// this code is executed because ->Parent is null. Why is parent here null?? 
} 
aCanvasThatIsPartOfTheVisualTree->Children->Append(testCanvas); 
if(!childCanvas->Parent) 
{ 
// this code does not get executed because ->Parent is not null, now that testCanvas is part of the visual tree. 
} 

는 또한 부모 얻을 수있는 VisualTreeHelper를 사용하여 시도했다 :

Xaml::Controls::Canvas^ theParent = (Xaml::Controls::Canvas^)VisualTreeHelper::GetParent(childCanvas); 

을하고 behavour 남아 : testCanvas이 후 theParent가 testCanvas는 시각적 트리에 추가되기 전에 null의 경우, 및 null이 아닌 시각적 트리에 추가됩니다.

이것은 버그가 아닌 경우 누군가 부모가 시각적 트리의 일부가 아닌 subcanvas의 부모를 얻는 방법을 알려주시겠습니까? 버그 인 경우 알려진 해결 방법이 있습니까? 고맙습니다!

답변

1

VisualTreeHelper의 이름을 분리하면 "시각적 트리"도우미라는 것을 알 수 있습니다. 이는 요소의 시각적 부모를 얻음을 의미합니다. 현재 시각적 트리의 일부가 아닌 경우 VisualTreeHelper에 정의 된 부모가 없습니다. (VisualTreeHelper.GetParent에) here에서

:

는 시각적 트리에서 개체의 부모 오브젝트를 돌려줍니다. here에서

은 (FrameworkElement.Parent에있는 자신의 Parent 속성을 가져 제어) : 객체가 인스턴스화 된 경우

부모가 null이 될 수 있지만, 결국 페이지로 연결하는 객체 에 연결되어 있지 않습니다 오브젝트 루트. 기본 Windows 런타임 클래스에서 FrameworkElement의 부모는 null이 아닌 경우 FrameworkElement 하위 클래스가 될 것으로 예상 될 수 있습니다. 그러나 사용자 지정 클래스는이 가정이 사실이 아닌 경우 콘텐츠 모델을 도입 할 수 있습니다.

+0

설명해 주셔서 대단히 감사합니다. 비주얼 트리에 연결된 캔버스의 부모를 결정할 방법이 없습니까? – James

+0

잘 모르겠습니다. 나는 결코 전에 그것을 시도한 적이 없다. – mydogisbox

+0

시각 트리에 붙어 있지 않을 때 하나 이상의 항목이 자식으로 가질 수 있으므로 단일 "부모"는 이해가되지 않을 것이라고 생각합니다. 부모님 컬렉션이 있어야합니다. 고맙습니다! – James

관련 문제