【问题标题】:How come I can only have one instance of a Silverlight UserControl per page?为什么我每页只能有一个 Silverlight UserControl 实例?
【发布时间】:2011-09-14 18:37:12
【问题描述】:

它很蹩脚,但我尝试在我的 Silverlight Page 中添加两个 UserControl,但我得到一个异常,告诉我(经过大量挖掘)相同的控件名称已用于视觉树两次。因此,我的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>

【问题讨论】:

  • @MichaelS,我不是白痴。那甚至不会编译。正如里德在下面教我的那样,我的问题是我根本没有给它们命名。
  • @Jordan:不命名控件通常不会导致此问题。 SL 版本? Xml?试着限制你的挫败感。
  • @Jordan,只是想帮忙..
  • @AnthonyWJones,Visual Studio 2010,.Net 4.0(带有一些 3.5 外部依赖项),Silverlight 4,我并不感到沮丧。对不起。
  • @MichaelS,对于明显的炎症反应,我深表歉意。我经常得到非常愚蠢的答案,我把你的答案误读为其中之一。再次抱歉。

标签: silverlight user-controls visual-tree


【解决方案1】:

为 Xaml 中的元素指定的名称在 名称范围 内必须是唯一的。 LoadComponent 的每次执行都会创建一个新的名称范围。因此,当使用控件的多个实例时,UserControl 中的名称不会在可视树中发生冲突。

因此,目前问题的答案是:因为你做错了什么。

目前还不清楚“某物”是什么。也许如果您在问题中包含您的 xaml,我们可以为您提供帮助。

编辑

所以在字里行间阅读这就是我猜你正在做的事情。您有一个 UserControl,它有一个属性编号,并且您希望 UserControl 中的控件绑定到这些属性,因此您可以这样做:-

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

这表明您已将Name="UserControl" 添加到其xaml 顶部的&lt;UserControl.. 元素。

我无法完全找到重现您的问题的方法,但我知道早期版本的 SL 存在问题,这种方法存在问题。就我个人而言,我认为最好避免设置真正属于组件的外部使用者的属性(它取决于使用您 UserControl 的页面,它的名称是什么以及它是否应该有名称)。

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

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

其中 LayoutRoot 是顶级 Grid 的名称,它是 UserControl 内容的根。这仍然通过 Grid 的 Parent 属性绑定到 UserControl 本身。但是,这不需要在其自己的 xaml 中将名称添加到 UserControl 本身。

【讨论】:

  • 我已经提供了我的 XAML。我真的很想知道我做错了什么。
  • 有趣。是的,我很久以前开始使用 Silverlight 时创建了这个控件。感谢您的建议。
【解决方案2】:

当您添加 UserControl 时,请确保为其分配一个唯一的名称,即:

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

【讨论】:

  • 实际上命名我的用户控件,这是一个新颖的想法。它奏效了,祝你进步!
猜你喜欢
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多