样式 TargetType 在未附加到调试器时会导致 XamlParseException
Posted
技术标签:
【中文标题】样式 TargetType 在未附加到调试器时会导致 XamlParseException【英文标题】:Style TargetType causes XamlParseException when not attached to debugger 【发布时间】:2012-01-08 03:18:14 【问题描述】:我在几个不同的 WPF 应用程序中使用了一组非常简单的样式。我将此样式存储在一个通用项目的 Xaml 文件中,然后通过合并到每个项目中的App.xaml
中的Resources
来添加。
<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/editorsComboBoxEdit'.
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
如果我注释掉两个 Style
节点,那么一切正常。有什么想法吗?
【问题讨论】:
TargetType="x:Type <type>"
语法怎么样?
@Jay:同样的结果,不幸的是。
您是否将自定义控件的样式放入 Themes/Generic.xaml 中?
@Xin:见第一段。
@Xin:那些不是自定义控件;它们是 DevExpress WPF 工具集的一部分。我正在尝试在整个应用程序中对这两个对象应用默认样式。
【参考方案1】:
我遇到了同样的问题,对我来说这是将资源文件添加到项目中的方式。
我必须确保每一个我的 xaml 样式资源文件都设置为“页面”(在“构建操作”属性中)。默认情况下,它们并非都处于这种模式(一些作为“内容”,另一些作为“编译”或“嵌入资源”或“资源”)并且导致了这种问题。
也许你也一样……
edit : 据我所知,它与 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 已经需要什么),当然我不能说“调试”,因为调试模式总是有效的......我花了在弄清楚这个解决方案之前......很高兴它有帮助
【讨论】:
很好的电话!这解决了这个问题。不过,公平地说,我确实在赏金描述中声明我想要解释为什么会这样;有什么想法吗? 查看我的编辑,但正如所写,没有任何证据可以证明,这只是我推断的:) 谢谢;这不太符合我的经验(我实际上从未在发布模式下构建,它总是在调试模式下编译,并且可以与调试器一起工作 attached 但不能与它 detached )。无论如何,这是我能找到的最好的解释,所以我会在计时器到时(大约 5 分钟后)奖励赏金 哇,这很容易解决。在我测试它之前我很乐观并且赞成它并且确实它有效:-) 你为我节省了很多时间!非常感谢 !而且我可以确认……申报的顺序很重要。不要尝试使用尚未声明的东西。【参考方案2】:对我来说,有效的方法有点不同。我确实已经将构建操作设置为“页面”,但是我必须删除任何目录。示例:
<ResourceDictionary Source="resources/Common.xaml" />
会变成
<ResourceDictionary Source="Common.xaml" />
值得注意的是,自从我与 silverlight 共享文件后,我就被链接了文件
【讨论】:
【参考方案3】:您是否在具有 app.xaml.cs 的项目中引用了 devexpress dll?如果不尝试添加参考..
还可以使用 fuslogvw.exe 并确保加载了 devexpress dll。
【讨论】:
我还没有尝试过您的第二步,但是是的,公共项目(具有 Xaml 文件)和主项目(具有 App.xaml)都引用了包含这些的 DLL对象。 +1 是个好主意,但另一个答案解决了我的问题。谢谢!【参考方案4】:我收到 XamlParseException 并显示消息“无法从文本 's:ScatterViewItem' 创建 'Type'”,但仅在直接运行应用程序时,而不是从 Visual Studio 调试器运行。
This external answer 告诉我,无论出于何种原因,尚未加载必要的程序集。 This *** answer 向我展示了如何为我的 WPF 应用程序创建 Main() 函数。我只是简单地输入“新ScatterViewItem();”在我的 Main() 的顶部,问题就消失了!
我不知道这里发生了什么,特别是因为 ScatterViewItem 被来自同一个程序集的 ScatterView 包围。这听起来确实像是 XAML 解析中的一个讨厌的错误。
【讨论】:
以上是关于样式 TargetType 在未附加到调试器时会导致 XamlParseException的主要内容,如果未能解决你的问题,请参考以下文章
如何在 firebug 和 chrome 调试器中看到附加到 :hover 和其他伪类的样式
您能否为一种 XAML 样式定义多个 TargetType?