コード例 #1
0
        /// <summary>
        /// Write start of a complex property
        /// </summary>
        /// <remarks> 
        /// For template parsing, treat complex property tags as
        /// xml element tags for the purpose of validity checking 
        /// </remarks> 
        public override void WritePropertyComplexStart(XamlPropertyComplexStartNode xamlNode)
        { 
            StyleMode mode = _styleModeStack.Mode;

            if (_styleModeStack.Depth == 1)
            { 
                if (xamlNode.PropName == XamlTemplateSerializer.TargetTypePropertyName)
                { 
                    mode = StyleMode.TargetTypeProperty; 
                }
                else if (xamlNode.PropName == XamlTemplateSerializer.DataTypePropertyName) 
                {
                    mode = StyleMode.DataTypeProperty;
                }
                else if (xamlNode.PropName == XamlTemplateSerializer.ItemsSourcePropertyName || 
                        xamlNode.PropName == XamlTemplateSerializer.ItemTemplatePropertyName ||
                        xamlNode.PropName == XamlTemplateSerializer.ItemTemplateSelectorPropertyName || 
                        xamlNode.PropName == XamlTemplateSerializer.ItemContainerStylePropertyName || 
                        xamlNode.PropName == XamlTemplateSerializer.ItemContainerStyleSelectorPropertyName ||
                        xamlNode.PropName == XamlTemplateSerializer.ItemStringFormatPropertyName || 
                        xamlNode.PropName == XamlTemplateSerializer.ItemBindingGroupPropertyName ||
                        xamlNode.PropName == XamlTemplateSerializer.AlternationCountPropertyName
                        )
                { 
                    mode = StyleMode.ComplexProperty;
                } 
                else 
                {
                    ThrowException(SRID.TemplateUnknownProp, xamlNode.PropName, 
                                   xamlNode.LineNumber, xamlNode.LinePosition);
                }
            }
            else if (mode == StyleMode.VisualTree) 
            {
                _visualTreeComplexPropertyDepth++; 
            } 
            else if (mode == StyleMode.TriggerBase)
            { 
                _triggerComplexPropertyDepth++;
            }
#if PBTCOMPILER
            else if (mode == StyleMode.DataTypeProperty && 
                     InDeferLoadedSection &&
                     !_defNameFound) 
            { 
                // We have to treat DataType="{x:Type SomeType}" as a key in a
                // resource dictionary, if one is present.  This means generating 
                // a series of baml records to use as the key for the defer loaded
                // body of the Style in addition to generating the records to set
                // the TargetType value.
                base.WritePropertyComplexStart(xamlNode); 
            }
#endif 
 
            _styleModeStack.Push(mode);
            base.WritePropertyComplexStart(xamlNode); 
        }
