Пользовательский элемент управления WPF не может найти сборку во время разработки - PullRequest
1 голос
/ 24 сентября 2010

У меня есть серия пользовательских элементов управления WPF в одной библиотеке классов. Существует несколько уровней элементов управления, и самый верхний уровень будет использовать несколько элементов управления более низкого уровня. Некоторые низкоуровневые элементы управления импортируют классы из других внешних библиотек DLL, а затем используют эти классы в свойствах элемента управления. Проблема заключается в том, что когда я пытаюсь поместить один из этих элементов управления более низкого уровня в элемент управления более высокого уровня, они выдают ошибку при попытке визуализации в конструкторе, заявляя, что он не может найти сборки классов, используемые для свойств. Тем не менее, они будут работать нормально, если будут помещены в главное окно исполняемого файла, и фактически будут отлично работать в режиме выполнения, а не в конструкторе. Не конец света ... но королевская боль.

В качестве быстрого примера:

using MyClassLibrary;

public partial class MyControl : UserControl
{
    public MyControl {}

    public MyClass ClassInstance { get; set; }
}

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

Я также знаю, что та же проблема может возникнуть из-за внешних классов, используемых в конструкторе, OnLoaded и т. Д. (Все, что выполняется дизайнером), но уже исправили их, проверив, находится ли он в режиме «Дизайн», и отключив выполнение этого кода. Просто я не могу понять, как заставить его не обрабатывать свойства элемента управления.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 18 мая 2011

Я столкнулся с подобной проблемой и обошел ее, заставив конструктор фактически вызвать вторую функцию, которая вызвала код в библиотеке:

    public WorkspacePanel()
    {
        InitializeComponent();
        if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
        {
            runtimeConstructor();
        }
    }

    private void runtimeConstructor()
    {
        MyLibraryClass foo = new MyLibraryClass();
    }

Каким-то образом этот дополнительный уровень косвенности обманул его.

Но я столкнулся с дополнительной проблемой, когда начал пытаться ссылаться на свою библиотеку в виде XAML: дизайнер просто не смог ее найти. Оказывается, что дизайнер не может найти неуправляемые библиотеки, если они не находятся в вашей системной папке. Поэтому, если это та же проблема , добавление выходного каталога в переменную среды PATH может исправить это.

0 голосов
/ 07 февраля 2013

xmlns: usercontrols = "clr-namespace: Company.Project.OtherAssembly.UserControls; сборка = Company.Project.OtherAssembly"

Добавить атрибут сборки?

0 голосов
/ 24 сентября 2010

Вы ссылались на класс в Xaml? Пример:

xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit"
...