Последнее время начал активнее писать на WPF. И тут начали появляться трудности, которых совсем не ожидал. Об одной из них поведаю сейчас.
Ничего особенного не делал. Создал свой элемент управления (назовем его "X") и прописал необходимый мне функционал. Затем я создаю следующий элемент управления, наследованный от класса X. И тут появляется ошибка: cannot be the root of a XAML file because it was defined using XAML. На нее пришлось потратить некоторое количество времени и сил. С трудом удалось разобраться.
Оказывается, визуальное наследование в WPF не поддерживается! Первое время у меня был ступор: как же дальше быть без наследования элементов управлления? Но выход здесь есть. Правда не совсем удобный. Для этого, наш базовый класс нужно определить полностью в коде без использования XAML.
Т.к. экземпляр производного класса не создается в конструкторе и содержание членов базовго класса нулевое, ниже приведенный код устраняет эту проблему. Добавьте его в ваш базовый класс.
public class UserControlInCode : UserControl
{
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
StackPanel panel = new StackPanel();
((IAddChild)newContent).AddChild(panel);
}
}
В этом коде мы можем добавлять необходимые нам элементы управления без использования XAML.