Архив

Архив за 2008

Дизайн Время выполнения функций в Silverlight Инструментарий

28 декабря 2008 4 комментариев

Введение

Это второй после моего Silverlight Дизайн серии Время возможности. Первый пост Дизайн время возможности в Silverlight Инструментарий показало время разработки особенностей Silverlight Инструментарий управления. Этот пост объясняет, как она реализуется. Надеюсь, этот пост может помочь объяснить нашим исходным кодом, показывая, как реализовать такие возможности, время разработки для Silverlight, и установления рамок и читателей исходный код можно использовать непосредственно в свои собственные проекты.

Обзор

Скачать "Silverlight Toolkit - двоичные файлы, образцы, документации, группа тестов и источники" декабря 2008 релиз , откройте SourceSilverlight.Controls.sln в Visual Studio, и мы увидим, что Есть 12 дизайн-проектов в папке решения дизайна, три для каждого элемента управления собраний.

Silverlight.Controls.sln в Visual Studio

Возьмите управления проектом, например, Есть три дизайн-проекты:

  • Controls.Design: строит Windows.Controls.Design.dll, в котором содержится время разработки функции разделяют обе Visual Studio и Expression Blend.
  • Controls.Expression.Design: строит Windows.Controls.Expression.Design.dll, в котором содержится время разработки возможности для Expression Blend только.
  • Controls.VisualStudio.Design: строит Windows.Controls.VisualStudio.Design.dll, в котором содержится время разработки возможности для Visual Studio только.

Существует также Design.Common папку, которая содержит два файла: Extensions.cs и MetadataBase.cs, которые являются общими для всех дизайн-проектов.

Настоятельно рекомендуется прочитать в блоге Джастин Ангел Silverlight Дизайн Время Расширяемость : она дает неплохое представление / обзор информации о Silverlight время проектирования расширения, на которых ниже осуществления основывается.

Проект

Все 12 дизайн-проектов по тому же принципу реализации, так что я просто использовать Control.Design проекта объяснить их всех.

Нагрузка Silverlight.Controls.sln в исходный каталог в Visual Studio в первый раз, то мы увидим экран, как показано ниже:

