为什么每页只能有一个Silverlight UserControl实例?
这很蹩脚,但我尝试在Silverlight为什么每页只能有一个Silverlight UserControl实例?,silverlight,user-controls,visual-tree,Silverlight,User Controls,Visual Tree,这很蹩脚,但我尝试在Silverlight页面中添加两个UserControl,我得到一个异常,告诉我(通过大量挖掘)相同的控件名称已经被用于可视化树两次。因此,我的UserControl中的控件被命名,因此我一次只能在页面中包含一个UserControl。这是真的,还是我没有意识到什么?微软真的放弃了代码重用吗?这太差劲了 编辑 对于来到这里的人,我得到的是System.Resources.MissingManifestResourceException异常。花了一些时间才发现问题在于可视化树
页面中添加两个UserControl
,我得到一个异常,告诉我(通过大量挖掘)相同的控件名称已经被用于可视化树两次。因此,我的UserControl
中的控件被命名,因此我一次只能在页面中包含一个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>
添加UserControl时,请确保为其指定唯一的名称,即:
<Page ...
<StackPanel>
<local:YourUserControl x:Name="Foo" />
<!-- Make sure not to duplicate x:Name/Name here! -->
<local:YourUserControl x:Name="Bar" />
</StackPanel>
</Page>
为Xaml中的元素指定的名称在名称范围内必须是唯一的。LoadComponent的每次执行都会创建一个新的名称范围。因此,当使用控件的多个实例时,UserControl
中的名称在可视化树中不会冲突
所以现在这个问题的答案是:因为你做错了什么
什么是“某物”目前还不清楚。也许如果您在问题中包含您的xaml,我们可以帮助您
编辑
所以从字里行间看,这就是我猜你在做的。您有一个UserControl,它的属性有一个数字,您希望UserControl中的控件绑定到这些属性,因此您要执行以下操作:-
<StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=UserControl}">
其中LayoutRoot是顶级网格的名称,它是UserControl内容的根。这仍然通过网格的Parent
属性绑定到UserControl本身。但是,这不需要在自己的xaml中将名称添加到UserControl本身。实际上命名我的用户控件,这是一个新颖的想法。它成功了,进步真是太好了@迈克尔,我不是白痴。那甚至不会编译。正如里德在下面教我的,我的问题是我根本没有给它们命名。@Jordan:不给你的控件命名通常不会导致这个问题。SL的版本?Xaml?尽量限制你的挫败感。@Jordan,只是试图帮助..@AnthonyWJones,Visual Studio 2010,.Net 4.0(带有一些3.5外部依赖项)、Silverlight 4,我并不沮丧。对不起。@MichaelS,我为明显的炎症反应感到抱歉。我经常被人给我愚蠢的答案,我把你的错误理解为其中之一。再次抱歉,我已经提供了我的XAML。我真的很想知道我做错了什么。是的,很久以前我开始使用Silverlight时创建了这个控件。谢谢你的建议。
<StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=LayoutRoot.Parent}">