public override sealed object ProvideValue(IServiceProvider serviceProvider)
{
#if WINDOWS_PHONE || NETFX_CORE
_targetObject = null;
_targetProperty = null;
_serviceProvider = null;
#else
_serviceProvider = serviceProvider;
var target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (target != null)
{
// CTL-636
// In a template the TargetObject is a SharedDp (internal WPF class)
// In that case, the markup extension itself is returned to be re-evaluated later
var targetObjectType = target.TargetObject.GetType();
if (string.Equals(targetObjectType.FullName, "System.Windows.SharedDp"))
// Checking for setter crashes other extensions (such as FontImage in Orchestra)
//string.Equals(targetObjectType.FullName, "System.Windows.Setter"))
{
return this;
}
_targetObject = target.TargetObject;
_targetProperty = target.TargetProperty;
FrameworkElement frameworkElement;
#if !SILVERLIGHT && !NETFX_CORE
FrameworkContentElement frameworkContentElement;
#endif
if ((frameworkElement = _targetObject as FrameworkElement) != null)
{
#if NET
_isFrameworkElementLoaded = frameworkElement.IsLoaded;
#endif
frameworkElement.Loaded += OnTargetObjectLoadedInternal;
frameworkElement.Unloaded += OnTargetObjectUnloadedInternal;
}
#if !SILVERLIGHT && !NETFX_CORE
else if ((frameworkContentElement = _targetObject as FrameworkContentElement) != null)
{
_isFrameworkElementLoaded = frameworkContentElement.IsLoaded;
frameworkContentElement.Loaded += OnTargetObjectLoadedInternal;
frameworkContentElement.Unloaded += OnTargetObjectUnloadedInternal;
}
#endif
}
#endif
var value = GetValue();
return value;
}