2011-09-14 79 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

相關問題