2013-04-03 56 views
2

我有一個定義的樣式ResourceDictionary中具有與綁定的StringFormat如下一個控件模板:WPF ResourceDictionary中的StringFormat XamlParseException

<TextBlock Text="{Binding TotalCash, Mode=OneWay, StringFormat={}{0:N2}, FallbackValue=0.00}" /> 

我在本地運行,一切都很好,但我做了編譯和安裝在服務器上我得到以下異常,當我啓動任何世界糧食計劃署屏使得使用資源字典的:

System.Windows.Markup.XamlParseException: 'Unexpected token after end of markup extension.' Line number '224' and line position '148'. ---> System.Xaml.XamlParseException: 'Unexpected token after end of markup extension.' Line number '224' and line position '148'. 
    at MS.Internal.Xaml.Parser.MePullParser.<Parse>d__0.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<LogicStream_Attribute>d__6f.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_EmptyElement>d__14.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_Element>d__7.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementContent>d__4a.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementBody>d__23.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_Element>d__7.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementContent>d__4a.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementBody>d__23.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_Element>d__7.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementContent>d__4a.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementBody>d__23.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_Element>d__7.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementContent>d__4a.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementBody>d__23.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_Element>d__7.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementContent>d__4a.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementBody>d__23.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_Element>d__7.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_PropertyContent>d__5f.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_NonemptyPropertyElement>d__42.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_PropertyElement>d__35.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementBody>d__23.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_Element>d__7.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementContent>d__4a.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementBody>d__23.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_Element>d__7.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementContent>d__4a.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_ElementBody>d__23.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<P_Element>d__7.MoveNext() 
    at MS.Internal.Xaml.Parser.XamlPullParser.<Parse>d__0.MoveNext() 
    at MS.Internal.Xaml.NodeStreamSorter.ReadAheadToEndOfAttributes() 
    at MS.Internal.Xaml.NodeStreamSorter.ReadAheadAndSortCtorProperties() 
    at MS.Internal.Xaml.NodeStreamSorter.MoveNext() 
    at System.Xaml.XamlXmlReader.Read() 
    at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack`1 stack, IStyleConnector styleConnector) 
    at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) 
    --- End of inner exception stack trace --- 
    at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri) 
    at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) 
    at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) 
    at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) 
    at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) 

我做了一些挖掘和得到它由{}改變ResourceDictionary中的StringFormat工作{0:N2}到N2 :

<TextBlock Text="{Binding TotalCash, Mode=OneWay, StringFormat=N2, FallbackValue=0.00}" /> 

其放於用戶控件以下工作:

<TextBlock Text="{Binding TotalCash, Mode=OneWay, StringFormat={}{0:N2}, FallbackValue=0.00}" /> 

我的問題是,爲什麼在用戶控件相同的StringFormat工作,但不是資源字典?我很高興它正在工作,但想知道爲什麼。

回答

3

這是一個WPF bug。我猜你已經在開發機器上本地安裝了.NET 4.5(因爲可能安裝了Visual Studio 2012),而不是在你的服務器上(它只有.NET 4)。因此,您的服務器沒有Microsoft向.NET 4.5中的WPF添加的錯誤修正。

+0

非常可怕。是的,正在開發使用VS 2012的.Net 4.0 WPF應用程序。我會預期將Target框架設置爲.Net 4.0會導致一致的行爲。猜猜我們最好不要將我們的測試服務器更新到4.5。如果推出給客戶,這可能是一場災難。 – KornMuffin

+1

@KornMuffin:不幸的是,如果.NET 4.5是在本地安裝的(因爲它是覆蓋.NET 4 DLL的就地替換),那麼在您的項目屬性中定位.NET 4並沒有多大作用。編譯器將阻止您調用新的僅支持.NET 4.5的API,但您永遠無法知道您的應用程序如何在.NET 4下實際運行,而無需在專用的.NET 4機器上進行測試。請參閱[建議Microsoft](http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3127346-support-a-net-4-0-service-pack-on-windows-xp- supp)瞭解更多詳情。 –