none
指定的元素已经是另一个元素的逻辑子元素。请先将其断开连接。 RRS feed

  • 问题

  • 在一个Window上面有如下部分:

     

    <ContentControl Style="{StaticResource ResourceKey=FlowChartSymbols}"/>
    

     


    其中的资源为:

     

      <Style TargetType="ContentControl" x:Key="FlowChartSymbols">
        <Setter Property="Content">
          <Setter.Value>
            <my:Toolbox
            DefaultItemSize="55,40"
            SnapsToDevicePixels="True"
            ScrollViewer.HorizontalScrollBarVisibility="Disabled">
              <ItemsControl.Items>
                <Path Style="{StaticResource Process}"
             MinWidth="35"
             MinHeight="20"
             ToolTip="Process" my:DesignerItem.MoveThumbType="Process">
                </Path>
                  。。。。。。。(此处省略一些Path)。。。。。。
              </ItemsControl.Items>
            </my:Toolbox>
          </Setter.Value>
        </Setter>
      </Style>
    


    在另一个Window里面用如下代码打开他

        private void OpenEditor(object sender, RoutedEventArgs e)
        {
          frmEdit frm = new frmEdit();
          frm.Show();
        }
    


    但是发现关闭了frmEdit 之后再次点击按钮打开的时候就出报错。但是当我不使用Style直接给Content赋值的时候,多次打开就不会报错

     

    <ContentControl >
            <my:Toolbox
            DefaultItemSize="55,40"
            SnapsToDevicePixels="True"
            ScrollViewer.HorizontalScrollBarVisibility="Disabled">
              <ItemsControl.Items>
                <Path Style="{StaticResource Process}"
             MinWidth="35"
             MinHeight="20"
             ToolTip="Process" my:DesignerItem.MoveThumbType="Process">
                </Path>
              。。。。。。(此处省略一些Path)。。。。。。
              </ItemsControl.Items>
            </my:Toolbox>
          </ContentControl>
    


    我想知道这是为什么。

     

    下面是异常信息:

    发生了 System.Windows.Markup.XamlParseException

      Message=“设置属性“System.Windows.FrameworkElement.Style”时引发了异常。”,行号为“27”,行位置为“14”。

      Source=PresentationFramework

      LineNumber=27

      LinePosition=14

      StackTrace:

           在 System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)

           在 System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)

           在 System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)

           在 System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)

           在 System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)

           在 FailureAnalysis.frmEdit.InitializeComponent() 位置 e:\Program\FailureAnalysis\FailureAnalysis\frmEdit.xaml:行号 1

           在 FailureAnalysis.frmEdit..ctor() 位置 E:\Program\FailureAnalysis\FailureAnalysis\frmEdit.xaml.cs:行号 27

      InnerException: System.InvalidOperationException

           Message=指定的元素已经是另一个元素的逻辑子元素。请先将其断开连接。

           Source=PresentationFramework

           StackTrace:

                在 System.Windows.FrameworkElement.ChangeLogicalParent(DependencyObject newParent)

                在 System.Windows.FrameworkElement.AddLogicalChild(Object child)

                在 System.Windows.Controls.ContentControl.OnContentChanged(Object oldContent, Object newContent)

                在 System.Windows.Controls.ContentControl.OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

                在 System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)

                在 System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)

                在 System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)

                在 System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)

                在 System.Windows.StyleHelper.ApplyStyleOrTemplateValue(FrameworkObject fo, DependencyProperty dp)

                在 System.Windows.StyleHelper.InvalidateContainerDependents(DependencyObject container, FrugalStructList`1& exclusionContainerDependents, FrugalStructList`1& oldContainerDependents, FrugalStructList`1& newContainerDependents)

                在 System.Windows.StyleHelper.DoStyleInvalidations(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style newStyle)

                在 System.Windows.StyleHelper.UpdateStyleCache(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style newStyle, Style& styleCache)

                在 System.Windows.FrameworkElement.OnStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

                在 System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)

                在 System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)

                在 System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)

                在 System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)

                在 System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)

                在 System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)

                在 System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(Object instance, Object value)

                在 MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member, Object obj, Object value)

                在 MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value)

           InnerException: 

     

    2011年8月5日 15:04

答案

  • 我明白为什么了:

    在资源里面添加  x:Shared="False" 就可以了。

     

    X:Shared用于指定请求资源时创建实例的两种方式。

    X:Shared = “true”(默认):表示所有请求都是共享同一个实例。一般不显示指定。

    X:Shared = “false”:表示每次请求都创建一个新的实例。

     

    如下:

     

     

    <my:Toolbox x:Key="FlowChartSymbols"
             x:Shared="False"
            DefaultItemSize="55,40"
            SnapsToDevicePixels="True"
            ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ItemsControl.Items>
          <Path Style="{StaticResource Process}"
             MinWidth="35"
             MinHeight="20"
             ToolTip="Process" my:DesignerItem.MoveThumbType="Process">
          </Path>
    
    。。。。。。。。。。。。
        </ItemsControl.Items>
      </my:Toolbox>

     

     

    然后:

    <ContentControl Content="{StaticResource ResourceKey=FlowChartSymbols}" />

     

    参考资料:

    http://www.360doc.com/content/11/0416/15/6255786_110064609.shtml

    http://www.cnblogs.com/qc1984326/archive/2009/04/28/1445743.html


    • 已标记为答案 qianyang 2011年8月6日 23:54
    • 取消答案标记 qianyang 2011年8月6日 23:58
    • 已标记为答案 qianyang 2011年8月6日 23:58
    2011年8月6日 23:54