Стиль TargetType вызывает XamlParseException, когда он не присоединен к отладчику
У меня есть очень простой набор стилей, который я использую в нескольких различных приложениях WPF. У меня этот стиль хранится в файле Xaml в общем проекте, а затем добавляется путем слияния с Resources
в 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
Если я закомментирую оба Style
узлы, то все работает правильно. Есть идеи?
4 ответа
У меня была такая же проблема, и для меня это был способ добавления файлов ресурсов в проект.
Я должен был убедиться, что каждый из моих файлов ресурсов стиля xaml был настроен как "Страница" (в свойстве "build action"). По умолчанию они не все были в этом режиме (некоторые как "Содержимое", другие как "Компилировать" или "Встроенный ресурс" или "Ресурс"), и это вызывало проблему такого рода.
может быть, это то же самое для вас...
редактировать: из того, что я мог собрать, это как-то связано с тем, как код xaml внедряется в проект, а именно с порядком, в котором он анализируется 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 уже нужен в данный момент), и, конечно, я не мог "отладить", скажем так, режим отладки всегда работал... Мне потребовалось некоторое время, прежде чем я понял это решение... рад, что помогло
Для меня то, что сработало, было немного по-другому. Я уже установил действие сборки на "Page", но все каталоги мне пришлось удалить. Пример:
<ResourceDictionary Source="resources/Common.xaml" />
станет
<ResourceDictionary Source="Common.xaml" />
Примечательно, что у меня были связанные файлы, так как я делился ими с Silverlight
У вас есть ссылка на devexpress dll в проекте, в котором есть app.xaml.cs? если нет, попробуйте добавить ссылку..
Также проверьте загрузку сборки с помощью fuslogvw.exe и убедитесь, что загружены DLL-файлы devexpress.
Я получал исключение XamlParseException с сообщением "Не удалось создать" тип "из текста s:ScatterViewItem" ", но только при непосредственном запуске приложения, а не из отладчика Visual Studio.
Этот внешний ответ сказал мне, что по какой-то причине необходимая сборка еще не была загружена. Этот ответ Stackru показал мне, как создать функцию Main() для моего приложения WPF. Я просто положил "новый ScatterViewItem();" наверху моего Main(), и проблема ушла!
Я понятия не имею, что здесь происходит, тем более что ScatterViewItem заключен в ScatterView из той же сборки. Это наверняка звучит как неприятная ошибка при разборе XAML.