2009-03-03 9 views
4

Dies ist ein Problem, das regelmäßig auftritt, wenn ich Silverlight XAML schreibe. In diesem Fall habe ich eine Benutzersteuerung für VerticalTabStop (Code angehängt), an die eine QuickInfo angehängt ist. Ich instanziieren ein paar meiner Benutzersteuerelemente, und dann erhalte ich die Debug-Fenster und den folgenden Fehler:Silverlight: "Der Name existiert bereits in der Struktur"

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 

ich eine ganze Menge dieser Nachrichten, wie ich meine Maus über die Tasten schweben. Irgendwelche Vorschläge, was ich hier falsch mache?

Prost

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> 

Antwort

5

Dies ist ein Fehler in Silvelight. Die Möglichkeit, das Problem zu umgehen, besteht darin, das Name-Attribut im TextBlock im Tooltip zu entfernen.

Ich nehme an, dass Sie den Namen aus einem bestimmten Grund haben, und dass es nicht möglich sein wird, auf dieses Element aus dem Code zu verweisen, wird ein Problem für Sie sein. Als Arbeit um für das, versuchen, den Tooltip XAML mit diesem ersetzen:

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

Jetzt können Sie den Text erhalten, indem AltLabel.Content tun. Wenn dies Ihr Problem nicht löst, lassen Sie es mich bitte wissen.

+0

Vielen Dank, ich hatte keine Ahnung, das war ein Fehler in Silverlight, Ihre Lösung hat den Trick :-) –

10

Es ist sehr ähnlich Fehler auch in Silverlight 4. Wenn Sie benutzerdefinierte Usercontrol erstellen, in der Regel:

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

Dann, wenn Sie hinzufügen, 2 Kontrollen ohne Namen zu dem XAML-Code (mit Vorschau):

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

Es wird eine Ausnahme geben "Der Name existiert bereits in der Struktur: userControl". Dies tritt auf, weil Silverlight den Namen (unbenanntes [MyClass]) nicht finden kann und das UserControl zweimal nach "userControl" sucht.

Einer der Lösung ist es, einige Namen zu den Kontrollen zu geben:

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

Oder diese Steuerung von Code initialisiert werden:

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

Dies scheint ein Fehler in SL 4.0.60310.0, aber nicht in 4.0.50826.0 zu sein –

1

Ich war gestern mit der gleichen Botschaft zu kämpfen ... ParserError - Der Name existiert bereits im Baum:blah

In meinem Fall war das Problem, dass irgendwie eine Referenz hinzugefügt wurde ... zu sich selbst. (Die DLL des Projekts im projekteigenen bin/debug-Ordner). Durch das Entfernen dieser Referenz wurde das Problem behoben.

Scheint, dass diese Fehlermeldung zu vage ist.

1

Versuchen Sie, einen Namen wie 'X: Name = "TabStopCanvas"' im Stack-Panel zu entfernen, es funktionierte für mich.