Silverlight.Controls.Design.csproj в Visual Studio

  • Controls.Design есть проект зависимости от проекта управления. Эта зависимость управления гарантирует, что проект построен первый и Controls.Design имеет ссылку на Microsoft.Windows.Controls сборка построена по проекту управления. Монтаж проектирование всегда ссылается на монтаж время выполнения обеспечивает проектирование возможности для.
  • Controls.Design ссылки Microsoft.Windows.Design Microsoft.Windows.Design.Extensibility и собраний, оба из которых находятся под каталог% DevEnvDir% PublicAssemblies (C: \ Program FilesMicrosoft Visual Studio 9.0Common7IDEPublicAssemblies на моем ноутбуке). Монтаж проектирование часто ссылки этих двух узлов, которые обеспечивают основу дизайнер расширяемость. Монтаж проектирование всегда справочниках системы сборка тоже, в котором содержится System.ComponentModel имен, где многие из атрибутов метаданных (например, CategoryAttribute, DescriptionAttribute) определены.
  • Controls.Design ссылки System.Windows собраний. Мы видим, что ссылка в Controls.Design.csproj тоже:

    <Reference Include="System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, processorArchitecture=MSIL">
    <SpecificVersion> False </> SpecificVersion
    <HintPath> .. BinariesSystem.Windows.dll </ HintPath>
    <Private> False </ Частным лицам>
    </> Справочники

    Пожалуйста, обратите внимание:

    • Control.Design является Windows проект библиотеки классов, а не Silverlight проекта, а также генерируемый Microsoft.Windows.Controls.Design.dll это. NET собраний запуска на рабочем столе внутри дизайнеры, как Visual Studio и Expression Blend, а не Silverlight монтаж выполняется внутри браузера, хотя Microsoft.Windows.Controls.Design.dll это собрание дизайна время для запуска Silverlight время сборки Microsoft.Windows.Controls.dll.
    • Ссылка собраний System.Windows фактически Silverlight в сборе (версия 2.0.5.0). System.Windows Собрание не может быть необходим всем дизайн-проектов для Silverlight контроля. Нам необходимо здесь в основном из-GetMemberName <T> (Выражение <Func <T, object>> выражение) метода Extension.cs, что мы будем обсуждать более позднее на этом посту. Смесь. NET и Silverlight ссылки создает все виды интересных вопросов, как мы увидим в ближайшее время.

      Ниже ILDASM скриншот показывает смешанные ссылки. NET и Silverlight сборок Microsoft.Windows.Controls.Design.dll:
      ILDASM Microsoft.Windows.Controls.Design.dll Microsoft.Windows.Controls.Design манифест сборки

      • . Версии 2:0:21024:1838 это номер версии Silverlight Toolkit 2008 Декабрь освобождения.
      • . Версии 3:5:0:0 это номер версии. NET Framework 3.5.
      • . Версии 2:0:0:0 это номер версии Silverlight 2.0.
    • При первой загрузке Controls.Design проект в Visual Studio, есть "ссылки компонента" System.Windows 'не может быть найден "предупреждение рядом с ссылкой System.Windows сборки в окне проекта, и в окне Список ошибок тоже. Это потому, что это Controls.Design. NET проекта, а не Silverlight, и мы не знаем, где Silverlight установлен (он находится под C: \ Program FilesMicrosoft Silverlight2.0.31005.0 на моем ноутбуке, а под C: \ Program Files (X86 ) Microsoft Silverlight2.0.31005.0 на моем рабочем столе). Решением было бы заранее создавать команду событие .. CopySystemWindows.bat, что копии System.Windows.dll от установки Silverlight направлении .. двойных. Поэтому, как только вы создали проект, предупреждение исчезнет, как мы увидим в ближайшее время.
  • В скриншоте выше Visual Studio, есть еще один предупреждающий знак рядом с Microsoft.Windows.Controls.XML файл в проекте вдова, когда вы загружаете Controls.Design проект в Visual Studio в первый раз. Этот файл создается путем создания проекта зависит управления, потому что в свойствах проекта управления -> Build вкладке опцию "XML файл документации" установлен, и путь "Бинар ..
    iesMicrosoft.Windows.Controls.XML ". Если вы строите Controls.Design проекта, предупреждение исчезнет, как мы увидим в ближайшее время.
  • Controls.Design проект файл Metadata.cs и ссылки на Extension.cs и MetadataBase.cs Design.Common в папку. Все 12 дизайн-проектов у этих трех файлов. Мы рассмотрим их более подробно.

Controls.Design сборки проекта или всего решения, мы видим:

Сборки выход Silverlight.Control.sln

  • Все объекты, построенные в общем с 0 0 ошибок и предупреждений.
  • Предупреждающие знаки рядом с ссылкой System.Windows и Microsoft.Windows.Controls.XML файл исчез.
  • Код анализ процесса создания и занимает много времени, и это порождает два предупреждения. Первые 1, CA0060, является еще одним вопросом, смешанной. NET и Silverlight ссылки и код в Extension.cs. Вы можете избавиться от предупреждения путем копирования и System.dll System.Core.dll из каталога установки Silverlight для SourceBinaries каталог и строительства еще раз.

MetadataBase.cs

MetadataBase.cs вместе с Metadata.cs, осуществлять основу для разработки регистрации метаданных время:

  • DescriptionAttributes автоматически создаются для общественных классов управления (например, подклассы FrameworkElement) и их государственной собственностью от своего "/ / / <summary>" XML комментарии документации в исходном коде. (Good комментируя платит! :-) )
  • Чтобы скрыть контроль класс от дизайнера, добавить строку ниже метод AddAttributes в Metadata.cs проекта файл:
    builder.AddCallback (ЪуреоЕ (TreeViewItem), б => b.AddCustomAttributes (новый ToolboxBrowsableAttribute (ложь)));
  • Чтобы зарегистрироваться другие пользовательские атрибуты для класса элемента управления, добавить XxxMetadata.cs файл в проект, как ViewboxMetadata.cs обсудим позже.

