WPF DLL собирается правильно, но при использовании вызывает ошибки - PullRequest
0 голосов
/ 26 апреля 2019

Я в Visual Studio 2017, использую .Net 4.6.1

Я создал библиотеку (в проекте A) стилей WPF, элементов управления, конвертеров и т. Д. Для использования при создании приложений. Идея заключается в том, что в случае изменения фирменного стиля мы можем переиздать библиотеку, и все приложения, ссылающиеся на нее, будут переименованы.

Project A не содержит ошибок или предупреждений и правильно создает файл .dll.

Однако, когда я ссылаюсь на .DLL в Проекте B, xaml, который ссылается на некоторые компоненты .DLL, выдает сообщение Loading designer... You can continue working while the designer is loading in the background навсегда. Когда я пытаюсь запустить проект B, он говорит мне, что он находится в режиме перерыва с System.StackOverflowException, и все.

Я попытался добавить и удалить строки в файле app.xaml:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Colours.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Brushes.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Text.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

и это дает мне подсказку, возможно, в том, что только некоторые ссылки (или, может быть, слишком много ссылок?) Приводят к сбою конструктора, но у меня чертовски много времени, пытаясь выяснить, что происходит.

Есть ли у вас какие-либо идеи о том, как я могу отладить эту проблему, учитывая, что Проект A, где проблема, кажется, строится правильно? Например, какие-либо советы или хитрости или дополнительные инструменты, которые могут выявить проблемы во время разработки?

В качестве альтернативы, любые советы о том, как проверить все в Проекте B, должны быть приняты. Я проверил все ссылки, пространства имен и словари ресурсов и уверен, что синтаксис правильный, но, может быть, есть ошибка, которую я мог бы пропустить?

1 Ответ

0 голосов
/ 29 апреля 2019

Так вот, оказывается, это одна из тех досадных проблем, которую вы оставляете на выходные, а когда вы возвращаетесь, она изменила свой внешний вид.Я вернулся и больше не мог получить ошибку переполнения стека.

Обнаруженной ошибкой был сбой UserControl в проекте A, чтобы найти один из ресурсов, встроенных в тот же проект.Мне удалось это исправить, изменив ссылки в словаре Merged со стандартного на Pack URI формат (ссылки на локальные пути работают только при просмотре в самом проекте - они не работают в DLL).Из этого:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Styles/Buttons.xaml"/>
            <ResourceDictionary Source="/Styles/Gradients.xaml"/>
            <ResourceDictionary Source="/Styles/Text.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

до этого:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Buttons.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Gradients.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Text.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Из этого я узнал - локальные ссылки работают только локально в DLL между словарями ресурсов;если вы хотите использовать UserControl из DLL, вы должны использовать формат пакета.В будущем я буду использовать Pack URI везде, чтобы они не вызывали синтаксическую ошибку!

...