Как отладить "указанный элемент уже является логическим потомком другого элемента" в выпуске

Я знаю, что должен опубликовать очень конкретный вопрос с примером кода, но я не знаю, с чего начать:

Во время работы моего приложения в Visual Studio все нормально, как в режиме отладки, так и в режиме выпуска. Но когда я создаю установщик InstallShield, на других компьютерах я получаю исключение:

System.Windows.Threading.Dispatcher WPF Указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключи

Я видел множество сообщений об этой проблеме в Stackru и в других сетях, но нет никаких упоминаний о том, что это происходит только в установленном пакете.

Мой вопрос двойной (извините за это тоже):

  1. Как я мог отладить такую ​​проблему? Я имею в виду, особенно если это возможно (не общая отладка во время выполнения)
  2. Какое исключение я могу поймать, что дает мне больше информации об ошибке? Я отображаю 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 работали нормально, другие - нет. Конечно, все они построены одинаково, поэтому никаких объяснений нет.

Я нашел этот вопрос, относящийся к этой проблеме, но без хорошего ответа:

Изменилось ли поведение WPF 4.5 parent-child: теперь мы можем добавить дочерний элемент к другому без исключения родителю?

Для этого парня это создавало проблему, а не решало ее. Однако возникает страшный вопрос: как мы можем знать, что в следующей версии Framework все будет работать так же? Возможно, это была ошибка в 4.0, которая была исправлена ​​в 4.5, и они не хотят об этом говорить.

Другая серьезная проблема заключалась в том, что исключение не дает реальной информации о том, какие элементы имеют проблему, поэтому делает его практически бесполезным для отладки. На каком-то форуме я обнаружил, что это было опубликовано в Microsoft как предложение по улучшению, и они неоднократно отклоняли его.

Надеюсь, что это кому-то поможет, и я также надеюсь, что кто-то скажет мне, как глубже понять, какой элемент жалуется.

Копирование РЕДАКТИРОВАТЬ #2 здесь также:

Такие исключения, как эта и другие (проблемы со стилями, проблемы с композицией MEF и т. Д.), Не создавались в VS2012, поскольку на этом компьютере был установлен.NET Framework 4.5. Даже когда все проекты ориентированы на Framework 4.0.

Если вы разрабатываете для 4.0, получите старую машину с Vista, убедитесь, что у вас установлена ​​4.0 и используется VS2010; Это единственный способ убедиться.

Другие вопросы по тегам