Хобрук: Ваш путь к мастерству в программировании

XamlParseException при ссылке на преобразователь из другой сборки

У меня есть XAML UserControl, который использует преобразователь, содержащийся в том же проекте.

xmlns:filter="clr-namespace:SampleModuleFilter" - namespace definition

Все идет нормально. Однако, когда я перемещаю преобразователь в другую сборку и соответствующим образом настраиваю пространства имен и ссылки, я получаю следующее исключение: XamlParseException - «Предоставление значения в «System.Windows.Markup.StaticResourceHolder» вызвало исключение. Внутреннее исключение указывает: «Метод или операция не реализована." что просто странно. Пространство имён после переноса в другую библиотеку выглядит так:

xmlns:filter="clr-namespace:SampleLibrary.Converters;assembly=SampleLibrary"

Определение ресурса преобразователя:

<filter:BoolToVisibilityConverter x:Key="boolToVisibilityConverter" />

и я использую его так:

Visibility="{Binding DisplayLabel, Converter={StaticResource ResourceKey=boolToVisibilityConverter}}"

IntelliSense, очевидно, может видеть библиотеку, поскольку она работает нормально (предлагает класс преобразователя после того, как я пишу префикс пространства имен).

Есть идеи, в чем может быть проблема?

13.04.2012

  • Является ли действие сборки правильным? Я заметил, что при перемещении любых файлов, связанных с WPF, между сборками действие сборки изменяется. 13.04.2012
  • является ли конвертер общедоступным классом? 13.04.2012
  • Да, действие сборки по-прежнему Compile, а конвертер является общедоступным классом. 13.04.2012
  • Я получил ту же ошибку в моем случае, причина была в том, что ключ ресурса был написан с ошибкой. Мне пришлось посмотреть на внутреннее исключение, чтобы узнать это. 14.07.2014
  • Это может произойти из-за того, что вы забыли добавить какие-либо новые сборки в список для копирования установщиком (например, Inno Setup). 14.05.2015

Ответы:


1

Вы также должны ссылаться на свою сборку в файле кода программной части.

Если вы ссылаетесь на сборку только в части XAML, компилятор возвращает исключение «не удалось загрузить xxx.dll».

Вы также должны сделать прямой вызов подключенной сборки, сделав что-то вроде этого:

var dummy = new MyExternalAssemby.MyType();

или просто это в новой строке кода

new MyExternalAssemby.MyType();

без помещения результата в фиктивную переменную.

Обычно я делаю это в статическом конструкторе. Я думаю, что это ошибка в интерпретаторе XAML, потому что XAML не компилируется, а просто «переводится» в BAML (двоичный XAML). Таким образом, если вы ссылаетесь на тип в XAML, не создавая «жесткой» ссылки в коде позади компоновщика NET, он вообще его игнорирует.

HTH Лоренцо

06.02.2014

2

Вместо просто:

 xmlns:filter="clr-namespace:SampleModuleFilter"

Ссылка на сборку тоже

 xmlns:filter="clr-namespace:SampleModuleFilter;assembly=SampleModuleFilterAssemblyName"

Это должно делать свое дело.

30.07.2014

3

Это странно; все наши преобразователи расположены в центральной библиотеке, и все работает нормально. Предполагая, что ссылки и пространства имен верны, единственное, что я мог бы предложить, это очистить и перестроить два рассматриваемых проекта.

13.04.2012

4

Используется ли «SampleLibrary.dll» где-то в вашем коде?

У меня возникла странная ошибка, когда ссылочные сборки, используемые только в файле xaml, пропускаются во время компиляции и не отображаются в зависимостях dll.

13.04.2012
  • Спасибо за совет, пробовал, к сожалению не помогло 13.04.2012
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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