Если вы любите рамки, вы можете использовать MetadataBase.cs и Metadata.cs непосредственно в свой проект, при условии Microsoft Public License включена в начале все наши исходные файлы.

MetadataBase.cs:

  / / (C) Copyright Корпорация Microsoft.
 / / Этот источник может быть Microsoft Public License (Ms-PL).
 / / См. http://go.microsoft.com/fwlink/?LinkID=131993 для деталей.
 / / Все остальные права защищены.

 использования системы;
 использованием System.Collections.Generic;
 использованием System.ComponentModel;
 использованием System.Diagnostics;
 использованием System.Diagnostics.CodeAnalysis;
 использованием System.Globalization;
 использованием System.IO;
 использованием System.Linq;
 использованием System.Linq.Expressions;
 использованием System.Reflection;
 использованием System.Windows;
 использованием System.Xml.Linq;
 использованием Microsoft.Windows.Design.Metadata;

 имен Microsoft.Windows.Controls.Design.Common
 (
     / / / <summary>
     / / / MetadataRegistration класса.
     / / / </> Резюме
     общественного класса MetadataRegistrationBase
     (
         / / / <summary>
         / / / Время сборки метаданных дизайн таблице атрибутов.
         / / / </> Резюме
         / / / <returns> Пользовательского атрибута таблицы. </ Возвращает>
         защищенных виртуальных AttributeTable BuildAttributeTable ()
         (
             AttributeTableBuilder строителя нового AttributeTableBuilder = ();

             AddDescriptions (строитель);
             AddAttributes (строитель);
             AddTables (строитель);

             возвращение builder.CreateTable ();
         )

         / / / <summary>
         / / / Найти все AttributeTableBuilder подклассы в актовом
         / / / И добавить их атрибутов в таблице атрибутов сборки.
         / / / </> Резюме
         / / / <param Name="builder"> таблице атрибутов собраний строитель. </> Параметр
         , Justification = "Design time dll should not fail!" )] [SuppressMessage ("Microsoft.Design", "CA1031: DoNotCatchGeneralExceptionTypes", Обоснование = "Дизайн времени DLL не должна потерпеть неудачу!")]
         частных статических AddTables недействительным (AttributeTableBuilder строитель)
         (
             ); Debug.Assert (строителя! = NULL, "AddTables вызывается с нулевым параметра");

             Ассамблеи АНМ = Assembly.GetExecutingAssembly ();
             asm.GetTypes()) Еогеасп (типа Т в asm.GetTypes ())
             (
                 (AttributeTableBuilder))) если (t.IsSubclassOf (ЪуреоЕ (AttributeTableBuilder)))
                 (
                     пробовать
                     (
                         AttributeTableBuilder ATB = (AttributeTableBuilder) Activator.CreateInstance (т);
                         builder.AddTable (atb.CreateTable ());
                     )
                     поймать (Exception е)
                     (
                         .Format(CultureInfo.InvariantCulture, "Exception in AddTables method: {0}" , e)); Debug.Assert (ложь, строки. Format (CultureInfo.InvariantCulture, "Исключение в методе AddTables: (0)", е));
                     )
                 )
             )
         )

         / / / <summary>
         / / / Возвращает или задает имя с учетом регистра ресурс встроенный файл XML.
         / / / </> Резюме
         охраняемых XmlResourceName строку (, который демонстрирует;)

         / / / <summary>
         / / / Возвращает или задает собраний FullName квалифицированных имен типа 'сборки.
         / / / </> Резюме
         охраняемых AssemblyFullName строку (, который демонстрирует;)

         / / / <summary>
         / / / Создать описание атрибута время выполнения собраний XML-файл.
         / / / </> Резюме
         / / / <param Name="builder"> таблице атрибутов собраний строитель. </> Параметр
         , Justification = "Design time dll should not fail." )] [SuppressMessage ("Microsoft.Design", "CA1031: DoNotCatchGeneralExceptionTypes", Обоснование = "Дизайн времени DLL не выйдет из строя.")]
         частных AddDescriptions недействительным (AttributeTableBuilder строитель)
         (
             ); Debug.Assert (строителя! = NULL, "AddDescriptions вызывается с нулевым параметра");

             .IsNullOrEmpty(XmlResourceName) || если (строка. IsNullOrEmpty (XmlResourceName) | |
                 строку. IsNullOrEmpty (AssemblyFullName))
             (
                 возвращение;
             )

             XDocument xdoc = XDocument.Load (новый StreamReader (
                 Assembly.GetExecutingAssembly (). GetManifestResourceStream (XmlResourceName)));
             ) если (xdoc == NULL)
             (
                 возвращение;
             )

             xdoc.Descendants( "member" )) Еогеасп (XElement членом xdoc.Descendants ("член"))
             (
                 пробовать
                 (
                     )member.Attribute( "name" ); строка имя = (строка) member.Attribute ("имя");
                     , StringComparison.OrdinalIgnoreCase); Ьоо isType = name.StartsWith ("T:", StringComparison.OrdinalIgnoreCase);
                     если (isType | |
                         name.StartsWith ("P:", StringComparison.OrdinalIgnoreCase))
                     (
                         Int lastDot = name.length;
                         Строка TypeName;
                         если (isType)
                         (
                             TypeName = name.Substring (2);
                         )
                         еще
                         (
                             lastDot name.LastIndexOf = ('.');
                             TypeName name.Substring = (2, lastDot - 2);
                         )
                         TypeName + = AssemblyFullName;

                         Туре Ъ = Type.GetType (TypeName);
                         && t.IsPublic && t.IsClass && если (т! = NULL и и и и t.IsPublic t.IsClass и и
                             t.IsSubclassOf (ЪуреоЕ (FrameworkElement)))
                         (
                             ).FirstOrDefault().Value; строки по убыванию = member.Descendants ("Резюме"). FirstOrDefault (). ценности;
                             по убыванию = desc.Trim ();
                             , desc.Split( new char [] { ' ' , 't' , 'n' }, StringSplitOptions.RemoveEmptyEntries)); = Строка по убыванию. Подключиться "(" ", desc.Split (новый символ [] (',' т ',' п '), StringSplitOptions.RemoveEmptyEntries));

                             если (isType)
                             (
                                 builder.AddCallback (T, B => b.AddCustomAttributes (новый DescriptionAttribute (по убыванию)));
                             )
                             еще
                             (
                                 Строка PROPNAME = name.Substring (lastDot + 1);
                                 PropertyInfo р = t.GetProperty (PROPNAME);
                                 MethodInfo ми;
                                 && (mi = pi.GetSetMethod()) != null && mi.IsPublic) если (р! = NULL и и (т = pi.GetSetMethod ())! = NULL и и mi.IsPublic)
                                 (
                                     builder.AddCallback (T, B => b.AddCustomAttributes (PROPNAME новые DescriptionAttribute (по убыванию)));
                                 )
                             )
                         )
                     )
                 )
                 поймать (Exception е)
                 (
                     .Format(CultureInfo.InvariantCulture, "Exception in AddDescriptions method: {0}" , e)); Debug.Assert (ложь, строки. Format (CultureInfo.InvariantCulture, "Исключение в методе AddDescriptions: (0)", е));
                 )
             )
         )

         / / / <summary>
         / / / Обеспечение место, чтобы добавить пользовательские атрибуты, не создавая подкласс AttributeTableBuilder.
         / / / </> Резюме
         / / / <param Name="builder"> таблице атрибутов собраний строитель. </> Параметр
         защищенных виртуальных недействительными AddAttributes (AttributeTableBuilder строитель)
         (
         )
     )
 ) 

