Silverlight:"The name already exists in the tree" 银光: "名称已存在于树中"

4

在我编写Silverlight XAML时,经常出现的一个问题是:我创建了一个带有ToolTip的用户控件VerticalTabStop(代码附在下面)。我实例化了几个我的用户控件,然后我得到了调试窗口和以下错误:

Line:52
Error: Unhandled Error in Silverlight 2 Application
Code: 2028
Category: ParserError
Message: The name already exists in the tree: AltLabel.
File:
Line: 0
Position: 0

当我将鼠标指针悬停在按钮上时,我会收到很多这样的消息。您有什么建议我做错了吗?

谢谢。

Nik


<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    x:Class="SLEntityPresenterWebPart.VerticalTabStop"
    d:DesignWidth="20" d:DesignHeight="27">

    <Grid x:Name="LayoutRoot">
        <StackPanel>
            <Canvas x:Name="TabStopCanvas" Height="27" Width="20">
                <ToolTipService.ToolTip>
                    <TextBlock x:Name="AltLabel" Text="Substitute me"/>
                </ToolTipService.ToolTip>
                <Image x:Name="IconImg" Canvas.Left="7" Canvas.Top="9" Width="26" Height="26" Source="Contact.png" Canvas.ZIndex="5" Margin="0,-9,0,0" RenderTransformOrigin="0.5,0.5">
                    <Image.RenderTransform>
                        <TransformGroup>
                            <ScaleTransform ScaleX="0.85" ScaleY="0.85"/>
                            <SkewTransform/>
                            <RotateTransform/>
                            <TranslateTransform X="0"/>
                        </TransformGroup>
                    </Image.RenderTransform>
                </Image>
                <Image Source="stop.png" Margin="3,0,0,0"/>
            </Canvas>

        </StackPanel>
    </Grid>
</UserControl>
4个回答

10

即使在 Silverlight 4 中也存在非常相似的 bug。 如果您创建自定义用户控件,通常:

<UserControl xmlns:MyNameSpace="clr-namespace:MyNameSpace" x:Class="MyNameSpace.MyClass" 
x:Name="userControl" ... />

然后,如果你在 XAML 代码中添加两个没有名称的控件(预览):

<MyNameSpace:MyClass ... />
<MyNameSpace:MyClass ... />

会抛出异常“The name already exists in the tree: userControl”。这是因为Silverlight找不到名称(未命名的[MyClass]),并查找UserControl,在那里它找到了两个“userControl”。

其中一个解决方案是给控件一些名称:

<MyNameSpace:MyClass x:Name = "MyControl1" ... />

或者通过代码初始化此控件:

MyClass control = new MyClass();
SomeGrid.Children.Add(control);

这似乎是SL 4.0.60310.0中的一个错误,但在4.0.50826.0中则没有。 - Mark Foreman

5

这是Silvelight中的一个bug。解决方法是在Tooltip中的TextBlock上移除Name属性。

我猜想您之前出于某些原因在那里加了名称,而无法从代码中引用该元素可能会给您带来麻烦。作为解决方案,请尝试用以下代码替换tooltip xaml:

<ToolTipService.ToolTip>
    <ToolTip x:Name="AltLabel" Content="Substitute me" />
</ToolTipService.ToolTip>

现在您可以通过执行AltLabel.Content来访问文本。如果这不能解决您的问题,请告诉我。

非常感谢,我不知道这是Silverlight中的一个错误,你的解决方案起了作用 :-) - niklassaers-vc

1
尝试在堆栈面板中删除任何类似于“x:Name =“TabStopCanvas””这样的名称,这对我有用。

1
昨天我也遇到了同样的问题... 解析器错误 - 名称已存在于树中:blah

在我的情况下,问题是某种方式添加了一个引用...到它自己。(项目的DLL在项目自己的bin/debug文件夹中)。删除此引用解决了问题。

看起来这个错误信息太模糊了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接