Пользовательский элемент управления верхнего уровня в XAML

StackOverflow https://stackoverflow.com/questions/2484306

Вопрос

Обычный пользовательский элемент управления выглядит следующим образом в XAML:

<UserControl x:Class="mynamespace.foo" ...namespaces...>
<!-- content -->
</UserControl>

Я хотел бы иметь возможность определить свой собственный объект верхнего уровня следующим образом:

<MyControl x:Class="mynamespace.mycontrol" ...namespaces...>
<!-- content -->
</UserControl>

Где MyControl является производным от самого UserControl.

Конечно, компилятор жалуется на то, что "MyControl" не найден.Есть ли способ обойти это?

Это было полезно?

Решение

Корневой тег - это базовый класс.Вот почему корнем Window1 по умолчанию является Window .Используя пункт меню Добавить > Пользовательский интерфейс...фактически создает подкласс для UserContol.

Если у вас есть какие-то общие элементы и вам нужен базовый класс управления, вы можете использовать базовый класс в качестве корневого тега.Вы не можете вывести свой класс из любого класса, который имеет визуальное дерево, определенное в xaml, но ваш базовый класс может быть производным от UserConrtol.

Сначала определите свой базовый класс:

public class MyControlBase : UserControl
{
    // ...
}

Затем создайте свой конкретный дочерний класс:

(Вы можете начать с автоматически созданного UserControl1 и изменить его оттуда)

public partial class MyControl1 : MyControlBase
{
    public MyControl1()
    {
        InitializeComponent();
    }
}

Затем измените сторону Xaml, чтобы она выглядела следующим образом:

<MyNamespace:MyControlBase
    x:Class="MyNamespace.MyControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:MyNamespace="clr-namespace:MyNamespace">

Это отличный способ создать пользовательские элементы управления, производные от встроенных, отличных от UserControl.Обычно рекомендуется просто использовать базовые UserConrtols, если вы можете, и создавать пользовательский элемент управления только в случае необходимости.

удачи,

Другие советы

Определите свое пространство имен в XAML, а затем используйте свое имя элемента управления в качестве тега:

<Window ...
    xmlns:my="..." />

    <my:mycontrol ... />

</Window>

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

Кроме того, WPF не позволяет вам выводить один класс UserControl из другого, напримересли BobsControl является UserControl, то вы не можете написать <local:BobsControl x:Class="MyNamespace.MyControl... /> либо.Я полагаю, это связано с тем, что пользовательские контроллеры имеют визуальный внешний вид (содержимое), встроенное в их XAML, и содержимое производного класса должно было бы заменить содержимое базового класса, поэтому визуальное наследование, как правило, бесполезно.

Однако, вы может сделайте это, если элемент верхнего уровня, из которого вы извлекаете, является обычай контроль.Пользовательские элементы управления не имеют внешнего вида (не определены в XAML).Итак , вы может создайте свой собственный элемент верхнего уровня в качестве пользовательского элемента управления, а затем извлеките из него "пользовательские" элементы управления.(Если вы пойдете по этому пути, вы, вероятно, захотите получить свой пользовательский элемент управления из ContentControl или применить ContentPropertyAttribute, чтобы ваш элемент верхнего уровня мог легко содержать другой XAML.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top