它非常蹩脚,但我尝试将两个UserControl
添加到我的Silverlight Page
,我得到一个例外告诉我(通过大量挖掘)相同的控件名称已被用于视觉树两次。因此,UserControl
中的控件已命名,因此我一次只能将UserControl
中的一个包含到Page
中。这是真的吗,还是我没有意识到什么?微软真的放弃了代码重用吗?这非常蹩脚。
编辑
对于来到这里的人来说,我得到的是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 :(得分:1)
Xaml中元素的名称在 namescope 中必须是唯一的。 LoadComponent的每次执行都会创建一个新的名称范围。因此,当使用多个控件实例时,UserControl
中的名称在可视树中不会发生冲突。
现在问题的答案是:因为你做错了什么。
现在还不清楚“某事”是什么。也许如果您在问题中包含您的xaml,我们可以帮助您。
修改强>
所以在这两行之间阅读这是我猜你正在做的事情。你有一个UserControl,它有一个属性编号,你希望UserControl中的控件绑定到这些属性,所以你这样做: -
<StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=UserControl}">
这表示您已将Name="UserControl"
添加到其xaml顶部的<UserControl..
元素。
我无法找到重现问题的方法,但我知道早期版本的SL存在问题,这种方法存在问题。我个人认为最好避免设置真正属于组件外部使用者的属性(它直到使用UserControl的页面,它的名称是什么以及它是否应该有名称)。
因此,我的方法是解决这个“绑定到UserControl本身”的问题: -
<StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=LayoutRoot.Parent}">
其中LayoutRoot是顶级Grid
的名称,它是UserControl内容的根。这仍然通过Grid的Parent
属性绑定到UserControl本身。但是,这不需要在其自己的xaml中将名称添加到UserControl本身。
答案 1 :(得分:0)
添加UserControl时,请确保为其指定唯一名称,即:
<Page ...
<StackPanel>
<local:YourUserControl x:Name="Foo" />
<!-- Make sure not to duplicate x:Name/Name here! -->
<local:YourUserControl x:Name="Bar" />
</StackPanel>
</Page>