1616 /// </summary>
1717 [ MarkupExtensionReturnType ( typeof ( string ) ) ]
1818 [ ContentProperty ( "Member" ) , DefaultProperty ( "Member" ) ]
19- [ TypeConverter ( typeof ( ResourceExtensionConverter ) ) ]
19+ [ TypeConverter ( typeof ( StaticExtensionConverter ) ) ]
2020 public class StaticExtension : System . Windows . Markup . StaticExtension
2121 {
2222 private static readonly ConcurrentDictionary < Type , ResourceManagerWrapper > Cache = new ConcurrentDictionary < Type , ResourceManagerWrapper > ( ) ;
@@ -44,36 +44,25 @@ public override object ProvideValue(IServiceProvider serviceProvider)
4444 try
4545 {
4646 if ( this . Member == null )
47- throw new InvalidOperationException ( "MarkupExtensionStaticMember" ) ;
48- if ( DesignMode . IsDesignMode )
4947 {
50- var target = serviceProvider . GetService ( typeof ( IProvideValueTarget ) ) as IProvideValueTarget ;
51- if ( target != null && target . TargetObject is FrameworkElement )
52- {
53- var frameworkElement = ( FrameworkElement ) target . TargetObject ;
54- var value = ( XmlLanguage ) frameworkElement . GetValue ( FrameworkElement . LanguageProperty ) ;
55- if ( value != null )
56- {
57- Translator . CurrentCulture = CultureInfo . GetCultureInfo ( value . IetfLanguageTag ) ;
58- }
59- }
60- if ( target != null && ! ( target . TargetObject is DependencyObject ) )
61- {
62- _xamlTypeResolver = serviceProvider . GetService ( typeof ( IXamlTypeResolver ) ) as IXamlTypeResolver ;
48+ throw new InvalidOperationException ( "MarkupExtensionStaticMember" ) ;
49+ }
6350
64- return this ;
65- }
51+ if ( DesignMode . IsDesignMode && IsTemplate ( serviceProvider ) )
52+ {
53+ _xamlTypeResolver = serviceProvider . GetService ( typeof ( IXamlTypeResolver ) ) as IXamlTypeResolver ;
54+ return this ;
6655 }
6756
68- Type type = this . MemberType ;
57+ var type = this . MemberType ;
6958 string name ;
7059 if ( type != ( Type ) null )
7160 {
7261 name = this . Member ;
7362 }
7463 else
7564 {
76- int length = this . Member . IndexOf ( '.' ) ;
65+ var length = this . Member . IndexOf ( '.' ) ;
7766 if ( length < 0 )
7867 {
7968 if ( DesignMode . IsDesignMode )
@@ -82,43 +71,26 @@ public override object ProvideValue(IServiceProvider serviceProvider)
8271 }
8372 return string . Format ( Properties . Resources . UnknownErrorFormat , Member ) ;
8473 }
85- else
74+ var qualifiedTypeName = this . Member . Substring ( 0 , length ) ;
75+ if ( string . IsNullOrEmpty ( qualifiedTypeName ) )
8676 {
87- string qualifiedTypeName = this . Member . Substring ( 0 , length ) ;
88- if ( string . IsNullOrEmpty ( qualifiedTypeName ) )
77+ if ( DesignMode . IsDesignMode )
8978 {
90- if ( DesignMode . IsDesignMode )
91- {
92- throw new ArgumentException ( "Expecting format p:Resources.Key was:" + Member ) ;
93- }
94- return string . Format ( Properties . Resources . UnknownErrorFormat , Member ) ;
79+ throw new ArgumentException ( "Expecting format p:Resources.Key was:" + Member ) ;
9580 }
96- else
81+ return string . Format ( Properties . Resources . UnknownErrorFormat , Member ) ;
82+ }
83+
84+ type = this . GetMemberType ( serviceProvider , qualifiedTypeName ) ;
85+
86+ name = this . Member . Substring ( length + 1 , this . Member . Length - length - 1 ) ;
87+ if ( string . IsNullOrEmpty ( name ) )
88+ {
89+ if ( DesignMode . IsDesignMode )
9790 {
98- if ( serviceProvider == null )
99- throw new ArgumentNullException ( "serviceProvider" ) ;
100- if ( _xamlTypeResolver == null )
101- {
102- _xamlTypeResolver = serviceProvider . GetService ( typeof ( IXamlTypeResolver ) ) as IXamlTypeResolver ;
103- }
104- if ( _xamlTypeResolver == null )
105- {
106- throw new ArgumentException ( "MarkupExtensionNoContext IXamlTypeResolver" ) ;
107- }
108- else
109- {
110- type = _xamlTypeResolver . Resolve ( qualifiedTypeName ) ;
111- name = this . Member . Substring ( length + 1 , this . Member . Length - length - 1 ) ;
112- if ( string . IsNullOrEmpty ( name ) )
113- {
114- if ( DesignMode . IsDesignMode )
115- {
116- throw new ArgumentException ( "Expecting format p:Resources.Key was:" + Member ) ;
117- }
118- return string . Format ( Properties . Resources . UnknownErrorFormat , Member ) ;
119- }
120- }
91+ throw new ArgumentException ( "Expecting format p:Resources.Key was:" + Member ) ;
12192 }
93+ return string . Format ( Properties . Resources . UnknownErrorFormat , Member ) ;
12294 }
12395 }
12496
@@ -160,5 +132,32 @@ private static ResourceManagerWrapper GetManager(Type type)
160132 }
161133 return new ResourceManagerWrapper ( resourceManager ) ;
162134 }
135+
136+ private static bool IsTemplate ( IServiceProvider serviceProvider )
137+ {
138+ var target = serviceProvider . GetService ( typeof ( IProvideValueTarget ) ) as IProvideValueTarget ;
139+ return target != null &&
140+ ! ( target . TargetObject is DependencyObject ) ;
141+ }
142+
143+ private Type GetMemberType ( IServiceProvider serviceProvider , string qualifiedTypeName )
144+ {
145+ if ( serviceProvider == null )
146+ {
147+ throw new ArgumentNullException ( "serviceProvider" ) ;
148+ }
149+
150+ if ( _xamlTypeResolver == null )
151+ {
152+ _xamlTypeResolver = serviceProvider . GetService ( typeof ( IXamlTypeResolver ) ) as IXamlTypeResolver ;
153+ }
154+
155+ if ( _xamlTypeResolver == null )
156+ {
157+ throw new ArgumentException ( "MarkupExtensionNoContext IXamlTypeResolver" ) ;
158+ }
159+
160+ return _xamlTypeResolver . Resolve ( qualifiedTypeName ) ;
161+ }
163162 }
164163}
0 commit comments