我在一些不同的WPF应用程序中使用了一组非常简单的样式。我将此样式存储在一个公共项目的Xaml文件中,然后通过合并到每个项目中Resources
的{{1}}中添加。
App.xaml
不幸的是,有关此问题导致<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity">
<Style TargetType="dxe:ComboBoxEdit">
<Setter Property="AutoComplete" Value="True" />
<Setter Property="IncrementalFiltering" Value="True" />
<Setter Property="ImmediatePopup" Value="True" />
<Setter Property="IsTextEditable" Value="True" />
<Setter Property="ClearSelectionOnBackspace" Value="True" />
</Style>
<Style TargetType="dxe:ComboBoxEditSettings">
<Setter Property="AutoComplete" Value="True" />
<Setter Property="IncrementalFiltering" Value="True" />
<Setter Property="ImmediatePopup" Value="True" />
<Setter Property="IsTextEditable" Value="True" />
</Style>
</ResourceDictionary>
关于XamlParseException
属性,但仅在未附加到调试器时。如果我在调试器中启动应用程序,一切都很好。如果我“开始没有调试”,我会在加载TargetType
时得到这个:
App.xaml
如果我注释掉两个System.Windows.Markup.XamlParseException: 'Failed to create a 'TargetType' from the text 'dxe:ComboBoxEdit'.' Line number '5' and line position '12'. ---> System.Xaml.XamlParseException: Type reference cannot find type named '{http://schemas.devexpress.com/winfx/2008/xaml/editors}ComboBoxEdit'.
at MS.Internal.Xaml.Context.ObjectWriterContext.ServiceProvider_Resolve(String qName)
at MS.Internal.Xaml.ServiceProviderContext.System.Windows.Markup.IXamlTypeResolver.Resolve(String qName)
at System.Xaml.Replacements.TypeTypeConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateObjectWithTypeConverter(ServiceProviderContext serviceContext, XamlValueConverter`1 ts, Object value)
at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateFromValue(ServiceProviderContext serviceContext, XamlValueConverter`1 ts, Object value, XamlMember property)
at System.Xaml.XamlObjectWriter.Logic_CreateFromValue(ObjectWriterContext ctx, XamlValueConverter`1 typeConverter, Object value, XamlMember property, String targetName, IAddLineInfo lineInfo)
--- 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)
at Shell.App.InitializeComponent() in c:\DevProjects\CoreApplication\Shell\App.xaml:line 1
at Shell.App.Main() in C:\DevProjects\CoreApplication\Shell\obj\x86\Debug\App.g.cs:line 0
个节点,那么一切正常。有什么想法吗?
答案 0 :(得分:28)
我遇到了同样的问题,对我而言,这是资源文件添加到项目中的方式。
我必须确保我的xaml样式资源文件中的每一个都设置为“Page”(在“构建操作”属性中)。默认情况下,它们不是全部处于此模式(某些为“内容”,其他为“编译”或“嵌入资源”或“资源”),而 导致此类问题。
也许对你来说也一样......
编辑从我可以收集到的内容中,它与xaml代码嵌入项目中的方式有关,特别是与 Order 有关的解析方式。 WPF:如果源文件设置为“页面”,则不会考虑合并字典的顺序,因此这将在发布模式下工作:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- let's say this dictionary contains a call to "MyButtonStyle" ... -->
<ResourceDictionary Source="resources/Common.xaml" />
<!-- ... and this one contains the definition of "MyButtonStyle" -->
<ResourceDictionary Source="resources/GeneralResources.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
但这不适用于其他选项(不管怎么说都不是,我没有尝试过每一个选项),因为调用会在定义之前被解析。
至于为什么它在调试模式下而不是在发布模式下工作(或者在没有调试时启动的情况下),我猜测这是因为WPF根据你所处的模式不同地解析和存储资源到内存中(调试或不)。我认为WPF在调试模式下将所有内容存储在内存中,而它只在发布模式下存储它所需的内容(例如调用代码而不是定义代码),但是再次,它只是我的猜测......
编辑2:对我来说这是调试的噩梦,因为它更糟糕:它在一些发布配置中工作而不是其他配置,因为根据用户采取的操作顺序,他会得到错误(在调用时,资源可能已经在内存中充电,这取决于此时WPf已经需要的内容),当然我无法按照说法“调试”,因为调试模式始终有效...它花了我一个在确定这个解决方案之前......很高兴帮助
答案 1 :(得分:4)
对我而言,有些不同之处。我已经将构建操作设置为'Page',但我必须删除任何目录。例如:
<ResourceDictionary Source="resources/Common.xaml" />
会变成
<ResourceDictionary Source="Common.xaml" />
值得注意的是,自从我与silverlight共享文件后,我就成了链接文件
答案 2 :(得分:1)
你有没有参考app.xaml.cs项目中的devexpress dll?如果没有尝试添加参考..
还要使用。检查装配加载 fuslogvw.exe并确保加载了devexpress dll。
答案 3 :(得分:0)
我收到一条XamlParseException,其中包含“无法从文本中创建'Type'的消息:ScatterViewItem'”,但仅在直接运行应用程序时,而不是从Visual Studio调试器运行。
This external answer告诉我,无论出于何种原因,尚未装载必要的装配。 This StackOverflow answer向我展示了如何为我的WPF应用程序创建Main()函数。我只是简单地说“新ScatterViewItem();”在我的Main()的顶部,问题消失了!
我不知道这里发生了什么,特别是因为ScatterViewItem被来自同一程序集的ScatterView包围。它确实听起来像XAML解析中的一个讨厌的错误。