MetadataBase.cs реализует класс MetadataRegistrationBase. Давайте рассмотрим некоторые его основные методы:

AddDescriptions

Все бегут проектов собраний время имеют "XML файл документации" вариант выбран, и путь, как ".. BinariesMicrosoft.Windows.Controls.XML", в Project -> Properties -> вкладка сборки, выходной секции. Вы также можете найти настройку. Csproj файл, как показано ниже:

  > ..BinariesMicrosoft.Windows.Controls.Design.XML </ DocumentationFile > <DocumentationFile> .. BinariesMicrosoft.Windows.Controls.Design.XML </ DocumentationFile> 

Ниже приводится выдержка из Microsoft.Windows.Controls.XML чтобы показать, что порожденные документации XML файл выглядит следующим образом:

  version ="1.0" ? > <? XML-версия = "1.0"?>
 > <Документ>
     > <Монтаж>
         > Microsoft.Windows.Controls </ name > <Имя> Microsoft.Windows.Controls </> имя
     > </> Собраний
     > <Члены>
         name ="T:Microsoft.Windows.Controls.Viewbox" > <Имя пользователя = "T: Microsoft.Windows.Controls.Viewbox">
             > <Резюме>
             Определяет содержание декоратор, который может растягиваться и масштабах одного ребенка
             заполнить свободное пространство.
             > </> Резюме
             > Preview </ QualityBand > <QualityBand> Просмотр </ QualityBand>
         > </ Члена>
         name ="F:Microsoft.Windows.Controls.Viewbox.ChildElementName" > <Имя пользователя = "F: Microsoft.Windows.Controls.Viewbox.ChildElementName">
             > <Резюме>
             Имя ребенка элемент по умолчанию ViewBox шаблона.
             > </> Резюме
         > </ Члена>
         name ="M:Microsoft.Windows.Controls.Viewbox.IsValidStretchValue(System.Object)" > <Имя пользователя = "M: Microsoft.Windows.Controls.Viewbox.IsValidStretchValue (System.Object)">
             > <Резюме>
             Убедитесь в том, прошли в стоимости объекта является действительным перечисление Стретч значение.
             > </> Резюме
             name ="o" > The object typed value to be checked. </ param > <Параметр имя = "о"> ввели значение объекта для проверки. </ Параметр>
             > True if o is a valid Stretch enum value, false o/w. </ returns > <Возвращает> True если а является действительным перечисление Стретч значение, о ложных / W. </ возвращает>
         > </ Члена>
         name ="P:Microsoft.Windows.Controls.Viewbox.Child" > <Имя пользователя = "P: Microsoft.Windows.Controls.Viewbox.Child">
             > <Резюме>
             Получает или задает один элемент ребенка ViewBox.
             > </> Резюме
         > </ Члена>
     > </ Члены>
 > </ DOC> 

