Silverlight: & # 8220; Le nom existe déjà dans l’arborescence & # 8221;
-
03-07-2019 - |
Question
C’est un problème qui se pose régulièrement lorsque j’écris Silverlight XAML. Dans ce cas, j'ai créé un contrôle utilisateur VerticalTabStop (code attaché) auquel une info-bulle est attachée. J'instancie quelques-uns de mes contrôles utilisateur, puis j'obtiens la fenêtre de débogage et l'erreur suivante:
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
Je reçois énormément de ces messages lorsque je passe la souris sur les boutons. Des suggestions à ce que je fais mal ici?
A bientôt
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>
La solution
Ceci est un bug dans Silvelight. La solution consiste à supprimer l'attribut Name du TextBlock dans l'info-bulle.
Je présume que le nom y figure pour une raison et que le fait de ne pas pouvoir se référer à cet élément à partir de code va poser un problème. Pour contourner ce problème, essayez de remplacer l'info-bulle xaml par ceci:
<ToolTipService.ToolTip>
<ToolTip x:Name="AltLabel" Content="Substitute me" />
</ToolTipService.ToolTip>
Vous pouvez maintenant accéder au texte en faisant AltLabel.Content. Si cela ne résout pas votre problème, faites-le moi savoir.
Autres conseils
Il y a un bug très similaire, même dans Silverlight 4. Si vous créez un contrôle utilisateur personnalisé, généralement:
<UserControl xmlns:MyNameSpace="clr-namespace:MyNameSpace" x:Class="MyNameSpace.MyClass"
x:Name="userControl" ... />
Ensuite, si vous ajoutez 2 contrôles sans nom au code xaml (avec aperçu):
<MyNameSpace:MyClass ... />
<MyNameSpace:MyClass ... />
Il y aura une exception "Le nom existe déjà dans l’arborescence: utilisateurControl". Cela se produit car Silverlight ne peut pas trouver le nom (non nommé [MyClass]) et cherche le contrôle UserControl où il trouve "userControl "". deux fois.
Une des solutions consiste à donner des noms aux contrôles:
<MyNameSpace:MyClass x:Name = "MyControl1" ... />
Ou initialisez ce contrôle à partir du code:
MyClass control = new MyClass();
SomeGrid.Children.Add(control);
Je me débattais avec le même message hier ... ParserError - Le nom existe déjà dans l'arborescence: Blah
Dans mon cas, le problème était qu’une référence avait été ajoutée ... à elle-même. (La DLL du projet dans le dossier bin / debug du projet). Supprimer cette référence a réglé le problème.
Il semble que ce message d'erreur soit trop vague.
Essayez de supprimer tout nom tel que 'x: Name = " TabStopCanvas " 'dans le panneau de pile, cela a fonctionné pour moi.