Сильверлайт:«Имя уже существует в дереве»
-
03-07-2019 - |
Вопрос
эта проблема регулярно возникает, когда я пишу Silverlight XAML.В этом случае я создал пользовательский элемент управления UpperTabStop (код прилагается), к которому прикреплена всплывающая подсказка.Я создаю экземпляр нескольких своих пользовательских элементов управления, а затем получаю окно отладки и следующую ошибку:
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>
Решение
Это ошибка в Silvelight.Чтобы обойти эту проблему, необходимо удалить атрибут Name в TextBlock во всплывающей подсказке.
Я предполагаю, что у вас есть имя по какой-то причине, и что невозможность сослаться на этот элемент из кода будет для вас проблемой.В качестве обходного пути попробуйте заменить xaml всплывающей подсказки следующим:
<ToolTipService.ToolTip>
<ToolTip x:Name="AltLabel" Content="Substitute me" />
</ToolTipService.ToolTip>
Теперь вы можете добраться до текста, выполнив AltLabel.Content.Если это не решит вашу проблему, пожалуйста, дайте мне знать.
Другие советы
Очень похожая ошибка есть даже в Silverlight 4.Если вы создаете собственный пользовательский элемент управления, обычно:
<UserControl xmlns:MyNameSpace="clr-namespace:MyNameSpace" x:Class="MyNameSpace.MyClass"
x:Name="userControl" ... />
Затем, если вы добавите в код xaml 2 элемента управления без имен (с предварительным просмотром):
<MyNameSpace:MyClass ... />
<MyNameSpace:MyClass ... />
Возникнет исключение «Имя уже существует в дереве:Пользовательский контроль».Это происходит потому, что Silverlight не может найти имя (без имени [MyClass]) и обращается к UserControl, где дважды находит «userControl».
Одно из решений — дать элементам управления несколько имен:
<MyNameSpace:MyClass x:Name = "MyControl1" ... />
Или инициализируйте этот элемент управления из кода:
MyClass control = new MyClass();
SomeGrid.Children.Add(control);
Вчера я боролся с тем же сообщением...ParserError — имя уже существует в дереве: бла
В моем случае проблема заключалась в том, что каким-то образом была добавлена ссылка...самому себе.(DLL проекта находится в собственной папке bin/debug проекта).Удаление этой ссылки решило проблему.
Кажется, это сообщение об ошибке слишком расплывчато.
Попробуйте удалить любое имя типа «x:Name="TabStopCanvas"» на панели стека, у меня это сработало.