Имя атрибута каждого элемента <member> по образцу:

  • "T: Microsoft.Windows.Controls.Viewbox": "T:" указывает на это тип, а затем полное имя типа в;
  • "F: Microsoft.Windows.Controls.Viewbox.ChildElementName": "F:" указывает на это поле, за которым следует полное имя поля;
  • "M: Microsoft.Windows.Controls.Viewbox.IsValidStretchValue (System.Object)": "М:" указывает на это метод, а затем полное имя метода и параметры;
  • "P: Microsoft.Windows.Controls.Viewbox.Child": "С:" указывает на это имущество, а затем полное наименование имущества;

Control.Design проекта ссылки на файл Microsoft.Windows.Controls.XML как внедренный ресурс:

  • Microsoft.Windows.Controls.XML как внедренный ресурс
  • Controls.Design.csproj:

      Include ="..BinariesMicrosoft.Windows.Controls.XML" /> <EmbeddedResource Включить = ".. BinariesMicrosoft.Windows.Controls.XML" /> 

AddDescriptions метод обрабатывает встроенный XML файл и генерирует DescriptionAttribute для общественных классов управления и их общественные свойства:

  MetadataBase.cs: 134: builder.AddCallback (T, B => b.AddCustomAttributes (новый DescriptionAttribute (по убыванию)));
 MetadataBase.cs: 143: builder.AddCallback (T, B => b.AddCustomAttributes (PROPNAME новые DescriptionAttribute (по убыванию))); 
