Silverlight: “O nome já existe na árvore”
-
03-07-2019 - |
Pergunta
este é um problema que regularmente surge quando eu escrevo Silverlight XAML. Neste caso, eu fiz um usercontrol VerticalTabStop (código em anexo) que tem uma dica de ferramenta anexada. I instanciar um par de meus usercontrols, e então eu começo a janela de depuração e o seguinte erro:
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
Eu recebo uma enorme quantidade dessas mensagens como eu passe o mouse sobre os botões. Todas as sugestões para o que estou fazendo de errado aqui?
Felicidades
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>
Solução
Este é um bug no Silvelight. A maneira de trabalhar em torno dele é remover o atributo Nome na TextBlock na dica.
Eu presumo que você tem o nome lá por uma razão, e que não ser capaz de se referir a este elemento a partir do código vai ser um problema para você. Como uma solução para isso, tente substituir o XAML dica com este:
<ToolTipService.ToolTip>
<ToolTip x:Name="AltLabel" Content="Substitute me" />
</ToolTipService.ToolTip>
Agora você pode obter com o texto, fazendo AltLabel.Content. Se isso não resolver o problema, por favor me avise.
Outras dicas
Há bug muito similar mesmo em Silverlight 4. Se você criar usercontrol costume, geralmente:
<UserControl xmlns:MyNameSpace="clr-namespace:MyNameSpace" x:Class="MyNameSpace.MyClass"
x:Name="userControl" ... />
Então, se você adicionar 2 controles sem nomes ao código XAML (com visualização):
<MyNameSpace:MyClass ... />
<MyNameSpace:MyClass ... />
Haverá exceção "O nome já existe na árvore: UserControl". Isto ocorre porque o Silverlight não é possível encontrar o nome (sem nome [MyClass]) e olha para o UserControl onde se encontra "UserControl" duas vezes.
Uma das soluções é dar alguns nomes para os controles:
<MyNameSpace:MyClass x:Name = "MyControl1" ... />
ou inicializar este controle de código:
MyClass control = new MyClass();
SomeGrid.Children.Add(control);
Eu estava lutando com a mesma mensagem de ontem ... ParserError - O nome já existe na árvore: blá
No meu caso o problema era que de alguma forma uma referência foi adicionado ... a si mesmo. (A DLL do projeto nos própria pasta bin / debug projetos). A remoção desta referência resolvido o problema.
Parece que esta mensagem de erro é demasiado vago.
Tente remover qualquer nome como 'x: Name = 'TabStopCanvas'' no painel de pilha, ele trabalhou para mim.