Подтвердить что ты не робот

Почему я не могу использовать атрибут Name в UserControl в той же сборке?

Когда я создал WPF UserControl и попытался его использовать, я получил следующую ошибку компилятора:

Поскольку "UserControl1" реализован в той же сборке, вы должны установить атрибут x: Name, а не атрибут Name.

В сообщении ясно, что делать, чтобы исправить это, но в чем его причина? Почему я не могу использовать Name здесь?

4b9b3361

Ответ 1

x: Имя - это просто более явный способ сказать "Атрибут имени в этом конкретном пространстве имен XML". Тот факт, что WPF не может скомпилировать его без указания этого намека, потому что он в той же сборке является просто ограничением того, как они написали парсер.

Если вы спрашиваете, почему так, я не знаю точно, потому что я не писал его. Вероятно, это связано с необходимостью разрешить атрибут Name (read: Dependency Property) на что-то конкретное до создания вашего UserControl1, другими словами, catch-22.

Ответ 2

В начале компилятор XAML был написан, чтобы включить создание "деревьев".net-объектов, в Microsoft было использовано 101 проект, который использовал XAML. Компилятор XAML ничего не знает о WPF.

Свойство "Name" определено WPF и неизвестно компилятором XAML. WPF сопоставляет имя свойства так же, как "TAG названия", которое поддерживается компилятором XAML. "X" в "x: name" говорит, что используйте "имя", как определено схемой xml Xml, "Имя" говорит, что на данном объекте называется свойство "имя". См. В WPF, какие различия между атрибутами x: Name и Name? для более подробной информации.

Компилятор XAML очень ограничен в том, что он может делать с пользовательским элементом управления, не загружая сборку, которая определяет пользовательский элемент управления. Поскольку XAML необходимо скомпилировать до того, как сборка может быть загружена, компилятор xaml явно не загружает сборку для элемента управления, который реализован в той же сборке. Поэтому компилятор XAML даже не знает, что элемент является пользовательским элементом управления.

Свойства, определенные в пользовательском элементе управления (или его родительском классе), поэтому не могут быть доступны. "Имя" - это свойство, которое определено в родительском (или суперпользователе) настраиваемого элемента управления.

Компилятор XAML может просто сказать: "Имя не определено как свойство"; если да, подумайте о том, сколько людей не сможет получить простой пользовательский контроль! Поэтому у компилятора XAML есть специальный случай, который дает более полезное сообщение об ошибке, "угадывая", что означает код. Его предположение в основном правильное.

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