2011-09-14 7 views
2

꽤 안절부절 못했지만, 내 Page에 두 개의 UserControl을 추가하려고 시도했는데 동일한 컨트롤 이름이 시각적 트리에 두 번 사용되었다는 예외가 있음을 알게되었습니다. 따라서 내 UserControl 안에있는 컨트롤의 이름이 지정되어 있으므로 한 번에 Page에이 UserControl 중 하나만 포함 할 수 있습니다. 이게 사실인가요, 아니면 뭔가를 깨닫지 못합니까? Microsoft는 코드 재사용을 포기 했습니까? 이것은 매우 절름발이입니다.페이지 당 Silverlight UserControl 인스턴스를 하나만 가질 수 있습니까?

편집 여기 온 사람, 나는 이것을 System.Resources.MissingManifestResourceException 예외를 얻고 있었다 들어

. 문제가 시각적 트리의 모호한 이름이라는 것을 알아내는 데 시간이 걸렸습니다. 바라기를 이것은 당신을 돕는다. 다음은 전체 예외 텍스트입니다.

또한 편집 여기

내 XAML입니다 :

<Grid x:Name="LayoutRoot"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 

    <TextBlock x:Name="HeaderText" 
     res:Strings.Assignment="Text=MachiningView_Name"/> 

    <sdk:TabControl Grid.Row="2"> 
     <sdk:TabItem Header="Projects"> 
      <ScrollViewer> 
       <Grid> 
        <controls:Organizer Margin="4" ItemsSource="{Binding ProjectSummaries}" Height="24" VerticalAlignment="Top"> 
         <controls:Organizer.GroupDescriptions> 
          <controls:OrganizerGroupDescription res:Strings.Assignment="Text=NoGroupingText" IsDefault="True" /> 
          <controls:OrganizerGroupDescription res:Strings.Assignment="Text=GroupOwnerEmailText"> 
           <controls:OrganizerGroupDescription.GroupDescription> 
            <helpers:OwnerEmailGroupDescription /> 
           </controls:OrganizerGroupDescription.GroupDescription> 
          </controls:OrganizerGroupDescription> 
          <controls:OrganizerGroupDescription res:Strings.Assignment="Text=GroupStoreNumberText"> 
           <controls:OrganizerGroupDescription.GroupDescription> 
            <helpers:StoreNumberGroupDescription /> 
           </controls:OrganizerGroupDescription.GroupDescription> 
          </controls:OrganizerGroupDescription> 
         </controls:Organizer.GroupDescriptions> 
        </controls:Organizer> 
       </Grid> 
      </ScrollViewer> 
     </sdk:TabItem> 
     <sdk:TabItem Header="Machine Queues"> 
      <ScrollViewer> 
       <Grid> 
        <controls:Organizer Margin="4" ItemsSource="{Binding ProjectSummaries}" Height="24" VerticalAlignment="Top"> 
         <controls:Organizer.GroupDescriptions> 
          <controls:OrganizerGroupDescription res:Strings.Assignment="Text=NoGroupingText" IsDefault="True" /> 
          <controls:OrganizerGroupDescription res:Strings.Assignment="Text=GroupOwnerEmailText"> 
           <controls:OrganizerGroupDescription.GroupDescription> 
            <helpers:OwnerEmailGroupDescription /> 
           </controls:OrganizerGroupDescription.GroupDescription> 
          </controls:OrganizerGroupDescription> 
          <controls:OrganizerGroupDescription res:Strings.Assignment="Text=GroupStoreNumberText"> 
           <controls:OrganizerGroupDescription.GroupDescription> 
            <helpers:StoreNumberGroupDescription /> 
           </controls:OrganizerGroupDescription.GroupDescription> 
          </controls:OrganizerGroupDescription> 
         </controls:Organizer.GroupDescriptions> 
        </controls:Organizer> 
       </Grid> 
      </ScrollViewer> 
     </sdk:TabItem> 
    </sdk:TabControl> 
</Grid> 

그리고 여기 내 사용자 컨트롤의 XAML입니다 : 당신은 UserControl을 추가 할 때

<StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=UserControl}"> 
    <sdk:Label Content="Page:" VerticalAlignment="Center" Margin="0,0,5,0"/> 

    <sdk:DataPager Name="_projectSummariesPager" 
        Margin="0,0,5,0" 
        DisplayMode="FirstLastPreviousNextNumeric" 
        Source="{Binding Path=ItemsSource}" 
        PageSize="10"/> 

    <ComboBox Name="_itemPerPageCombo" 
       Margin="0,0,5,0" 
       SelectionChanged="_itemPerPageCombo_SelectionChanged" 
       SelectedItem="{Binding Path=SelectedPageSize, Mode=TwoWay}" 
       SelectedValuePath="Value" 
       ItemsSource="{Binding Path=PageSizes}"/> 

    <ComboBox Name="_groupDescription" 
       Margin="0,0,5,0" 
       SelectionChanged="_groupDescription_SelectionChanged" 
       SelectedItem="{Binding Path=SelectedGroupDescription, Mode=TwoWay}" 
       ItemsSource="{Binding Path=GroupDescriptions}"/> 
</StackPanel> 
+0

@MichaelS, 나는 바보가 아닙니다. 그것은 컴파일조차되지 않을 것입니다. Reed가 아래에 저에게 가르쳐 주었던 것처럼 제 문제는 제가 전혀 이름을 지어주지 않았다는 것입니다. – Jordan

+1

@Jordan : 컨트롤의 이름을 지정하지 않아도 정상적으로이 문제가 발생하지 않습니다. SL 버전? Xaml? 좌절감을 제한하십시오. – AnthonyWJones

+0

@ 요르단, 그냥 도우려고 .. – MichaelS

답변

0

하면, 할당해야합니다 고유 한 이름 (예 :

)
<Page ... 
    <StackPanel> 
     <local:YourUserControl x:Name="Foo" /> 
     <!-- Make sure not to duplicate x:Name/Name here! --> 
     <local:YourUserControl x:Name="Bar" /> 
    </StackPanel> 
</Page> 
+0

실제로 내 사용자 컨트롤의 이름을 지정하는 것은 참신한 아이디어입니다. 그리고 그것은 진행되었습니다. – Jordan

1

Xaml의 요소에 주어진 이름은 이름 범위 내에서 고유해야합니다. LoadComponent를 실행할 때마다 새로운 네임 스코프가 생성됩니다. 따라서 UserControl 내의 이름은 컨트롤의 여러 인스턴스가 사용 된 경우 시각적 트리에서 충돌하지 않습니다.

그래서 지금 당장 나타나는 질문에 대한 대답은 당신이 뭔가 잘못하고 있기 때문입니다.

"무언가"가 무엇인지는 지금 불분명합니다. 아마도 xaml을 질문에 포함 시키면 도움이 될 것입니다.

편집 그래서 난 당신이 일을 추측하고있어 무엇 행간 읽기. 당신은 속성을 가지고 있습니다 UserControl이 있고 당신이하고있는 그래서 당신은 UserControl을 내 컨트롤은 이러한 속성에 바인딩 할 : -

<StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=UserControl}"> 

이 당신이에 <UserControl.. 요소에 Name="UserControl"를 추가 한 것을 나타냅니다 그 xaml의 꼭대기.

문제를 재현하는 방법을 찾을 수 없지만이 접근법이 문제가되는 SL 이전 버전의 문제점을 알고 있습니다. 개인적으로 필자는 컴포넌트의 외부 소비자에게 실제로 속한 속성을 설정하는 것을 피하는 것이 더 좋다고 생각합니다 (UserControl의 이름과 이름을 사용하는 페이지까지).

따라서 나의 접근 방식은 문제의 일종이 "UserControl을 자체 바인딩"을 해결하기 위해 : -

이 LayoutRoot가있는 UserControl 콘텐츠의 루트 최상위 Grid의 이름입니다
<StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=LayoutRoot.Parent}"> 

. 이 여전히 눈금의 Parent 속성을 통해 UserControl 자체에 바인딩합니다. 그러나이 자체 xaml UserControl 자체에 추가 할 이름이 필요하지 않습니다.

+0

XAML을 제공했습니다. 나는 내가 잘못하고있는 것을 아는 것에 정말로 관심이있다. – Jordan

+0

흥미 롭습니다. 예, Silverlight로 작업을 시작한 지 오래 전부터이 컨트롤을 만들었습니다. 조언 해 주셔서 감사합니다. – Jordan

관련 문제