Стиль 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.

Другие вопросы по тегам