2011-04-21 5 views
3

이상한 동작이 나타납니다. 나는 그것이 .net toolchain의 버그라는 강한 느낌을 가지고있다.첨부 된 특성이 이상한 WPF 오류

단계 재현 :

  1. 는 WPF 응용 프로그램을 만듭니다.
  2. 해당 솔루션에서 클래스 라이브러리를 만듭니다.
  3. 클래스 라이브러리에서 일부 공용 클래스 (비어있을 수 있음)를 정의하십시오.
  4. 첨부 된 속성 및 Window를 대상 클래스로하여 WPF 응용 프로그램의 일부 클래스를 정의하십시오.
  5. 는 윈도우에 부착하고 값을

을 제공 그리고 당신은 오류 얻을 : 당신이 구조를 변경하는 경우

The object 'Window' already has a child and cannot add ''. 'Window' can accept only one child.

동일한 어셈블리에 연결된 속성 및 값 클래스 (와 그 클래스가 될 두 클래스 라이브러리 수 또는 Wpf 응용 프로그램) 잘 작동합니다.

내용 뒤에 코드를 넣으면 잘 작동합니다. 이 오류를 제공합니다 :

<Window x:Class="WpfApplication9.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:my="clr-namespace:ClassLibrary1;assembly=ClassLibrary1" 
     xmlns:my2="clr-namespace:ClassLibrary1" 
     Title="MainWindow" Height="350" Width="525"> 

    <my2:Property.MyProperty> 
     <my:ValueClass /> 
    </my2:Property.MyProperty> 

    <Grid> 

    </Grid> 
</Window> 

이되지 않습니다

<Grid> 

</Grid>  

<my2:Property.MyProperty> 
    <my:ValueClass /> 
</my2:Property.MyProperty> 

어떤 아이디어?

감사합니다.

답변

3

이는 XAML이 컴파일되는 자체 참조 방식으로 인해 발생합니다. 연결된 속성 인 응용 프로그램 어셈블리가 포함 된 어셈블리에 대한 네임 스페이스 참조가 있지만 XAML 컴파일러에서 요소 구문이 연결된 속성을 참조하는지 결정할 때 바로 어셈블리가 컴파일되는 과정에 있습니다. 일반 요소가 아닙니다.

당신이 발견 한 것처럼, 내용 뒤에 첨부 된 속성을 두는 것은 불완전한 정보로도 올바른 선택을하기위한 충분한 힌트입니다. 다른 한편, 이것이 문제라는 것을 알기 만하면 첨부 된 속성을 외부 어셈블리 (예 : 컨트롤 라이브러리)에 넣을 수 있습니다. 그러면 닭고기 및 달걀 문제도 피할 수 있습니다.

완벽한 세상에서 C# 컴파일러와 XAML 컴파일러는 완전히 통합되어이 문제는 사라지 겠지만 해결 방법을 사용해야합니다.

편집 : 조금 복잡하기 때문에

또 다른이를 설명하려고합니다.

응용 프로그램 어셈블리를 컴파일하면 C#과 XAML이 모두 포함됩니다. 위의 샘플 코드에서 XAML은 동일한 어셈블리의 C# 코드에 정의 된 연결된 속성을 나타냅니다. 따라서 XAML 컴파일러에는 Property.MyProperty이 연결된 속성임을 알기 위해 응용 프로그램 어셈블리의 컴파일 된 버전이 있어야합니다. 그러나 C# 컴파일러는 XAML이 컴파일되지 않았기 때문에 아직 응용 프로그램 어셈블리를 컴파일 할 수 없습니다.이것은 닭고기와 계란의 문제입니다. C#과 XAML은 서로 의존합니다.

응용 프로그램 어셈블리가 아직 컴파일되지 않은 경우에도 XAML 컴파일러가 불완전한 정보로 응용 프로그램의 XAML 파일을 컴파일하려고합니다. 이렇게하는 과정에서 동일한 어셈블리에 정의 된 연결된 속성을 감지하지 못하는 실수를 할 수 있습니다. 때로는 왜 작동합니까? 몇 가지 일반적인 사례를 처리하기 위해 어느 정도 노력을 기울여 왔으므로 대부분의 경우 작동하는 것처럼 보이지만 발견 한대로 항상 작동하지는 않습니다.

가장 쉬운 방법은 첨부 된 속성을 외부 어셈블리로 이동하는 것입니다. 컨트롤과 같은 부착 된 속성은 일반적으로 라이브러리와 연관되어 있으므로 문제는 일반적으로 발생하지 않습니다.

+0

@Rick Sladkey 첫 단락을 명확하게 이해하지 못했지만 약간 확장 할 수 있습니까? 또한 연결된 속성은 XAML이 살고있는 어셈블리와 동일합니다.이 값은 다른 어셈블리에 있습니다. – Andrey

+0

@Andrey : 물론입니다. 나는 대답에 조금 더 덧붙였다. –

+0

@Rick Sladkey 감사합니다. 매우 흥미 롭습니다. 그러나 귀하의 설명에 따라 두 클래스가 모두 작동 할 때 왜 그것이 작동하는지 이해할 수 없습니다 : XAML이 살고있는 동일한 어셈블리에 가치가있는 속성과 값이 사용되었습니다. – Andrey