Как отладить "указанный элемент уже является логическим потомком другого элемента" в выпуске
Я знаю, что должен опубликовать очень конкретный вопрос с примером кода, но я не знаю, с чего начать:
Во время работы моего приложения в Visual Studio все нормально, как в режиме отладки, так и в режиме выпуска. Но когда я создаю установщик InstallShield, на других компьютерах я получаю исключение:
System.Windows.Threading.Dispatcher WPF Указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключи
Я видел множество сообщений об этой проблеме в Stackru и в других сетях, но нет никаких упоминаний о том, что это происходит только в установленном пакете.
Мой вопрос двойной (извините за это тоже):
- Как я мог отладить такую проблему? Я имею в виду, особенно если это возможно (не общая отладка во время выполнения)
- Какое исключение я могу поймать, что дает мне больше информации об ошибке? Я отображаю MessageBox, который показывает ReflectionTypeLoadException. Я хотел бы увидеть, какой элемент имеет "двойной родитель" или "двойной ребенок".
Чтобы усложнить ситуацию, приложение отлично работает на компьютерах, которые я использую для разработки, но в других случаях происходит сбой (за исключением компьютеров моего отца и сестры).
ЛЮБАЯ подсказка будет оценена и должным образом оценена. Спасибо
-----------------------------------РЕДАКТИРОВАТЬ-------------- -----------------------
Мне удалось привязать проблемного потомка к TextBlock с именем "textAvisosSeccion" внутри ItemTemplate ListView:
<ListView ItemsSource="{Binding Secciones}" Background="{Binding MiColor}"
Style="{StaticResource NavigationMenuStyle}"
IsSynchronizedWithCurrentItem="True"
SelectedItem="{Binding SeccionActiva}"
Margin="0" MinWidth="{Binding RelativeSource={RelativeSource
AncestorType=ListBoxItem}, Path=ActualWidth}" HorizontalContentAlignment="Stretch">
<ListView.ItemTemplate>
<DataTemplate>
<DockPanel LastChildFill="True" HorizontalAlignment="Stretch">
<Grid DockPanel.Dock="Right" Margin="2,2,8,2"
Visibility="{Binding ElementName=textAvisosSeccion, Path=Visibility, FallbackValue=Collapsed}">
<Ellipse Height="25" Width="25" VerticalAlignment="Center"
Stroke="WhiteSmoke" StrokeThickness="1" Fill="OrangeRed"/>
<TextBlock x:Name="textAvisosSeccion" FontSize="12"
FontWeight="Medium" Foreground="WhiteSmoke"
VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center" Style="{StaticResource TextBlockNullZeroCollapsedStyle}"
Text="{Binding Value.Avisos}"/>
</Grid>
<TextBlock DockPanel.Dock="Left" Text="{Binding Metadata.NombreTraducido}" Margin="8,2" VerticalAlignment="Center" HorizontalAlignment="Stretch" TextAlignment="Center"/>
</DockPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Style x:Key="TextBlockNullZeroCollapsedStyle" TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="Text" Value="">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
<Trigger Property="Text" Value="0">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
</Style.Triggers>
</Style>
Проверьте привязку Text="{Binding Value.Avisos}". ListView связан с коллекцией Lazy<T>
импортируется с MEF, в котором T имеет свойство "Avisos". Другой TexkBlock привязан к Lazy<T>
Метаданные и это нормально.
Помимо причин, по которым я привязываюсь к значению Lazy (которое создает экземпляр объекта, теряя преимущество lazy), почему я получаю исключение "Указанный элемент уже является логическим потомком другого элемента" из-за этого?!?!?
Свойство "Avisos" - это просто целое число внутри ViewModel (которое не наследуется от UIElement).
РЕДАКТИРОВАТЬ № 2:
Такие исключения, как эта и другие (проблемы со стилями, проблемы с композицией MEF и т. Д.), Не создавались в VS2012, поскольку на этом компьютере был установлен.NET Framework 4.5. Даже когда все проекты ориентированы на Framework 4.0.
Если вы разрабатываете для 4.0, получите старую машину с Vista, убедитесь, что у вас установлена 4.0 и используется VS2010; Это единственный способ убедиться.
1 ответ
Это не реальный ответ на вопрос, но решение, которое я нашел для этой проблемы: установите.NET Framework 4.5 на клиентском компьютере, и приложение будет работать как очаровательная программа.
После удаления проблемного TextBlock приложение открывалось, но во многих местах вызывало одно и то же исключение, но без видимой причины: некоторые ViewModels и Views работали нормально, другие - нет. Конечно, все они построены одинаково, поэтому никаких объяснений нет.
Я нашел этот вопрос, относящийся к этой проблеме, но без хорошего ответа:
Для этого парня это создавало проблему, а не решало ее. Однако возникает страшный вопрос: как мы можем знать, что в следующей версии Framework все будет работать так же? Возможно, это была ошибка в 4.0, которая была исправлена в 4.5, и они не хотят об этом говорить.
Другая серьезная проблема заключалась в том, что исключение не дает реальной информации о том, какие элементы имеют проблему, поэтому делает его практически бесполезным для отладки. На каком-то форуме я обнаружил, что это было опубликовано в Microsoft как предложение по улучшению, и они неоднократно отклоняли его.
Надеюсь, что это кому-то поможет, и я также надеюсь, что кто-то скажет мне, как глубже понять, какой элемент жалуется.
Копирование РЕДАКТИРОВАТЬ #2 здесь также:
Такие исключения, как эта и другие (проблемы со стилями, проблемы с композицией MEF и т. Д.), Не создавались в VS2012, поскольку на этом компьютере был установлен.NET Framework 4.5. Даже когда все проекты ориентированы на Framework 4.0.
Если вы разрабатываете для 4.0, получите старую машину с Vista, убедитесь, что у вас установлена 4.0 и используется VS2010; Это единственный способ убедиться.