Для чего служит x: thing в WPF?
Я видел это много, и я не знаю, что это значит. Я бы сказал, что это как-то связано с пространствами имен? Я уже гуглил это, но мне не было ясно, какова его цель.
Может ли кто-нибудь объяснить, что это такое и в каких ситуациях оно обычно используется?
Спасибо
редактировать:
<Window x:Class="WpfApplication8.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
</Grid>
</Window>
Но, например, в приведенном выше коде я определяю x
в качестве псевдонима для пространства имен XAML в третьей строке, хотя я использую тот же x
прямо в первой строке кода. Как это произошло? Это не волнует порядок, в котором вещи появляются?
edit2: поправьте меня, если я ошибаюсь:
Окно x:Class="WpfApplication8.MainWindow"
Приведенный выше код поместит класс, производный от Window, в пространство имен x:WpfApplication8.MainWindow, а
Окно x:Name="abc"
поместит в пространство имен x экземпляр класса Window с именем abc. Это правильно?
Если я прав, если бы я не использовал x
псевдоним, где будут помещены как класс (первый случай), так и экземпляр (второй) случай? Нигде, немного похоже на анонимные типы? Они используются, но место, где они находятся, не определено?
2 ответа
Вы правы, это псевдоним пространства имен XML. Если вы посмотрите на верхнюю часть вашего файла xaml, вы обнаружите, что он отображается на http://schemas.microsoft.com/winfx/2006/xaml
Пространство имен. Использование префикса позже позволяет парсеру xaml находить классы, определенные в этом пространстве имен, без необходимости вводить весь текст целиком. Это не похоже на using alias = very.long.namespace;
синтаксис в C#.
Обычно вам нужно установить разные псевдонимы для каждого пространства имен, которое вы собираетесь использовать в файле xaml. Распространенным при использовании PRISM является картирование cal
в clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation
; Вы можете получить доступ к RegionManager
класс, определенный в этом пространстве имен CLR с помощью cal:RegionManager
, При использовании Expression Blend вы часто обнаруживаете, что он добавляет xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
а также xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
чтобы позволить некоторые из его функциональных возможностей времени разработки (установка ширины и высоты для пользовательского элемента управления на артборде).
Ответ на редактирование вопроса: Возможно, вы захотите взглянуть на учебник по XML Namespace, из которого xaml наследует эту функциональность. В вашем примере вам нужно перестать думать о строках как об отдельных инструкциях, как это было бы в процедурном коде, и лучше рассматривать элемент в целом. Я пытаюсь сказать, что это потому, что xmlns:x
появляется в Window
элемент, он доступен этому элементу и каждому дочернему элементу, который он содержит, фактическая строка, в которой он появляется, не важна, поскольку xaml не выполняется сверху вниз, как процедурный код.
Ответ на вопрос edit 2: Атрибут x:Class сообщает компилятору, каким должно быть имя частичного класса, сгенерированного из файла xaml (если это то, что вы имели в виду, "поместит класс, производный от Window...", то ты прав).
Во второй части ничего не сказано, атрибут x:Name указывает компилятору сгенерировать поле в классе, содержащее ссылку на элемент, к которому прикреплен атрибут. Это означает, что в вашем примере ваш код за файлом сможет использовать this.abc
для ссылки на элемент Window, определенный в разметке xaml.
Это псевдоним определения пространства имен.
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Это действует как короткая рука или using
/import
заявление.
определив пространство имен в тегах атрибутов, аля x:Name
, вы гарантируете, что используете правильный атрибут в правильном пространстве.
Возможно, вы заметили, что вам нужно добавить собственный псевдоним пространства имен сборки, если вы хотите использовать пользовательский элемент управления WPF.