AddAttributes

AddAttributes обычно переопределены в Metadata.cs файл добавить ToolboxBrowsableAttribute (ложь), атрибуты для управления классов, которые не должны отображаться в панели инструментов дизайнера:

  • Если контрольная класса должны быть скрыты от всех дизайнеров, добавить ToolboxBrowsableAttribute (ложь) специальный атрибут проекта Xxx.Design;
  • если он должен быть скрыты от Visual Studio только добавить пользовательский атрибут проекта Xxx.VisualStudio.Design;
  • если он должен быть скрыты от Expression Blend только добавить пользовательский атрибут проекта Xxx.Expression.Design;

Ниже AddAttributes реализации в Metadata.cs проекта Controls.VisualStudio.Design:

  / / / <summary>
 / / / Обеспечение место, чтобы добавить пользовательские атрибуты, не создавая подкласс AttributeTableBuilder.
 / / / </> Резюме
 / / / <param Name="builder"> таблице атрибутов собраний строитель. </> Параметр
 охраняемых переопределить недействительными AddAttributes (AttributeTableBuilder строитель)
 (
     ToolboxBrowsableAttribute( false ))); builder.AddCallback (ЪуреоЕ (TreeViewItem), б => b.AddCustomAttributes (новый ToolboxBrowsableAttribute (ложь)));
 ) 
AddTables

Для добавления других атрибутов, чем ToolboxBrowsableAttribute (ложь) для типа, добавить XxxMetadata.cs файл как ViewboxMetadata.cs ниже соответствующего проекта:

ViewboxMetadata.cs:

  / / (C) Copyright Корпорация Microsoft.
 / / Этот источник может быть Microsoft Public License (Ms-PL).
 / / См. http://go.microsoft.com/fwlink/?LinkID=131993 для деталей.
 / / Все остальные права защищены.

 использованием System.ComponentModel;
 использованием Microsoft.Windows.Controls.Design.Common;
 использованием Microsoft.Windows.Design.Metadata;

 имен Microsoft.Windows.Controls.Design
 (
     / / / <summary>
     / / / Чтобы зарегистрироваться время метаданных дизайн ViewBox.
     / / / </> Резюме
     внутренний класс ViewboxMetadata: AttributeTableBuilder
     (
         / / / <summary>
         / / / Чтобы зарегистрироваться время метаданных дизайн ViewBox.
         / / / </> Резюме
         общественного ViewboxMetadata ()
             : Базовый ()
         (
             AddCallback (
                 ЪуреоЕ (ViewBox),
                 б =>
                 (
                     )); b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (х => x.BorderThickness), новые BrowsableAttribute (ложь));
                     )); b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (х => x.BorderBrush), новые BrowsableAttribute (ложь));
                     )); b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (х => x.Background), новые BrowsableAttribute (ложь));
                     )); b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (х => x.Foreground), новые BrowsableAttribute (ложь));

                     b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (х => x.Child), новые CategoryAttribute (Properties.Resources.CommonProperties));
                     b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (х => x.Stretch), новые CategoryAttribute (Properties.Resources.CommonProperties));
                     b.AddCustomAttributes (Extensions.GetMemberName <Viewbox> (х => x.StretchDirection), новые CategoryAttribute (Properties.Resources.CommonProperties));
                 ));
         )
     )
 ) 
  • Рекомендуется следить за именования здесь. Возьмите ViewBox например, имя файла ViewboxMetadata.cs, и имя класса ViewboxMetadata.
  • Метаданных класс должен наследовать от AttributeTableBuilder.
  • Вы можете добавлять пользовательские атрибуты в конструкторе класса метаданных:
    • Вы можете использовать или перезвонить модели (как в ViewboxMetada.cs выше), либо прямой модели. Обратного модели, предположительно, более эффективным.
      • прямой пример модели:

        AddCustomAttributes (

        ЪуреоЕ (ViewBox), / / тип

        "BorderThickness", / / имя свойства

        новый атрибут [] (нового BrowsableAttribute (ложь))); / / массив пользовательских атрибутов

    • Чтобы обеспечить параметричности имя AddCustomAttribute вызова, вы можете использовать метод Extensions.GetMemberName (), как в ViewboxMetadata.cs (обсудит это позже в должности), чтобы получить имя свойства в типе безопасным способом, и обеспечить Имя свойства непосредственно в строку, как "BorderThickness" в выше прямой реализации модели.

