Перейти к содержимому

Schemas microsoft com что это

  • автор:

Понимание XAML

Для кого эта статья: для людей, которые только начинают своё знакомство с технологиями использующими XAML. Чтобы не усложнять статью, я не касаюсь многих деталей вроде Markup Extensions, управления ресурсами и т.п. Прочитав данную статью, я надеюсь, вы сможете понять что происходит под капотом XAML парсера и более чётко представлять как из вашего текстового документа получается граф объектов в памяти, с различными свойствами.

XAML — это язык разметки, который появился вместе с первой версией WPF от Microsoft. Сейчас он также используется в Silverlight и Windows Phone 7 (сути тот же Silverlight). Таким образом, сейчас довольно много людей активно используют XAML. Однако для эффективной работы полезно будет понять концепции, которые стоят за я языком, чтобы отдельные конструкции не казались странными.

В первую очередь стоит провести маленькое лирическое отступление. Существует два основных вида языков программирования: императивные и декларативные.

Императивные языки — это всем известные языки программирования, вроде C, C++, C#, Pascal, Basic и множество других. Основная идея в том, что в императивном языке мы говорим, что нужно сделать. Но не говорим, что должно получиться (обычно это мы должны описать и проверить в unit-тестах).

Декларативные языки, в обратную сторону, позволяют нам описать состояние, которого мы хотим добиться, но не требуют (и обычно не дают) описать как прийти в это состояние. Примеры таких языков: XAML (да и вообще все основанные на иерархической разметке XML, HTML и т.п.), также SQL.

Итак в чём разница?

Допустим я хочу создать TextBox и задать ему в текст «Habr», на C# это будет выглядеть так:

На XAML это будет выглядеть так:

Разница очевидна. В первом случае, я сказал:
1. Создать экземпляр класса TextBox и присвоить его переменной tb.
2. Присвоить свойству переменной tb.Text значение «Habr».

Во втором, я сказал, что хочу получить в итоге TextBox со значением «Habr» в тексте. А уже как это будет сделано меня не волнует, этим занимается XAML парсер. Такое длинное отступление важно, чтобы понять как работает парсер.

Итак, теперь более подробный пример, с объяснением работы парсера:

  • CustomPrefix — любой идентификатор легальный в XML, который вы будете использовать для обращения к своим объектам.
  • clr-namespace: — специальный префикс, который обозначает, что дальше пойдёт пространство имён .Net
  • WpfApplication1 — собственно ваше пространство имён.

После того как вы объявите ваше собственное пространство имён, вы можете создавать элементы из него:

Итак наш XAML заставляет парсер создать экземпляр класса WpfApplication1.UserControl1, потом парсер видит, что мы хотим, чтобы в свойстве Content нашего контрола находился TextBox, парсер и это сделает и так далее.

  1. Атрибуты:
  2. Тэги:
  3. Есть ещё вариант 2.1. Когда для наиболее часто используемого свойства можно задать содержимое просто указав его внутри объекта: Эта запись эквивалента пункту 2, потому что объект TextBox отмечен атрибутом

Свойство TextBox.Background имеет тип Brush — это абстрактный класс, у которого есть несколько конкретных реализаций, например SolidColorBrush, LinerGradientBrush и другие. Так как же наша строка «Red» превращается в подкласс Brush? За это отвечает конвертер. Чтобы указать какой конвертер применить для определённого типа на тип устанавливается TypeConverterAttribute. Для многих встроенных типов уже есть конвертеры, в том числе как в нашем примере, есть конвертер из строки в Brush, который создаёт экземляр SolidColorBrush и задаёт ему цвет указанный в строке.
Что делать, если вы хотите установить значение свойству не поддерживаемому стандартным конвертером или просто провести какую-то операцию над значением перед установкой? — Использовать собственный конвертер. Для этого достаточно реализовать интерфейс IValueConverter, в нём записать все необходимые манипуляции, а потом использовать конвертер в XAML следующим образом:

Конечно данный пример выглядит несколько странно, но чаще всего данные берутся из объектов бизнес-логики, тогда всё встанет на свои места.
И конечно, чтобы пример сработал, перед использованием конвертер нужно добавить в ресурсы, например так:

