2014-10-09 221 views
0

我有一个WPF应用程序运行没有任何问题,在我的Windows 8操作系统开发机器。但是当我尝试在Windows 7机器上运行相同的时候,我收到错误System.InvalidOperationException:指定的元素已经是另一个元素的逻辑子元素。断开它在Windows 7计算机上的第一条消息

System.InvalidOperationException:指定的元素已经是另一个元素的逻辑子元素。先断开它。

详细的错误日志

 [CDATA[Set property 'System.Windows.FrameworkElement.Style' threw an exception. 
      LoadBaml at offset 481 in file:line:column <filename unknown>:0:0 

      System.InvalidOperationException: Specified element is already the logical child of another element. Disconnect it first. 
       at System.Windows.FrameworkElement.ChangeLogicalParent(DependencyObject newParent) 
       at System.Windows.FrameworkElement.AddLogicalChild(Object child) 
       at System.Windows.Controls.ContentControl.OnContentChanged(Object oldContent, Object newContent) 
       at System.Windows.Controls.ContentControl.OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
       at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
       at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
       at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) 
       at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType) 
       at System.Windows.StyleHelper.ApplyStyleOrTemplateValue(FrameworkObject fo, DependencyProperty dp) 
       at System.Windows.StyleHelper.InvalidateContainerDependents(DependencyObject container, FrugalStructList`1& exclusionContainerDependents, FrugalStructList`1& oldContainerDependents, FrugalStructList`1& newContainerDependents) 
       at System.Windows.StyleHelper.DoStyleInvalidations(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style newStyle) 
       at System.Windows.StyleHelper.UpdateStyleCache(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style newStyle, Style& styleCache) 
       at System.Windows.FrameworkElement.OnStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
       at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
       at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
       at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) 
       at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType) 
       at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal) 
       at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value) 
       at System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(Object instance, Object value) 
       at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member, Object obj, Object value) 
       at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value)]] 

我不知道哪个元素XAML或代码背后导致此问题。任何帮助找出这个奇怪的问题的原因?

最后能够找到错误 的原因我在这是在App.xaml中这样定义

<Style x:Key="ONStateLabelLib" TargetType="Label"> 
     <Setter Property="Background" Value="#A1A1A1"></Setter> 
     <Setter Property="Foreground" Value="Black"></Setter> 

     <Setter Property="Margin" Value="0"></Setter> 
     <Setter Property="Padding" Value="0"></Setter> 

     <Setter Property="Cursor" Value="Hand"/> 
     <Setter Property="Width" Value="45"></Setter> 


     <Setter Property="VerticalContentAlignment" Value="Center"></Setter> 
     <Setter Property="HorizontalContentAlignment" Value="Center"></Setter> 

     <Setter Property="FontSize" Value="14"/> 
     <Setter Property="FontFamily" Value="Arial"/> 
    </Style> 
    <Style x:Key="OFFStateLabelLib" TargetType="Label"> 

     <Setter Property="Cursor" Value="Hand"/> 
     <Setter Property="Margin" Value="0"></Setter> 
     <Setter Property="Padding" Value="0"></Setter> 

     <Setter Property="FontSize" Value="14"/> 
     <Setter Property="FontFamily" Value="Arial"/> 
     <Setter Property="FontWeight" Value="ExtraLight"/> 

     <Setter Property="Foreground" Value="#515151"></Setter> 
     <Setter Property="Background" Value="#393939"></Setter> 


     <Setter Property="Width" Value="45"></Setter> 

     <Setter Property="BorderBrush" Value="#A1A1A1"></Setter> 
     <Setter Property="BorderThickness" Value="2"></Setter> 


     <Setter Property="VerticalContentAlignment" Value="Center"></Setter> 
     <Setter Property="HorizontalContentAlignment" Value="Center"></Setter> 
    </Style> 

    <Style x:Key="OnOffToggleStyleLib" TargetType="ToggleButton" > 
     <Setter Property="VerticalAlignment" Value="Center"></Setter> 
     <Setter Property="Width" Value="90"></Setter> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ToggleButton"> 
        <ContentPresenter VerticalAlignment="Center" /> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Background" Value="Transparent"> 
          </Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Content"> 
        <Setter.Value> 
         <DockPanel Margin="0"> 
          <Label DockPanel.Dock="Left" Style="{StaticResource ResourceKey=ONStateLabelLib}" >YES</Label> 
          <Label Style="{StaticResource ResourceKey=OFFStateLabelLib}" >NO</Label> 
         </DockPanel> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      <Trigger Property="IsChecked" Value="False"> 
       <Setter Property="Content"> 
        <Setter.Value> 
         <DockPanel Margin="0"> 
          <Label DockPanel.Dock="Left" Style="{StaticResource ResourceKey=OFFStateLabelLib}">YES</Label> 
          <Label Style="{StaticResource ResourceKey=ONStateLabelLib}" >NO</Label> 
         </DockPanel> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

的应用程序切换按钮的风格,我使用切换按钮在2页的Page1.xaml和Page2.xaml这样

<ToggleButton Margin="5" Grid.Row="0" 
    ToolTip="{Binding Path=localResource.reader_tooltip_settings_fullscreen,Source={StaticResource  DbookLanguageManagerDynamic}}" Grid.Column="1" 
    Name="btn_fullScreen" Click="btn_fullScreen_Clicked" 
     Style="{StaticResource ResourceKey=OnOffToggleStyleLib}" /> 

应用程序加载的Page1.xaml第一,虽然导航到Page2.xaml我是个例外获得以上。

现在有人可以帮助解决这个问题吗?

+0

对我来说,你正在设置一个属性,在你的应用程序的某个地方的某个样式中保存控件。你可以尝试设置ContentTemplate,以防Content属性导致这个错误。至于问题的根源,这个错误根本不能提供足够的信息让我们知道它的起源,因为它是一个编译好的XAML。你无法在W7机器上进行调试? – Sjeijoet 2014-10-09 10:23:32

+0

在开发机器以外的机器上,确保已安装所有先决条件。另外,在该机器上安装Visual Studio。然后尝试在该机器上运行你的exe。现在,如果您遇到任何错误,那么您可以选择使用Visual Studio进行调试,并且我认为您可能会在很短的时间内发现错误。祝你好运......... – Vishal 2014-10-09 10:26:27

+0

是的,我已经能够在Windows 7机器上进行调试。但没有更多的信息可用,比如哪个xaml导致它或错误的行等 – 2014-10-09 10:26:59

回答

0

尝试改变Content属性setter到ContentTemplate,并使用DataTemplate作为值:

<Style 
    x:Key="OnOffToggleStyleLib" 
    TargetType="ToggleButton"> 
    <Setter 
     Property="VerticalAlignment" 
     Value="Center"></Setter> 
    <Setter 
     Property="Width" 
     Value="90"></Setter> 
    <Setter 
     Property="Template"> 
     <Setter.Value> 
      <ControlTemplate 
       TargetType="ToggleButton"> 
       <ContentPresenter 
        VerticalAlignment="Center" /> 
       <ControlTemplate.Triggers> 
        <Trigger 
         Property="IsMouseOver" 
         Value="True"> 
         <Setter 
          Property="Background" 
          Value="Transparent"> 
         </Setter> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger 
      Property="IsChecked" 
      Value="True"> 
      <Setter 
       Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <StackPanel 
          Orientation="Horizontal"> 
          <Label 
           DockPanel.Dock="Left" 
           Style="{StaticResource ResourceKey=ONStateLabelLib}">YES</Label> 
          <Label 
           Style="{StaticResource ResourceKey=OFFStateLabelLib}">NO</Label> 
         </StackPanel> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
     <Trigger 
      Property="IsChecked" 
      Value="False"> 
      <Setter 
       Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <StackPanel 
          Orientation="Horizontal"> 
          <Label 
           DockPanel.Dock="Left" 
           Style="{StaticResource ResourceKey=OFFStateLabelLib}">YES</Label> 
          <Label 
           Style="{StaticResource ResourceKey=ONStateLabelLib}">NO</Label> 
         </StackPanel> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

我也有一个StackPanel交换了DockPanel,这是在我看来,一个更好的办法。让我知道它是否有效:)

+0

是的,它的工作。我只是想知道更多关于为什么它的失败几个版本的Windows只?你能帮忙解释一下错误原因吗? – 2014-10-10 07:45:56

+0

这是我很想知道的事情......我前一段时间遇到了同样的问题,但不是抛出异常(就像我在线阅读),应用程序拒绝显示控件的内容。不幸的是,我只能给你一个解决方案,也许别人可以启发我们关于问题的原因。 – Sjeijoet 2014-10-10 07:53:46

相关问题