File: MS\Internal\Markup\StaticExtension.cs
Web Access
Project: src\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj (PresentationFramework)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
/***************************************************************************\
*
*
*  Class for Xaml markup extension for static field and property references.
*
*
\***************************************************************************/
using System;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Windows.Input;
using System.Reflection;
using MS.Internal.WindowsBase;
using MS.Utility;
using System.Runtime.CompilerServices;
using System.Windows.Markup;
using System.Windows;
 
using SR = System.Windows.SR;
 
namespace MS.Internal.Markup
{
    /// <summary>
    ///  WPF wrapper for StaticExtension.  Optimizes some common SystemResourceKeys & Commands
    /// </summary>
    internal class StaticExtension : System.Windows.Markup.StaticExtension
    {
        public StaticExtension() : base() { }
        public StaticExtension(String member) : base(member) { }
 
        /// <summary>
        ///  Return an object that should be set on the targetObject's targetProperty
        ///  for this markup extension.  For a StaticExtension this is a static field
        ///  or property value.
        /// </summary>
        /// <param name="serviceProvider">Object that can provide services for the markup extension.</param>
        /// <returns>
        ///  The object to set on this property.
        /// </returns>
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            if (Member == null)
            {
                throw new InvalidOperationException(SR.MarkupExtensionStaticMember);
            }
 
            object value;
            if (MemberType != null)
            {
                value = SystemResourceKey.GetSystemResourceKey($"{MemberType.Name}.{Member}");
                if (value != null)
                {
                    return value;
                }
            }
            else
            {
                value = SystemResourceKey.GetSystemResourceKey(Member);
                if (value != null)
                {
                    return value;
                }
 
                // Validate the _member
 
                int dotIndex = Member.IndexOf('.');
                if (dotIndex < 0)
                {
                    throw new ArgumentException(SR.Format(SR.MarkupExtensionBadStatic, Member));
                }
 
                // Pull out the type substring (this will include any XML prefix, e.g. "av:Button")
 
                string typeString = Member.Substring(0, dotIndex);
                if (typeString == string.Empty)
                {
                    throw new ArgumentException(SR.Format(SR.MarkupExtensionBadStatic, Member));
                }
 
                // Get the IXamlTypeResolver from the service provider
 
                ArgumentNullException.ThrowIfNull(serviceProvider);
 
                IXamlTypeResolver xamlTypeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
                if (xamlTypeResolver == null)
                {
                    throw new ArgumentException(SR.Format(SR.MarkupExtensionNoContext, GetType().Name, "IXamlTypeResolver"));
                }
 
                // Use the type resolver to get a Type instance
 
                MemberType = xamlTypeResolver.Resolve(typeString);
 
                // Get the member name substring
 
                Member = Member.Substring(dotIndex + 1, Member.Length - dotIndex - 1);
            }
 
            value = CommandConverter.GetKnownControlCommand(MemberType, Member);
            if (value != null)
            {
                return value;
            }
 
            return base.ProvideValue(serviceProvider);
        }
    }
}