Чтобы не захламлять статью, я не буду тут подробнее рассказывать о ресурсах, лучше почитать другие статьи или примеры.

2. Второй вариант как можно задать свойству значение в виде сложного объекта: использовать объектный синтаксис:

Тут всё уже должно быть ясно. Создаём отдельный тэг для свойства объекта TextBox, а в нём создаём экземпляр SolidColorBrush или любого другого подтипа Brush с нужными нам параметрами.

На этом введение в концепцию XAML стоит закончить, надеюсь после прочтение этой статьи, некоторые конструкции языка станут понятнее, а главное будет легче создавать собственную разметку.

UPD Обновил часть про конвертеры благодаря комментариям afsherman.

Основы XAML

Стандарт XAML достаточно очевиден, если понять несколько его основополагающих правил:

Каждый элемент в документе XAML отображается на экземпляр класса .NET. Имя элемента в точности соответствует имени класса. Например, элемент <Button> сообщает WPF, что должен быть создан объект Button.

Как и любой XML-документ, код XAML допускает вложение одного элемента внутрь другого. Как будет показано, XAML предоставляет каждому классу гибкость в принятии решения относительно того, как справиться с такой ситуацией. Однако вложение обычно является способом выразить включение (containment). Другими словами, если вы видите элемент Button внутри элемента Grid, то пользовательский интерфейс, возможно, включает Grid, содержащий внутри себя Button.

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

Определение MainWindow в XAML

Хотя инструменты могут генерировать приемлемый код XAML, все же важно понимать основы синтаксиса XAML и то, как разметка в конечном итоге трансформируется в корректную сборку .NET. Взгляните на следующий простейший документ XAML, представляющий новое пустое окно (как оно создано в Visual Studio):

Прежде всего, обратите внимание, что корневой элемент <Window> использует атрибут Class для указания имени класса, который будет сгенерирован при обработке этого файла XAML. Кроме того, атрибут Class снабжен префиксом х:. Заглянув в открывающий элемент <Window>, вы увидите, что этому префиксу дескриптора XML присваивается строка «http://schemas.microsoft.com/winfx/2006/xaml» для построения объявления пространства имен XML. Имейте в виду, что всякий раз, когда хотите сослаться на элемент, определенный в пространстве имен XAML http://schemas.microsoft.com/winfx/2006/xaml, вы должны указывать префикс — лексему х:.

В контексте открывающего дескриптора <Window> заданы значения для атрибутов Title, Height и Width, которые напрямую отображаются на одноименные свойства, поддерживаемые типом System.Windows.Window из сборки PresentationFramework.dll.

Пространства имен XAML

Ясно, что не достаточно просто указать имя класса. Анализатору XAML также нужно знать пространство имен .NET, где находится этот класс. Например, класс Window может существовать в нескольких пространствах имен — он может ссылаться на класс System.Windows.Window, на класс в компоненте от независимого разработчика или же на класс, определенный в вашем приложении. Чтобы определить, какой именно класс нужен на самом деле, анализатор XAML проверяет пространство имен XML, к которому относится элемент.

Вот как это работает. В примере документа, показанном ранее, определено два пространства имен:

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

xmlns — это специализированный атрибут в мире XML, который зарезервирован для объявления пространств имен. В показанном выше фрагменте кода разметки объявлены два пространства имен, которые будут присутствовать в каждом создаваемом документе WPF XAML.

Основное пространство имен WPF. Оно охватывает все классы WPF, включая элементы управления, которые применяются для построения пользовательских интерфейсов (System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Ink, System.Windows.Media, System.Windows.Navigation). В рассматриваемом примере это пространство имен объявлено без префикса пространства имен, поэтому становится пространством имен по умолчанию для всего документа. Другими словами, каждый элемент автоматически помещается в это пространство имен, если только не указано иное.

http://schemas.microsoft.com/winfx/2006/xaml

Пространство имен XAML. Оно включает различные служебные свойства XAML, которые позволяют влиять на то, как интерпретируется документ. Данное пространство имен отображается на префикс х. Это значит, что его можно применять, помещая префикс пространства имен перед именем элемента (как в <х:ИмяЭлемента>).

