Стиль 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
, тогда все работает правильно. Любые идеи?
Ответы
Ответ 1
У меня была такая же проблема, и для меня это было так, как файлы ресурсов были добавлены в проект.
Мне пришлось убедиться, что каждый из моих файлов ресурсов стиля xaml был настроен как "Страница" (в свойстве "action action" ). По умолчанию они не все в этом режиме (некоторые как "Контент", другие как "компиляция" или "встроенный ресурс" или "ресурс" ), и это вызвало такую проблему.
Возможно, это то же самое для вас...
изменить: из того, что я мог бы собрать, это как-то связано с тем, как внедренный в проект код xaml и, в частности, порядок, в котором он анализируется WPF: если исходный файл как "Страница", порядок, в котором объединен словарь, не учитывается, поэтому это будет работать в режиме выпуска:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- let 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 хранит все в памяти в режиме отладки, в то время как он сохраняет только то, что нужно в режиме выпуска (например, код вызова, а не код определения), но опять же, это просто моя догадка...
edit 2: для меня это был кошмар для отладки, потому что это было еще хуже: он работал в некоторых версиях релиза, а не в других, потому что в зависимости от порядка действий, предпринятых пользователем, он получал бы ошибку или нет ( ресурс, возможно, уже был заряжен в памяти или нет при вызове, в зависимости от того, какой WPF уже нужен на данном этапе), и, конечно же, я не мог "отлаживать" для каждого пользователя, так как режим отладки всегда работал... Мне потребовался пока перед вычислением этого решения... рад, что это помогло
Ответ 2
Для меня работа была немного иной. Я уже установил действие сборки на "страницу", но все каталоги, которые мне пришлось удалить. Пример:
<ResourceDictionary Source="resources/Common.xaml" />
станет
<ResourceDictionary Source="Common.xaml" />
Заметьте, что я был связан с файлами, так как я делил их с silverlight
Ответ 3
Есть ли у вас ссылка на dll devexpress в проекте с app.xaml.cs? если не пытаться добавить ссылку..
Также проверьте загрузку сборки, используя
fuslogvw.exe и убедитесь, что dll файлы devexpress загружены.
Ответ 4
Я получал исключение XamlParseException с сообщением "Не удалось создать" Тип "из текста: ScatterViewItem", но только при запуске приложения напрямую, а не из отладчика Visual Studio.
Этот внешний ответ сказал мне, что по какой-то причине необходимая сборка еще не была загружена. fooobar.com/info/65226/... показал мне, как создать функцию Main() для моего приложения WPF. Я просто положил "new ScatterViewItem();" в верхней части моего Main(), и проблема исчезла!
Я понятия не имею, что здесь происходит, тем более что ScatterViewItem заключен в ScatterView из той же сборки. Это действительно звучит как неприятная ошибка в анализе XAML.