2

我知道我应该用代码示例发布一个非常具体的问题,但我不知道从哪里开始:

在 Visual Studio 中运行我的应用程序时,在调试和发布模式下都可以。但是,当我创建 InstallShield 安装程序时,在其他计算机上出现异常:

System.Windows.Threading.Dispatcher WPF 指定元素已经是另一个元素的逻辑子元素。先断网

我在 StackOverflow 和其他网站上看到了大量关于这个问题的帖子,但没有任何参考资料表明这只发生在已安装的包中。

我的问题是双重的(也很抱歉):

  1. 我怎么可能调试这样的问题?我的意思是,特别是如果可能的话(不是通用的运行时调试)
  2. 我可以捕获什么样的异常来提供有关错误的更多信息?我正在显示一个显示 ReflectionTypeLoadException 的 MessageBox。我很想知道哪个元素是具有“双亲”或“双子”的元素。

更复杂的是,该应用程序在我用于开发的计算机上运行良好,但在其他计算机(例如,我父亲和姐姐的计算机)中出现此异常时崩溃。

任何线索都将受到赞赏和应有的赞成。谢谢

- - - - - - - - - - - - - - - - - -编辑 - - - - - - - ----------------------

我设法将麻烦的孩子逼到了 ListView 的 ItemTemplate 中名为“textAvisosSeccion”的 TextBlock:

<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 绑定到使用 MEF 导入的集合Lazy<T>,其中 T 具有“Avisos”属性。另一个 TexkBlock 绑定到Lazy<T>的元数据,这很好。

除了我绑定到惰性值的原因(实例化对象,失去惰性的优势)之外,为什么我会因为这个而得到“指定元素已经是另一个元素的逻辑子元素”异常?!?!?

“Avisos”属性只是 ViewModel 中的一个整数(不是从 UIElement 继承的)。

编辑#2:

VS2012 中没有抛出类似这个和其他异常(样式问题、MEF 组合问题等),因为它安装了 .NET Framework 4.5 的计算机。即使所有项目都针对 Framework 4.0。

如果你正在为 4.0 开发,请使用 Vista 的旧机器,确保你已安装 4.0 并使用 VS2010;这是确保的唯一方法。

4

1 回答 1

3

这不是问题的真正答案,而是我找到的问题的解决方案:在客户端机器上安装 .NET Framework 4.5,应用程序运行起来就像一个魅力。

删除麻烦的 TextBlock 后,应用程序打开了,但在很多地方都抛出了相同的异常,但没有明显的原因:一些 ViewModel 和 View 工作正常,而另一些则没有。当然,它们都是以相同的方式构建的,所以这里没有解释。

我发现这个 SO question 指的是这个问题,但没有好的答案:

WPF 4.5 父子行为是否发生了变化:我们现在可以毫无例外地将一个子代添加到另一个父代?

对于这个人来说,它创造了一个问题而不是解决它。然而,一个可怕的问题出现了:我们怎么知道在下一个框架版本中是否一切都会一样?也许这是 4.0 中的一个 bug,在 4.5 中修复,他们不想谈论它。

另一个主要问题是异常没有提供有关哪些元素存在问题的真实信息,因此它几乎无法调试。我在某个论坛上发现这是作为改进建议发布给 Microsoft 的,但他们一再拒绝。

希望这对某人有所帮助,我也希望有人告诉我如何更深入地挖掘异常以了解哪个元素在抱怨。

在这里也复制 EDIT #2:

VS2012 中没有抛出类似这个和其他异常(样式问题、MEF 组合问题等),因为它安装了 .NET Framework 4.5 的计算机。即使所有项目都针对 Framework 4.0。

如果你正在为 4.0 开发,请使用 Vista 的旧机器,确保你已安装 4.0 并使用 VS2010;这是确保的唯一方法。

于 2013-09-10T12:42:14.500 回答