2011-09-14 39 views
2

它非常蹩脚,但我尝试在我的Silverlight Page中添加两个UserControl,我得到一个异常告诉我(通过深入挖掘)相同的控件名称已被用于视觉树两次。因此,我的UserControl中的控件已命名,所以我只能将UserControl中的一个仅包含在Page中。这是真的,还是我没有意识到什么?微软真的放弃了代码重用吗?这是非常蹩脚的。为什么我每页只能有一个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:

<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,我不是个白痴。这甚至不会编译。正如里德教给我的,我的问题是,我根本没有给他们任何名字。 – Jordan

+1

@Jordan:未命名您的控件不会导致此问题正常。 SL的版本? XAML?试着限制你的挫折感。 – AnthonyWJones

+0

@Jordan,只是试图帮助.. – 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,我们可以帮你。

编辑

字里行间所以阅读这是我猜你在做什么。您有对性能数字的用户控件,并且希望在用户控件中的控件绑定到这些属性,所以你这样做是: -

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

这表明你已经在增加Name="UserControl"<UserControl..元素它的xaml的顶部。

我不能完全找到一种方法来重现您的问题,但我意识到早期版本的SL在这种方法存在问题的问题。就我个人而言,我认为最好避免设置属于组件的外部使用者的属性(它直到使用UserControl它的名称的页面以及它是否应该有名称)。

因此,我的办法来解决这个“绑定到该用户控件本身”之类的问题: -

<StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=LayoutRoot.Parent}"> 

其中LayoutRoot是顶级Grid这是用户控件内容的根目录的名称。这仍然通过网格的Parent属性绑定到UserControl本身。但是,这不需要将名称添加到自己的xaml中的UserControl本身。

+0

我提供了我的XAML。我真的很想知道我做错了什么。 – Jordan

+0

有趣。是的,很久以前我开始使用Silverlight时创建了这个控件。谢谢你的建议。 – Jordan

相关问题