Стиль TargetType вызывает XamlParseException, когда он не присоединен к отладчику - PullRequest
12 голосов
/ 28 ноября 2011

У меня есть очень простой набор стилей, который я использую в нескольких различных приложениях WPF. У меня этот стиль хранится в файле Xaml в общем проекте, а затем добавляется путем объединения в Resources in 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 ]

28 голосов
/ 09 декабря 2011

У меня была такая же проблема, и для меня это был способ добавления файлов ресурсов в проект.

Я должен был убедиться, что каждый из моихФайлы ресурсов в стиле xaml были настроены как «Страница» (в свойстве «build action»).По умолчанию они не все были в этом режиме (некоторые как «Содержимое», другие как «Компилировать» или «Встроенный ресурс» или «Ресурс») и , которые вызвали проблему такого рода.

может быть, это то же самое для вас ...

edit: Из того, что я мог бы собрать, это как-то связано с тем, как код 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 хранит все в памяти в режиме отладки, в то время как он хранит только то, что ему нужно в режиме выпуска (например, вызывающий код, а не код определения), но опять же, это только мое предположение ...

edit 2: для меня это был кошмар для отладки, потому что это было еще хуже: это работало в некоторых конфигурациях релиза, а не в других, потому что в зависимости от порядка действий, предпринятых пользователем, он получал ошибку или нет (ресурсвозможно, уже был заряжен в памяти или нет при вызове, в зависимости от того, какой WPf уже нужен в данный момент), и, конечно, я не мог «отладить», скажем так, потому что режим отладки всегда работал ... Мне потребовалось некоторое время, прежде чемвыяснить это решение ... рад, что это помогло

4 голосов
/ 13 сентября 2012

Для меня то, что сработало, было немного по-другому.Я уже установил действие сборки на «Page», но все каталоги мне пришлось удалить.Пример:

   <ResourceDictionary Source="resources/Common.xaml" />

станет

   <ResourceDictionary Source="Common.xaml" />

Заметьте, я связывал файлы, так как делился ими с silverlight

1 голос
/ 09 декабря 2011

Есть ли у вас ссылки на devexpress dll в проекте, в котором есть app.xaml.cs? если нет, попробуйте добавить ссылку ..

Также проверьте загрузку сборки, используя fuslogvw.exe и убедитесь, что DLL-файлы devexpress загружены.

0 голосов
/ 27 января 2016

Я получаю исключение XamlParseException с сообщением «Не удалось создать тип из текста s: ScatterViewItem» », но только при непосредственном запуске приложения, а не из отладчика Visual Studio.

Этот внешний ответ сказал мне, что по какой-то причине необходимая сборка еще не была загружена. В ответе StackOverflow показано, как создать функцию Main () для моего приложения WPF. Я просто положил "новый ScatterViewItem ();" наверху моего Main (), и проблема ушла!

Понятия не имею, что здесь происходит, тем более что ScatterViewItem заключен в ScatterView из той же сборки. Это наверняка звучит как неприятная ошибка при разборе XAML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...