Подтвердить что ты не робот

Стиль 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, тогда все работает правильно. Любые идеи?

4b9b3361

Ответ 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.