AddTables (AttributeTableBuilder строитель) метод:

  • перечисляет все подклассы AttributeTableBuilder в выполнении собраний
  • создает экземпляр каждого найденного подкласс AttributeTableBuilder:

    AttributeTableBuilder ATB = (AttributeTableBuilder) Activator.CreateInstance (т);

  • добавить атрибут таблицы нашли класса оборудования:

    builder.AddTable (atb.CreateTable ());

Metadata.cs

Metadata.cs реализует MetadataRegistration класс, который наследует от класса MetadataRegistrationBase осуществляется в MetadataBase.cs. Она осуществляет также IRegisterMetadata интерфейс.

Metadata.cs:

  / / (C) Copyright Корпорация Microsoft.
 / / Этот источник может быть Microsoft Public License (Ms-PL).
 / / См. http://go.microsoft.com/fwlink/?LinkID=131993 для деталей.
 / / Все остальные права защищены.

 использованием System.Reflection;
 использованием Microsoft.Windows.Controls.Design.Common;
 использованием Microsoft.Windows.Design.Metadata;

 имен Microsoft.Windows.Controls.Design
 (
     / / / <summary>
     / / / MetadataRegistration класса.
     / / / </> Резюме
     общественного класса MetadataRegistration: MetadataRegistrationBase, IRegisterMetadata
     (
         / / / <summary>
         / / / Дизайн время регистрации метаданных класса.
         / / / </> Резюме
         общественного MetadataRegistration ()
             : Базовый ()
         (
             AssemblyName asmName = ЪуреоЕ (ViewBox). Assembly.GetName ();
             XmlResourceName = asmName.Name + ". Дизайн."  + AsmName.Name + ". XML" / / "Microsoft.Windows.Controls.Design.Microsoft.Windows.Controls.XML"
             AssemblyFullName = "," + asmName.FullName;
         )

         / / / <summary>
         / / / Заимствовано из System.Windows.Controls.Toolbox.Design.MetadataRegistration:
         / / / Использование статических флага обеспечить метаданных зарегистрирован только один.
         / / / </> Резюме
         частных статических Ьоо _initialized;

         / / / <summary>
         / / / Вызывается инструменты для регистрации времени метаданных дизайна.
         / / / </> Резюме
         Регистрация общественных недействительными ()
         (
             если (! _initialized)
             (
                 MetadataStore.AddAttributeTable (BuildAttributeTable ());
                 _initialized = True;
             )
         )

         / / / <summary>
         / / / Обеспечение место, чтобы добавить пользовательские атрибуты, не создавая подкласс AttributeTableBuilder.
         / / / </> Резюме
         / / / <param Name="builder"> таблице атрибутов собраний строитель. </> Параметр
         охраняемых переопределить недействительными AddAttributes (AttributeTableBuilder строитель)
         (
         )
     )
 ) 

Давайте рассмотрим некоторые из его основных методов:

MetadataRegistration

Этот конструктор инициализирует два ключевых областях:

  • XmlResourceName: название ресурса вложенной документации XML файл, используемый метод MetadataRegistrationBase.AddDescriptions.
  • AssemblyFullName: полное название пробега время монтажа это собрание время разработки для.

