2009-07-23 5 views
6
<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="Window1"> 
    <Grid> 
     <local:ElementType x:Name="FirstElementName"> 
      <local:ElementType x:Name="SecondElementName" Grid.Column="1" Grid.Row="1" /> 
     </local:ElementType> 
    </Grid> 
</Window> 

그리고 이것은 다른 파일에 ...사용자 지정 XAML 요소를 중첩 할 수 있습니까?

<Grid x:Name="InternalElementName" x:Class="WpfApplication1.ElementType" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1"> 
</Grid> 

그리고 ...

public partial class ElementType : System.Windows.Controls.Grid { } 

모든 두 번째 요소를 제외하고 잘 작동합니다.
오류가 발생합니다.
요소 'ElementType'에 이름 속성 값 'SecondElementName'을 설정할 수 없습니다. 'ElementType'은 'ElementType'요소의 범위에 속하며, 이미 다른 범위에서 정의 된 이름이 등록되어 있습니다.

사용자 정의 격자가 올바르게 정의되었습니다. 코드는이 오류의 원인이 무엇

Window1.xaml

에 --- ---

x:Name="SecondElementName" 

를 컴파일하고 나는 건물 밖으로 가지고가는 경우에 실행됩니다? 어떻게해야합니까? 나는이 맞춤형 격자 중 하나를 다른 격자 안에 중첩시켜야하며, 둘 모두에 이름이 필요하므로 별도의 데이터에 바인딩 할 수 있습니다.

미리 감사드립니다. 당신이 다른 내 일을 원하는 경우에

답변

5

중첩 된 태그 개체를 사용하여 수행 할 작업을 알기 위해 XAML 파서는 .NET 클래스가 이러한 자식에 대한 컨테이너로 사용할 기본 "콘텐츠"속성을 정의하는지 여부를 확인합니다. 이 작업은 "ContentPropertyAttribute"를 사용하여 수행됩니다.

[ContentProperty("Children")] 
public partial class ElementType : Grid 
{ 
    // your code here... 
} 
: 난 당신이 중첩 된 객체가 그리드 내부에 가고 싶어하고, 그리드의 아이들이 "어린이"속성 컬렉션 이동하기 때문에, 당신은 단지 다음을 수행 할 필요가 추측하기 때문에 귀하의 경우에는

,

컨트롤에 자식을 추가 할 때 (예 : 특정 형식 만 ElementType 컨트롤의 자식이 될 수 있도록 허용) 논리를 수행해야하는 경우 대신 IAddChild에서 상속하고 AddChild 및 AddText 메서드를 구현할 수 있습니다.

이름 지정 문제에 대해서는 훑어보기 컨트롤 만 인스턴스화 된 범위에있는 명명 된 자식을 가질 수 있습니다. 그래서 기본적으로 ElementType.xaml 내부에 명명 된 자식을 가질 수 있지만 ElementType을 인스턴스화하는 다른 마크 업에는 명명 된 자식을 포함 할 수 없습니다. 논리적 인 트리나 무언가를 최적화하는 방식 때문이라고 생각합니다. 흠 잡을 데없는 컨트롤은 코드 만있는 컨트롤입니다. 그리드 클래스를 평범하지 않은 빈 서브 클래스로 변환하면 작동합니다 :

public class ElementType : Grid 
{ 
} 

예! 적은 코드!

+0

이것도 흥미 롭습니다. 그러나 여전히 부모와 자식 ElementType 객체에 다른 이름을 부여하는 것을 허용하지 않습니다. 아무도 내가 어떻게 그들을 서로에게서 분리되게 할 수 있는지 안다? – Giffyguy

+0

오, 그래, 미안 ... 위의 내 대답을 완료합니다. – Ludovic

1

, 첫 번째의 Content 속성에 내부에 1 점을 추가하는 듯 싶어 : 또한

<local:ElementType x:Name="FirstElementName"> 
    <local:ElementType.Content> 
     <local:ElementType x:Name="SecondElementName" Grid.Column="1" Grid.Row="1" /> 
    </local:ElementType.Content> 
</local:ElementType> 

, 난 당신이 여기에 달성하려는 모르겠어요 ,하지만 나는 그것을 두려워한다.

+0

소리. 최종 판결에 관해서 : HA! 나는 의도적으로 구체적인 것을 버릴 수있는 것을 버렸습니다. --- 나를 믿으십시오, 당신은 알고 싶지 않습니다. 귀하의 솔루션에 관해서, 나는 오류가 발생합니다 : "Contentable은 'ElementType'유형에서 찾을 수 없습니다."Grid.Content "를 그 자리에서 시도했는데 대략 같은 오류가 발생합니다. 더 이상의 아이디어? – Giffyguy

+0

"콘텐츠"가 아니라 "어린이"를 의미했습니다. 그래도 그걸 가지고있는 것 같아. –

0

UserControl을 변경하지 않으려는 경우 첨부 된 동작을 사용하십시오. XAML- 컴파일이 실패한 곳에서 필요합니다. 문제를 일으키는 모든 UserControl에 대해 하나의 동작 만.XAML에서

:

<preview:PreviewControl> 
    <i:Interaction.Behaviors> 
     <behaviors:UserControlNameBehavior Name="ICanSetNames"/> 
    </i:Interaction.Behaviors> 
</preview:PreviewControl> 

C에서 # :이 향하고 오른쪽 방향이 같은

public class UserControlNameBehavior : Behavior<UserControl> 
    { 
     public string Name { get; set; } 

     protected override void OnAttached() 
     { 
      this.AssociatedObject.Loaded += OnLoaded; 
      base.OnAttached(); 
     } 

     private void OnLoaded(object sender, RoutedEventArgs routedEventArgs) 
     { 
      this.AssociatedObject.Name = this.Name; 
     } 
    } 
+0

Behavior 클래스 란 무엇입니까? 나는 무엇인가? –

관련 문제