コード例 #2
0
        /// <summary>
        /// Create nodes for a complex property that surrounds an element tree.
        /// Note that this is for general properties and not def attributes.
        /// </summary>
        internal void CompileAttribute(
            ArrayList xamlNodes,
            AttributeData data)
        {
            // For MarkupExtension syntax, treat PropertyInfo as a CLR property, but MethodInfo
            // and DependencyProperty as a DependencyProperty.  Note that the MarkupCompiler
            // will handle the case where a DependencyProperty callback is made if it gets
            // a MethodInfo for the attached property setter.
            string declaringTypeAssemblyName = data.DeclaringType.Assembly.FullName;
            string declaringTypeFullName = data.DeclaringType.FullName;

            // Find the PropertyRecordType to use in this case

            Type propertyType;
            bool propertyCanWrite;
            XamlTypeMapper.GetPropertyType(data.Info, out propertyType, out propertyCanWrite);
            BamlRecordType propertyRecordType = BamlRecordManager.GetPropertyStartRecordType(propertyType, propertyCanWrite);

            // Create the property start and end records

            XamlNode propertyStart;
            XamlNode propertyEnd;

            switch (propertyRecordType)
            {
                case BamlRecordType.PropertyArrayStart:
                {
                    propertyStart = new XamlPropertyArrayStartNode(
                                                                data.LineNumber,
                                                                data.LinePosition,
                                                                data.Depth,
                                                                data.Info,
                                                                declaringTypeAssemblyName,
                                                                declaringTypeFullName,
                                                                data.PropertyName);

                    propertyEnd = new XamlPropertyArrayEndNode(
                                          data.LineNumber,
                                          data.LinePosition,
                                          data.Depth);
                    break;
                }
                case BamlRecordType.PropertyIDictionaryStart:
                {
                    propertyStart = new XamlPropertyIDictionaryStartNode(
                                                                data.LineNumber,
                                                                data.LinePosition,
                                                                data.Depth,
                                                                data.Info,
                                                                declaringTypeAssemblyName,
                                                                declaringTypeFullName,
                                                                data.PropertyName);
                    propertyEnd = new XamlPropertyIDictionaryEndNode(
                                          data.LineNumber,
                                          data.LinePosition,
                                          data.Depth);
                    break;
                }
                case BamlRecordType.PropertyIListStart:
                {
                    propertyStart = new XamlPropertyIListStartNode(
                                                                data.LineNumber,
                                                                data.LinePosition,
                                                                data.Depth,
                                                                data.Info,
                                                                declaringTypeAssemblyName,
                                                                declaringTypeFullName,
                                                                data.PropertyName);
                    propertyEnd = new XamlPropertyIListEndNode(
                                          data.LineNumber,
                                          data.LinePosition,
                                          data.Depth);
                    break;
                }
                default: // PropertyComplexStart
                {
                    propertyStart = new XamlPropertyComplexStartNode(
                                                                data.LineNumber,
                                                                data.LinePosition,
                                                                data.Depth,
                                                                data.Info,
                                                                declaringTypeAssemblyName,
                                                                declaringTypeFullName,
                                                                data.PropertyName);
                    propertyEnd = new XamlPropertyComplexEndNode(
                                          data.LineNumber,
                                          data.LinePosition,
                                          data.Depth);
                    break;
                }
            }

            // NOTE:  Add duplicate property checking here as is done in XamlReaderHelper
            xamlNodes.Add(propertyStart);

            CompileAttributeCore(xamlNodes, data);

            xamlNodes.Add(propertyEnd);
        }
コード例 #3
0
ファイル: XamlParser.cs プロジェクト: JianwenSun/cc
 /// <summary>
 /// Write Start Complex Property, where the tag is of the
 /// form /<Classname.PropertyName/>
 /// </summary>
 public virtual void WritePropertyComplexStart(
     XamlPropertyComplexStartNode xamlPropertyComplexStartNode)
 {
     if (BamlRecordWriter != null)
     {
         BamlRecordWriter.WritePropertyComplexStart(xamlPropertyComplexStartNode);
     }
 }
コード例 #4
0
        // Write the start of a complex property
        internal void WritePropertyComplexStart(XamlPropertyComplexStartNode
                                    xamlComplexPropertyNode)
        {
            // review same as property + flag, combine code
            BamlPropertyComplexStartRecord bamlComplexProperty =
                (BamlPropertyComplexStartRecord) BamlRecordManager.GetWriteRecord(
                                                        BamlRecordType.PropertyComplexStart);

            bamlComplexProperty.AttributeId =
                MapTable.AddAttributeInfoMap(BinaryWriter,
                                             xamlComplexPropertyNode.AssemblyName,
                                             xamlComplexPropertyNode.TypeFullName,
                                             xamlComplexPropertyNode.PropDeclaringType,
                                             xamlComplexPropertyNode.PropName,
                                             xamlComplexPropertyNode.PropValidType,
                                             BamlAttributeUsage.Default);

            WriteAndReleaseRecord(bamlComplexProperty, xamlComplexPropertyNode);
        }