Как видите, пространство имен XML не соответствует какому-либо конкретному пространству имен .NET. Существует несколько причин, по которым создатели XML выбрали такое проектное решение. По существующему соглашению пространства имен XML часто имеют форму URI (как и в данном примере). Эти URI выглядят так, будто указывают на некоторое место в Интернете, хотя на самом деле это не так. Формат URI используется потому, что он делает маловероятным ситуацию, когда разные организации непреднамеренно создадут разные языки на базе XML с одинаковым пространством имен. Поскольку домен schemas.microsoft.com принадлежит Microsoft, только Microsoft использует его в названии пространства имен XML.

Другая причина отсутствия отображения «один к одному» между пространствами имен XML, используемыми в XAML, и пространствами имен .NET заключается в том, что это могло бы значительно усложнить документы XAML. Проблема в том, что WPF содержит свыше десятка пространств имен (все начинаются с System.Windows). Если бы каждое пространство имен .NET отображалось на отдельное пространство имен XML, пришлось бы указывать корректное пространство имен для каждого используемого элемента управления, что быстро привело бы к путанице. Вместо этого создатели WPF предпочли скомбинировать все эти пространства имен .NET в единое пространство имен XML. Это работает, потому что внутри разных пространств имен .NET, образующих часть WPF, нет классов с одинаковыми именами.

Информация пространства имен позволяет анализатору XAML находить правильный класс. Например, когда он просматривает элементы Window и Grid, то видит, что они помещены в пространство имен WPF по умолчанию. Затем он ищет соответствующие пространства имен .NET— до тех пор, пока не находит System.Windows.Window и System.Windows.Controls.Grid.

Дополнительные дескрипторы XAML

В дополнение к этим двум необходимым объявлениям пространств имен XML можно, а иногда и необходимо, определить дополнительные префиксы дескрипторов в открывающем элементе XAML-документа. Обычно это делается, когда нужно описать в XAML класс .NET, определенный во внешней сборке. Например, предположим, что вы построили несколько специальных элементов управления WPF и упаковали их в библиотеку под названием MyControls.dll.

Теперь, если необходимо создать новый экземпляр Window, который использует эти элементы, можно установить специальное пространство имен XML, отображаемое на библиотеку MyControls.dll, с использованием лексем clr-namespace и assembly.

Ниже приведен пример разметки, создающей префикс дескриптора, который может применяться для доступа к членам этой библиотеки:

Лексеме clr-namespace присваивается название пространства имен .NET в сборке, в то время как лексема assembly устанавливается в дружественное имя внешней сборки *.dll. Такой синтаксис можно использовать для любой внешней библиотеки .NET, которой необходимо манипулировать внутри разметки.

What is meaning of "xmlns:v=urn:schemas-microsoft-com" in HTML5

If I develop a html page using «microsoft» schema, all elements used in body section will be referernced by «microsoft» Or, If I use other schema, examply «google» (I don’t know whether this really exist) all element goes same too.

Here is my question First, If I use table tag that exist in «microsoft» and «google» schema together Will chrome browser interpret context differently? so comes differnt view?

Second, If xmlns is omitted what kind of schema will be used default?

trytop's user avatar

2 Answers 2

The xmlns:* attributes are namespace definitions. Elements and attributes with the prefix/alias «v» or «o» are part of the respective namespace and not part of HTML. If parsed as HTML < 5 the namespaces will be ignored. In HTML 5 here some constructs for specific namespaces (SVG, MathML), but namespace definitions (the xmlns:* attributes) are ignored.

If parsed as XML the attributes define the namespaces. You have to definitions:

  • Alias v for urn:schemas-microsoft-com:vml — the Vector Markup Language
  • Alias o for urn:schemas-microsoft-com:office:office — MS Office Open XML common attributes

XML namespaces allow to mix different XML formats and avoiding conflicts because of element names.

You file might be generated by MS Office (2003) or a user copied content from Office into it. If here are no elements/attributes starting with v: or o: in your document they don’t do anything.

If the client knows a namespace/format it can interpret the elements. Not only a browser but RSS Readers, Calendars, . If a client does not know a namespace but respects it, it at least knows to ignore the elements/attributes even if they have a name that might be valid in HTML.

