Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / Markup / Baml2006 / WpfXamlMember.cs / 1305600 / WpfXamlMember.cs
using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Xaml; using System.Xaml.Schema; namespace System.Windows.Baml2006 { internal class WpfXamlMember : XamlMember, System.Windows.Markup.IProvideValueTarget { [Flags] private enum BoolMemberBits { UseV3Rules = 0x0001, BamlMember = 0x0002, UnderlyingMemberIsKnown = 0x0004, ApplyGetterFallback = 0x0008, } public WpfXamlMember(DependencyProperty dp, bool isAttachable) : base(dp.Name, System.Windows.Markup.XamlReader.BamlSharedSchemaContext.GetXamlType(dp.OwnerType), isAttachable) { DependencyProperty = dp; _useV3Rules = true; _isBamlMember = true; _underlyingMemberIsKnown = false; } public WpfXamlMember(RoutedEvent re, bool isAttachable) : base(re.Name, System.Windows.Markup.XamlReader.BamlSharedSchemaContext.GetXamlType(re.OwnerType), isAttachable) { RoutedEvent = re; _useV3Rules = true; _isBamlMember = true; _underlyingMemberIsKnown = false; } public WpfXamlMember(DependencyProperty dp, MethodInfo getter, MethodInfo setter, XamlSchemaContext schemaContext, bool useV3Rules) : base(dp.Name, getter, setter, schemaContext) { DependencyProperty = dp; _useV3Rules = useV3Rules; _underlyingMemberIsKnown = true; } public WpfXamlMember(DependencyProperty dp, PropertyInfo property, XamlSchemaContext schemaContext, bool useV3Rules) : base (property, schemaContext) { DependencyProperty = dp; _useV3Rules = useV3Rules; _underlyingMemberIsKnown = true; } public WpfXamlMember(RoutedEvent re, MethodInfo setter, XamlSchemaContext schemaContext, bool useV3Rules) : base(re.Name, setter, schemaContext) { RoutedEvent = re; _useV3Rules = useV3Rules; _underlyingMemberIsKnown = true; } public WpfXamlMember(RoutedEvent re, EventInfo eventInfo, XamlSchemaContext schemaContext, bool useV3Rules) : base(eventInfo, schemaContext) { RoutedEvent = re; _useV3Rules = useV3Rules; _underlyingMemberIsKnown = true; } // Protected ctor that is called by WpfKnownMember for known properties that aren't DPs protected WpfXamlMember(string name, XamlType declaringType, bool isAttachable) : base(name, declaringType, isAttachable) { _useV3Rules = true; _isBamlMember = true; _underlyingMemberIsKnown = false; } public DependencyProperty DependencyProperty { get; set; } public RoutedEvent RoutedEvent { get; set; } internal bool ApplyGetterFallback { get { return WpfXamlType.GetFlag(ref _bitField, (byte)BoolMemberBits.ApplyGetterFallback); } private set { WpfXamlType.SetFlag(ref _bitField, (byte)BoolMemberBits.ApplyGetterFallback, value); } } // v3 parser had a fallback for retrieved DP content properties. If the DP was null, it would // call the CLR property getter, in case the property was lazily initialized. If necessary, // we return a version of this property with the fallback logic. internal WpfXamlMember AsContentProperty { get { if (_asContentProperty == null) { _asContentProperty = GetAsContentProperty(); } return _asContentProperty; } } protected virtual WpfXamlMember GetAsContentProperty() { if (DependencyProperty == null) { // Not a DP, no fallback needed return this; } Debug.Assert(!IsAttachable && !IsEvent); WpfXamlMember result = null; if (_underlyingMemberIsKnown) { PropertyInfo underlyingProperty = UnderlyingMember as PropertyInfo; if (underlyingProperty == null) { // No underlying CLR property, no fallback needed return this; } result = new WpfXamlMember(DependencyProperty, underlyingProperty, DeclaringType.SchemaContext, _useV3Rules); } else { result = new WpfXamlMember(DependencyProperty, false /*isAttachable*/); } result.ApplyGetterFallback = true; return result; } protected override XamlType LookupType() { if (DependencyProperty != null) { if (_isBamlMember) { return System.Windows.Markup.XamlReader.BamlSharedSchemaContext.GetXamlType(DependencyProperty.PropertyType); } else { return System.Windows.Markup.XamlReader.GetWpfSchemaContext().GetXamlType(DependencyProperty.PropertyType); } } else if (RoutedEvent != null) { if (_isBamlMember) { return System.Windows.Markup.XamlReader.BamlSharedSchemaContext.GetXamlType(RoutedEvent.HandlerType); } else { return System.Windows.Markup.XamlReader.GetWpfSchemaContext().GetXamlType(RoutedEvent.HandlerType); } } else { return base.LookupType(); } } protected override MemberInfo LookupUnderlyingMember() { MemberInfo member = base.LookupUnderlyingMember(); if (member == null) { if (BaseUnderlyingMember != null) { member = BaseUnderlyingMember.UnderlyingMember; } } _underlyingMemberIsKnown = true; return member; } protected override MethodInfo LookupUnderlyingSetter() { // Want to look up the base's UnderlyingSetter in case it's already there MethodInfo setter = base.LookupUnderlyingSetter(); if (setter == null) { if (BaseUnderlyingMember != null) { setter = BaseUnderlyingMember.Invoker.UnderlyingSetter; } } _underlyingMemberIsKnown = true; return setter; } protected override MethodInfo LookupUnderlyingGetter() { // Want to look up the base's UnderlyingSetter in case it's already there MethodInfo getter = base.LookupUnderlyingGetter(); if (getter == null) { if (BaseUnderlyingMember != null) { getter = BaseUnderlyingMember.Invoker.UnderlyingGetter; } } _underlyingMemberIsKnown = true; return getter; } protected override bool LookupIsReadOnly() { if (DependencyProperty != null) { return DependencyProperty.ReadOnly; } return base.LookupIsReadOnly(); } protected override bool LookupIsEvent() { if (RoutedEvent != null) { return true; } return false; } protected override XamlMemberInvoker LookupInvoker() { return new WpfMemberInvoker(this); } protected override bool LookupIsUnknown() { return false; } // The Markup compiler doesn't support XamlDeferringLoader so we don't need to look it up in BAML scenarios. protected override XamlValueConverterLookupDeferringLoader() { if (_useV3Rules) { return null; } else { return base.LookupDeferringLoader(); } } private bool _useV3Rules { get { return WpfXamlType.GetFlag(ref _bitField, (byte)BoolMemberBits.UseV3Rules); } set { WpfXamlType.SetFlag(ref _bitField, (byte)BoolMemberBits.UseV3Rules, value); } } private bool _isBamlMember { get { return WpfXamlType.GetFlag(ref _bitField, (byte)BoolMemberBits.BamlMember); } set { WpfXamlType.SetFlag(ref _bitField, (byte)BoolMemberBits.BamlMember, value); } } private bool _underlyingMemberIsKnown { get { return WpfXamlType.GetFlag(ref _bitField, (byte)BoolMemberBits.UnderlyingMemberIsKnown); } set { WpfXamlType.SetFlag(ref _bitField, (byte)BoolMemberBits.UnderlyingMemberIsKnown, value); } } #region IProvideValueTarget Members object System.Windows.Markup.IProvideValueTarget.TargetObject { get { throw new NotSupportedException(); } } object System.Windows.Markup.IProvideValueTarget.TargetProperty { get { if (DependencyProperty != null) { return DependencyProperty; } else { return UnderlyingMember; } } } #endregion private XamlMember BaseUnderlyingMember { get { if (_baseUnderlyingMember == null) { WpfXamlType wpfXType = DeclaringType as WpfXamlType; _baseUnderlyingMember = wpfXType.FindBaseXamlMember(Name, IsAttachable); if (_baseUnderlyingMember == null) { // Find the attached or regular property _baseUnderlyingMember = wpfXType.FindBaseXamlMember(Name, !IsAttachable); } } return _baseUnderlyingMember; } } private byte _bitField; private XamlMember _baseUnderlyingMember; private WpfXamlMember _asContentProperty; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Xaml; using System.Xaml.Schema; namespace System.Windows.Baml2006 { internal class WpfXamlMember : XamlMember, System.Windows.Markup.IProvideValueTarget { [Flags] private enum BoolMemberBits { UseV3Rules = 0x0001, BamlMember = 0x0002, UnderlyingMemberIsKnown = 0x0004, ApplyGetterFallback = 0x0008, } public WpfXamlMember(DependencyProperty dp, bool isAttachable) : base(dp.Name, System.Windows.Markup.XamlReader.BamlSharedSchemaContext.GetXamlType(dp.OwnerType), isAttachable) { DependencyProperty = dp; _useV3Rules = true; _isBamlMember = true; _underlyingMemberIsKnown = false; } public WpfXamlMember(RoutedEvent re, bool isAttachable) : base(re.Name, System.Windows.Markup.XamlReader.BamlSharedSchemaContext.GetXamlType(re.OwnerType), isAttachable) { RoutedEvent = re; _useV3Rules = true; _isBamlMember = true; _underlyingMemberIsKnown = false; } public WpfXamlMember(DependencyProperty dp, MethodInfo getter, MethodInfo setter, XamlSchemaContext schemaContext, bool useV3Rules) : base(dp.Name, getter, setter, schemaContext) { DependencyProperty = dp; _useV3Rules = useV3Rules; _underlyingMemberIsKnown = true; } public WpfXamlMember(DependencyProperty dp, PropertyInfo property, XamlSchemaContext schemaContext, bool useV3Rules) : base (property, schemaContext) { DependencyProperty = dp; _useV3Rules = useV3Rules; _underlyingMemberIsKnown = true; } public WpfXamlMember(RoutedEvent re, MethodInfo setter, XamlSchemaContext schemaContext, bool useV3Rules) : base(re.Name, setter, schemaContext) { RoutedEvent = re; _useV3Rules = useV3Rules; _underlyingMemberIsKnown = true; } public WpfXamlMember(RoutedEvent re, EventInfo eventInfo, XamlSchemaContext schemaContext, bool useV3Rules) : base(eventInfo, schemaContext) { RoutedEvent = re; _useV3Rules = useV3Rules; _underlyingMemberIsKnown = true; } // Protected ctor that is called by WpfKnownMember for known properties that aren't DPs protected WpfXamlMember(string name, XamlType declaringType, bool isAttachable) : base(name, declaringType, isAttachable) { _useV3Rules = true; _isBamlMember = true; _underlyingMemberIsKnown = false; } public DependencyProperty DependencyProperty { get; set; } public RoutedEvent RoutedEvent { get; set; } internal bool ApplyGetterFallback { get { return WpfXamlType.GetFlag(ref _bitField, (byte)BoolMemberBits.ApplyGetterFallback); } private set { WpfXamlType.SetFlag(ref _bitField, (byte)BoolMemberBits.ApplyGetterFallback, value); } } // v3 parser had a fallback for retrieved DP content properties. If the DP was null, it would // call the CLR property getter, in case the property was lazily initialized. If necessary, // we return a version of this property with the fallback logic. internal WpfXamlMember AsContentProperty { get { if (_asContentProperty == null) { _asContentProperty = GetAsContentProperty(); } return _asContentProperty; } } protected virtual WpfXamlMember GetAsContentProperty() { if (DependencyProperty == null) { // Not a DP, no fallback needed return this; } Debug.Assert(!IsAttachable && !IsEvent); WpfXamlMember result = null; if (_underlyingMemberIsKnown) { PropertyInfo underlyingProperty = UnderlyingMember as PropertyInfo; if (underlyingProperty == null) { // No underlying CLR property, no fallback needed return this; } result = new WpfXamlMember(DependencyProperty, underlyingProperty, DeclaringType.SchemaContext, _useV3Rules); } else { result = new WpfXamlMember(DependencyProperty, false /*isAttachable*/); } result.ApplyGetterFallback = true; return result; } protected override XamlType LookupType() { if (DependencyProperty != null) { if (_isBamlMember) { return System.Windows.Markup.XamlReader.BamlSharedSchemaContext.GetXamlType(DependencyProperty.PropertyType); } else { return System.Windows.Markup.XamlReader.GetWpfSchemaContext().GetXamlType(DependencyProperty.PropertyType); } } else if (RoutedEvent != null) { if (_isBamlMember) { return System.Windows.Markup.XamlReader.BamlSharedSchemaContext.GetXamlType(RoutedEvent.HandlerType); } else { return System.Windows.Markup.XamlReader.GetWpfSchemaContext().GetXamlType(RoutedEvent.HandlerType); } } else { return base.LookupType(); } } protected override MemberInfo LookupUnderlyingMember() { MemberInfo member = base.LookupUnderlyingMember(); if (member == null) { if (BaseUnderlyingMember != null) { member = BaseUnderlyingMember.UnderlyingMember; } } _underlyingMemberIsKnown = true; return member; } protected override MethodInfo LookupUnderlyingSetter() { // Want to look up the base's UnderlyingSetter in case it's already there MethodInfo setter = base.LookupUnderlyingSetter(); if (setter == null) { if (BaseUnderlyingMember != null) { setter = BaseUnderlyingMember.Invoker.UnderlyingSetter; } } _underlyingMemberIsKnown = true; return setter; } protected override MethodInfo LookupUnderlyingGetter() { // Want to look up the base's UnderlyingSetter in case it's already there MethodInfo getter = base.LookupUnderlyingGetter(); if (getter == null) { if (BaseUnderlyingMember != null) { getter = BaseUnderlyingMember.Invoker.UnderlyingGetter; } } _underlyingMemberIsKnown = true; return getter; } protected override bool LookupIsReadOnly() { if (DependencyProperty != null) { return DependencyProperty.ReadOnly; } return base.LookupIsReadOnly(); } protected override bool LookupIsEvent() { if (RoutedEvent != null) { return true; } return false; } protected override XamlMemberInvoker LookupInvoker() { return new WpfMemberInvoker(this); } protected override bool LookupIsUnknown() { return false; } // The Markup compiler doesn't support XamlDeferringLoader so we don't need to look it up in BAML scenarios. protected override XamlValueConverter LookupDeferringLoader() { if (_useV3Rules) { return null; } else { return base.LookupDeferringLoader(); } } private bool _useV3Rules { get { return WpfXamlType.GetFlag(ref _bitField, (byte)BoolMemberBits.UseV3Rules); } set { WpfXamlType.SetFlag(ref _bitField, (byte)BoolMemberBits.UseV3Rules, value); } } private bool _isBamlMember { get { return WpfXamlType.GetFlag(ref _bitField, (byte)BoolMemberBits.BamlMember); } set { WpfXamlType.SetFlag(ref _bitField, (byte)BoolMemberBits.BamlMember, value); } } private bool _underlyingMemberIsKnown { get { return WpfXamlType.GetFlag(ref _bitField, (byte)BoolMemberBits.UnderlyingMemberIsKnown); } set { WpfXamlType.SetFlag(ref _bitField, (byte)BoolMemberBits.UnderlyingMemberIsKnown, value); } } #region IProvideValueTarget Members object System.Windows.Markup.IProvideValueTarget.TargetObject { get { throw new NotSupportedException(); } } object System.Windows.Markup.IProvideValueTarget.TargetProperty { get { if (DependencyProperty != null) { return DependencyProperty; } else { return UnderlyingMember; } } } #endregion private XamlMember BaseUnderlyingMember { get { if (_baseUnderlyingMember == null) { WpfXamlType wpfXType = DeclaringType as WpfXamlType; _baseUnderlyingMember = wpfXType.FindBaseXamlMember(Name, IsAttachable); if (_baseUnderlyingMember == null) { // Find the attached or regular property _baseUnderlyingMember = wpfXType.FindBaseXamlMember(Name, !IsAttachable); } } return _baseUnderlyingMember; } } private byte _bitField; private XamlMember _baseUnderlyingMember; private WpfXamlMember _asContentProperty; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XmlDictionary.cs
- ParameterCollection.cs
- RemotingSurrogateSelector.cs
- StorageFunctionMapping.cs
- EdmItemError.cs
- SimpleHandlerFactory.cs
- CopyAction.cs
- IdentifierCreationService.cs
- WindowsHyperlink.cs
- TreeView.cs
- NativeMethods.cs
- ServiceAuthorizationBehavior.cs
- TreeNodeEventArgs.cs
- SemaphoreFullException.cs
- WinFormsSecurity.cs
- UpdatePanelTrigger.cs
- ConfigurationValues.cs
- XmlNodeComparer.cs
- Version.cs
- StatusBar.cs
- BitmapEffectGroup.cs
- MatrixTransform3D.cs
- DataViewManager.cs
- OracleCommandBuilder.cs
- Encoder.cs
- XmlWrappingWriter.cs
- ImageKeyConverter.cs
- safex509handles.cs
- SelectionPattern.cs
- AuthorizationSection.cs
- SemanticResolver.cs
- SourceFileBuildProvider.cs
- FilterableData.cs
- TextFormatter.cs
- RegisteredHiddenField.cs
- AssemblyAssociatedContentFileAttribute.cs
- NotifyInputEventArgs.cs
- FactoryRecord.cs
- TypedReference.cs
- Command.cs
- NumberAction.cs
- CompilationAssemblyInstallComponent.cs
- FlowLayoutSettings.cs
- NeutralResourcesLanguageAttribute.cs
- __Error.cs
- Page.cs
- SmiTypedGetterSetter.cs
- RequestTimeoutManager.cs
- FileCodeGroup.cs
- RSAOAEPKeyExchangeFormatter.cs
- ExtenderControl.cs
- Stacktrace.cs
- FormsAuthenticationCredentials.cs
- Configuration.cs
- WarningException.cs
- xdrvalidator.cs
- HtmlSelect.cs
- BrushValueSerializer.cs
- IUnknownConstantAttribute.cs
- Rotation3DAnimationBase.cs
- SupportsEventValidationAttribute.cs
- TextServicesHost.cs
- ToolBar.cs
- EditorAttribute.cs
- FrameworkContentElement.cs
- XmlNavigatorFilter.cs
- ForceCopyBuildProvider.cs
- SqlDataSourceCache.cs
- Sequence.cs
- AggregateNode.cs
- xmlglyphRunInfo.cs
- DataGridViewAutoSizeModeEventArgs.cs
- OdbcErrorCollection.cs
- XmlChildNodes.cs
- SpellerStatusTable.cs
- ScriptReferenceBase.cs
- CodeIdentifier.cs
- NetMsmqSecurityElement.cs
- ResourceDictionary.cs
- TreeView.cs
- ColorBlend.cs
- UnsafeNativeMethods.cs
- EmptyCollection.cs
- Oid.cs
- RawKeyboardInputReport.cs
- PropertyIDSet.cs
- WebPartZoneBase.cs
- MatrixValueSerializer.cs
- StateChangeEvent.cs
- CompilerInfo.cs
- HttpCacheParams.cs
- PathNode.cs
- InlinedAggregationOperator.cs
- SessionStateSection.cs
- InfoCardRSAPKCS1KeyExchangeDeformatter.cs
- DiscoveryDocumentLinksPattern.cs
- RenderTargetBitmap.cs
- SingleObjectCollection.cs
- ScriptControl.cs
- GenericNameHandler.cs