Вам необходимо заменить тип ViewBox с собственным классом, если вы используете Metadata.cs в вашем родном проекта.

Регистр

Это единственный способ IRegisterMetadata интерфейс. Он добавляет пользовательский атрибут таблицы, построенные из AddDescripions, AddAttributes AddTables и методы, описанные выше, метаданные магазин дизайнера:

MetadataStore.AddAttributeTable (BuildAttributeTable ());

Extensions.cs

Этот файл содержит реализации метод расширения GetMemberName <T> (Выражение <Func <T, object>> выражение), который используется для получения имени одного из членов типа компиляции проверять время и IntelliSense:

GetMemberName метод расширения

Идея первоначально был предложен Джафар Хусейн (см. своем блоге символы в C # 3.0 ), а затем улучшить, Джастин Ангел . Это большая хитрость, чтобы избежать опечаток, однако недостатком является то, что тянет в Silverlight ссылки и агрегатов в противном случае чистой. NET сборки. Вот полный источник:

Extensions.cs:

  / / (C) Copyright Корпорация Microsoft.
 / / Этот источник может быть Microsoft Public License (Ms-PL).
 / / См. http://go.microsoft.com/fwlink/?LinkID=131993 для деталей.
 / / Все остальные права защищены.

 использования системы;
 использованием System.Linq.Expressions;

 имен Microsoft.Windows.Controls.Design.Common
 (
     / / / <summary>
     / / / Это множество внутренних методов расширения обеспечивают общие решения и
     / / / Коммунальные услуги в достаточно небольшим числом не требуют специального расширения
     / / / Методы класса.
     / / / </> Резюме
     внутренний класс расширений статических
     (
         / / / <summary>
         / / / Помощник метод, чтобы получить имя пользователя при компиляции, чтобы избежать проверки опечатка.
         / / / </> Резюме
         / / / <typeparam Name="T"> содержащих класс члена, фамилия которого получен. </ Typeparam>
         / / / <param Name="expr"> лямбда-выражение, как правило, в виде O => o.member. </> Параметр
         / / / <returns> Имя свойства. </ Возвращает>
         >> expr) общественного статическую строку GetMemberName <T> (Выражение <Func <T, объекты>> выражение)
         (
             Выражение тела = ((LambdaExpression) выражение). Органа;
             MemberExpression memberExpression = тело MemberExpression;
             ) если (memberExpression == NULL)
             (
                 memberExpression = (MemberExpression) ((UnaryExpression) органа). Операнд;
             )
             возвращение memberExpression.Member.Name;
         )
     )
 ) 

Заключение

Этот пост порядок осуществления функций времени проектирования в декабре 2008 освобождении из Silverlight Инструментарий , и представил простой рамки для осуществления времени особенность дизайна для Silverlight контроля. Вы можете модель реализации и повторного использования в рамках собственных проектов. Рамках все еще очень примитивной, поддерживающих метаданные регистрации только, так что все Blend поддерживает на данный момент. Я буду смотреть на усовершенствование структуры и функции проектирования для Silverlight Toolkit, как добавить пользовательский встроенный / распространила / диалоговом редакторы, данные проектирования, дизайна времени только поведение т.д.

Как я уже говорил в предыдущем посте Дизайн время возможности в Silverlight Инструментарий , дизайн времени опыт в области контроля очень важны. Это не только повышает производительность и опыт разработчиков, которые используют эти элементы управления с удостоил функции времени, но и улучшает опыт конечных пользователей, поскольку все больше и больше приложений предоставить пользователям большую гибкость в настройке пользовательского интерфейса, такие как изменение раскладки с помощью перетаскивания контроля или изменить настройки управления, так же, как в конструкторе, если бы не это во время выполнения.

Делите и наслаждайтесь:

  • Print
  • email
  • RSS
  • Twitter
  • TwitThis
  • del.icio.us
  • LinkedIn
  • Technorati
  • Facebook
  • Google Bookmarks
  • Live
  • MySpace
  • QQ书签