Schemas microsoft com что это

XAML (eXtensible Application Markup Language) — язык разметки, используемый для инициализации объектов в технологиях на платформе .NET. Применительно к WPF (а также к Silverlight) данный язык используется прежде всего для создания пользовательского интерфейса декларативным путем. Хотя функциональность XAML только графическими интерфейсами не ограничивается: данный язык также используется в технологиях WCF и WF, где он никак не связан с графическим интерфейсом. То есть его область шире. Применительно к WPF мы будем говорить о нем чаще всего именно как о языке разметки, который позволяет создавать декларативным путем интерфейс, наподобие HTML в веб-программировании. Однако опять же повторюсь, сводить XAML к одному интерфейсу было бы неправильно, и далее на примерах мы это увидим.

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

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

Компактность, понятность, код на XAML относительно легко поддерживать.

При компиляции приложения в Visual Studio код в xaml-файлах также компилируется в бинарное представление кода xaml, которое называется BAML (Binary Application Markup Language). И затем код baml встраивается в финальную сборку приложения — exe или dll-файл.

Структура и пространства имен XAML

При создании нового проекта WPF он уже содержит файлы с кодом xaml. Так, создаваемый по умолчанию в проекте файл MainWindow.xaml будет иметь следующую разметку:

Если вы совершенно не знакомы с xaml и с xml, то даже этот небольшой минимальный код окна может вызывать затруднения.

Подобно структуре веб-страничке на html, здесь есть некоторая иерархия элементов. Элементов верхнего уровня является Window , который представляет собой окно приложения. При создании других окон в приложении нам придется всегда начинать объявление интерфейса с элемента Window, поскольку это элемент самого верхнего уровня.

Кроме Window существует еще два элемента верхнего уровня:

Элемент Window имеет вложенный пустой элемент Grid , а также подобно html-элементам ряд атрибутов (Title, Width, Height) — они задают заголовок, ширину и высоту окна соответственно.

Пространства имен XAML

При создании кода на языке C#, чтобы нам были доступны определенные классы, мы подключаем пространства имен с помощью директивы using , например, using System.Windows; .

Чтобы задействовать элементы в XAML, мы также подключаем пространства имен. Вторая и третья строчки как раз и представляют собой пространства имен, подключаемые в проект по умолчанию. А атрибут xmlns представляет специальный атрибут для определения пространства имен в XML.

Так, пространство имен http://schemas.microsoft.com/winfx/2006/xaml/presentation содержит описание и определение большинства элементов управления. Так как является пространством имен по умолчанию, то объявляется без всяких префиксов.

http://schemas.microsoft.com/winfx/2006/xaml — это пространство имен, которое определяет некоторые свойства XAML, например свойство Name или Key. Используемый префикс x в определении xmlns:x означает, что те свойства элементов, которые заключены в этом пространстве имен, будут использоваться с префиксом x — x:Name или x:Key . Это же пространство имен используется уже в первой строчке x:Class=»XamlApp.MainWindow» — здесь создается новый класс MainWindow и соответствующий ему файл кода, куда будет прописываться логика для данного окна приложения.

Это два основных пространства имен. Рассмотрим остальные:

xmlns:d=»http://schemas.microsoft.com/expression/blend/2008″ : предоставляет поддержку атрибутов в режиме дизайнера. Это пространство имен преимущественно предназначено для другого инструмента по созданию дизайна на XAML — Microsoft Expression Blend

xmlns:mc=»http://schemas.openxmlformats.org/markup-compatibility/2006″ : обеспечивает режим совместимости разметок XAML. В определении объекта Window двумя строчками ниже можно найти его применение:

Это выражение позволяет игнорировать парсерам XAML во время выполнения приложения дизайнерские атрибуты из пространства имен с префиксом d , то есть из «http://schemas.microsoft.com/expression/blend/2008»

xmlns:local=»clr-namespace:XamlApp» : пространство имен текущего проекта. Так как в моем случае проект называется XamlApp, то простраство имен называется аналогично. И через префикс local я смогу получить в XAML различные объекты, которые я определил в проекте.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *