Архив

Записи с меткой «DefaultInitializer"

Редактирование модели и по умолчанию Initializer для управления Silverlight

11 мая 2009 4 комментария

Введение

Это является частью серии на время разработки особенность реализации в Silverlight Toolkit . Это сообщение используется инициализатор диаграммы по умолчанию, чтобы проиллюстрировать, как реализовать умолчанию инициализатор для элементов управления Silverlight, и объяснить, базовая архитектура модели редактирования.

Опыт

Если вы устанавливаете Silverlight 3 Toolkit в марте 2009 выпуска , можно перетащить управления диаграммы из библиотеки смесь активами и перетащите его на поверхность конструктора, и у вас график красиво инициализируется и оказал:

Chart default initializer

Вы можете прочитать больше об этом в предыдущих сообщение Silverlight Toolkit Особенности время разработки: март 2009 года выпуска обновлений .

Архитектура

DefaultInitializer

Это на самом деле довольно просто обеспечить умолчанию инициализатор для управления Silverlight:

  • реализации подкласс DefaultInitializer , и переопределить его InitializeDefaults функции
  • ассоциированного класса по умолчанию инициализатор с контролем класса через FeatureAttribute

Ниже скриншот показывает реализацию DefaultInitializer абстрактный базовый класс, а другие классы в Microsoft.Windows.Design.Model имен, которые будут обсуждаться коротко:

DefaultInitializer

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

Редактирование модели

Как только результат XAML определяется, я хочу есть более высокий уровень абстракции / метод, который бы просто взять XAML. Но, к сожалению, мы должны использовать гораздо более низком уровне (таким образом, более гибкий и мощный) необходимо API называется редактирования модели, которая состоит из классов, как ModelItem , ModelProperty , ModelEvent , ModelFactory и ModelService . Страница MSDN Редактирование Архитектура модели дает краткий обзор:

Ваше время разработки реализация взаимодействует с во время контроля, хотя программный интерфейс, называемый редактирования модели. Объекты, предназначенные называются редактируемые объекты.

Ваша управления определены в Extensible Application Markup Language (XAML). Вы обновления XAML для элементов управления программным способом с помощью модели редактирования.

Модель оболочки, и просмотр

Редактирование модель состоит из трех функциональных подразделений: модели, общественных оболочку, которая тезисы модели, и мнение, что представляет пользовательский интерфейс (UI) модели. Модели и зрения отдельных, но обертка и модели тесно связаны. На следующем рисунке показана связь между тремя подразделениями.

Модель, ModelItem и Просмотр отношения

Среда разработки использует ModelItem типа для связи с базовой моделью. Все изменения, внесенные в ModelItem обертки, которые влияют на базовую модель. Это позволяет модели быть простой. ModelItem обертки обрабатывать сложные функции дизайнера, такие как поддержка транзакций, отменить отслеживания и уведомления об изменениях.

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

Editing Model Class Diagram

Используйте ниже XAML в качестве примера:

  • ModelItem: предположим, переменная элемента ModelItem для управления Кнопка выше,
    • Название сохраняется как х: Имя атрибута XAML: item.Name = "Кнопка" сохраняется в XAML как х: Name = "Button".
    • ItemType является тип объекта базового элемента управления, и решает, теги, используемые в XAML: item.PropertyType == tyepof (Button), а тег XAML <Button />.
    • Свойства коллекцию свойств, завернутый в ModelProperty типа, из базового элемента управления. Например: элемент ["ClickMode"] = ClickMode.Release будет сохранен в XAML, как ClickMode = "Release".
    • Содержимое представляет Содержание имущества, определяемой в ContentControl (и унаследовал его подклассы): item.Content является ModelItem представляющая прямоугольник объекта.
    • Источник: когда ModelItem представляет элемент, который собственность другого элемента, Источник ModelProperty обертка этого имущества. Например, item.Content.Value.Source == item.Content / / Rectangle.
    • События представляет коллекцию событий базового элемента управления, завернутый в ModelEvent типа. Из моего опыта отладки, он всегда пустой, так что кажется События собственности еще не поддерживается Blend3 для Silverlight3 еще.
    • Родитель родителю логику базового элемента управления, завернутый в тип ModelItem. Например: item.Parent является ModelItem для Grid.
    • Корень ModelItem оболочка для визуального корень, например: item.Root представляет UserControl.
  • ModelProperty: предположим, переменная является опорой для ModelProperty Button.Content, то есть опора = item.Content,
    • Имя является именем свойства базового элемента управления. Она сохраняется в XAML, как имя атрибута. Например: prop.Name == "Содержание".
    • PropertyType является тип объекта имущества базового элемента управления этим объектом ModelProperty представляет. Например: prop.PropertyType = TypeOf (объекта).
    • AttachedOwnerType является тип объекта управления, который сначала определяет свойства этого объекта ModelProperty представляет. Например: prop.AttachedOwnerType == TypeOf (ContentControl) / / обратите внимание: не кнопки.
    • Значение стоимости имущества из базового элемента управления, завернутый в тип ModelItem. Например: prop.Value является ModelItem представляющий прямоугольник объекта.
    • Родитель контроля, завернутые в тип ModelItem, из которых имущество принадлежит. Например: prop.Parent == элемент.
  • ModelEvent: как упоминалось выше, item.Events всегда пустой, так что это не кажется, что ModelEvent поддерживается в Blend3 для Silverlight3 еще. Но полагаю, он работает, и переменной ЭВТ является ModelEvent для Button.Click, т.е. EVT = item.Events ["Click"],
    • Имя это имя события. Например: evt.Name == "Click".
    • EventType является типом делегата события, например: evt.EventType == TypeOf (RoutedEventHandler).
    • Обработчики это строка коллекции обработчиков событий, например: evt.Handlers = новая строка [] {"Button_Click"} будет сохранен как клик = "Button_Click". Примечание: это чистой воды спекуляция, поскольку ModelEvent пока не поддерживается, и я не знаю, / когда / как оно будет поддерживаться для Silverlight.
    • Родитель контроля, завернутые в тип ModelItem, из которых это событие принадлежит. Например: evt.Parent == элемент.

Реализация

Диаграмма инициализатор класса по умолчанию ChartDefaultInitializer осуществляется в ChartDefaultInitializer.cs, и зарегистрированные в ChartMetadata.cs. Оба файла в Controls.DataVisualization.Toolkit.Design.csproj из Silverlight.Controls.Design.sln. Пожалуйста, прочитайте до сообщению время разработки функций реализации в Silverlight Toolkit для получения дополнительной информации.

Результат XAML

В качестве первого шага, определить результат XAML, который будет подготовлен ChartDefaultInitializer:

 Title ="Chart <Диаграмм: Название диаграммы = "Chart 

Регистрация

Совершено в ChartMetadata.cs с следующий код:

  (ChartDefaultInitializer))); b.AddCustomAttributes (новые FeatureAttribute (TypeOf (ChartDefaultInitializer))); 

Ссылки

Смотрите скриншот ниже:

References

Хотя DefaultInitializer определен в версии 3.5 Microsoft.Windows.Design.Interaction.dll (в%% DevEnvDir \ PublicAssemblies, т.е. C: \ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ PublicAssemblies на 32-битной Windows), то не поддерживается Blend2 или Visual Studio 2008 для Silverlight. Она поддерживается Blend3 и Visual Studio 2010, но они оба переключателя на более новые версии Microsoft.Windows.Design *. DLL (3,7 для Blend 3 Preview, 4.0 для Blend 3 RTM и Visual Studio 2010), так что мы должны связать против новой версии ММР. Пожалуйста, смотрите предварительное сообщение Как писать Silverlight время разработки для всех дизайнеров: Visual Studio 2008, Blend 2, Blend 3, а также Visual Studio 2010 для получения дополнительной информации.

Пожалуйста, обратите внимание, что ссылка на System.Windows.dll Silverlight является псевдонимом, и PointCollection специально позвал быть Silverlight один, не WPF. Так как доля WPF и Silverlight много классов в том же пространстве имен, важно, что Silverlight типов, а не WPF, которые используются в создании ModelItem и ModelProperty по умолчанию инициализатор для элементов управления Silverlight.

Коллекции

Пожалуйста, обратите внимание на скриншот ниже, что в то время как все остальные стоимости имущества может быть установлена ​​через ModelProperty.SetValue:

ChartDefaultInitializer

Chart.Series имеет тип коллекции (Collection <Series>), так что его значение должно быть установлено путем предварительного создания ModelItem через ModelFactory.CreateItem для значения, а затем добавить созданный ModelItem через ModelProperty.Collection.Add. В противном случае, даже несмотря на правильное XAML может быть создан, Blend не будет обновлять оказать управления диаграммы правильно, вы должны перезагрузить страницу, чтобы он отображается правильно.

ChartDefaultInitializer.cs

 alias / / (С) Copyright Microsoft Corporation. / / Этот источник подлежит лицензии Microsoft Public (Ms-PL). / / См. http://go.microsoft.com/fwlink/?LinkID=131993 для деталей. / / Все другие права защищены. внешних псевдоним  SSWM = Silverlight::System.Windows.Media; namespace System.Windows.Controls.DataVisualization.Design { /// <summary> /// Default initializer for chart. /// </summary> internal class ChartDefaultInitializer : DefaultInitializer { /// <summary> /// Sets the default property values for chart. /// </summary> /// <param name="item">Chart ModelItem.</param> public override void InitializeDefaults(ModelItem item) { string propertyName; // <Charting:Chart Title="Chart Title"> propertyName = Extensions.GetMemberName<Chart>(x => x.Title); item.Properties[propertyName].SetValue(Properties.Resources.ChartTitle); // <Charting:Chart.DataContext> // <PointCollection> // <Point X="1" Y="10" /> // <Point X="2" Y="20" /> // <Point X="3" Y="30" /> // <Point X="4" Y="40" /> // </PointCollection> // </Charting:Chart.DataContext> SSWM::PointCollection defaultItemsSource = new SSWM::PointCollection(); for ( int i = 1; i <= 4; i++) { defaultItemsSource.Add( new SSW::Point(i, 10 * i)); } propertyName = Extensions.GetMemberName<Chart>(x => x.DataContext); item.Properties[propertyName].SetValue(defaultItemsSource); // <Charting:Chart.Series> // <Charting:ColumnSeries ItemsSource="{Binding}" // DependentValuePath="X" // IndependentValuePath="Y" /> // </Charting:Chart.Series> ModelItem columnSeries = ModelFactory.CreateItem(item.Context, typeof (ColumnSeries)); propertyName = Extensions.GetMemberName<ColumnSeries>(x => x.ItemsSource); = Silverlight:: System.Windows; использованием SSWD = Silverlight:: System.Windows.Data; использованием SSWM = Silverlight:: System.Windows.Media; имен System.Windows.Controls.DataVisualization.Design {/ / / <summary> / / / По умолчанию инициализатор для диаграммы / / / </ резюме> внутреннее ChartDefaultInitializer класс:.. DefaultInitializer {/ / / <summary> / / / Устанавливает значения свойств по умолчанию для диаграмм / / / </ резюме> / / / <имя параметра = "пункт"> Диаграмма ModelItem </ параметр> общественный переопределить недействительным InitializeDefaults (ModelItem пункт) {строка PropertyName;. / / <Charting:Chart Title="Chart Title"> PropertyName = Extensions.GetMemberName <Chart> (х => х . Title); item.Properties [PropertyName] SetValue (Properties.Resources.ChartTitle);. / / <Charting:Chart.DataContext> / / <PointCollection> / / <Point X="1" Y="10" /> / / <Point X="2" Y="20" /> / / <Point X="3" Y="30" /> / / <Point X="4" Y="40" /> / / </ PointCollection> / / </ диаграмм: Chart.DataContext> SSWM:: PointCollection defaultItemsSource = новый SSWM:: PointCollection (); для (INT = 1; я <= 4; я + +) {defaultItemsSource.Add (новые SSW: : Point (я, 10 * я));} = PropertyName Extensions.GetMemberName <Chart> (х => x.DataContext); item.Properties [PropertyName] SetValue (defaultItemsSource) / / <Charting:Chart.Series>. / / <Charting:ColumnSeries ItemsSource="{Binding}" // DependentValuePath="X" // IndependentValuePath="Y" /> / / </ диаграмм: Chart.Series> ModelItem ColumnSeries = ModelFactory.CreateItem (item.Context, TypeOf (ColumnSeries)); PropertyName = Extensions.GetMemberName <ColumnSeries> (х => x.ItemsSource);  ); propertyName = Extensions.GetMemberName<Chart>(x => x.Series); item.Properties[propertyName].Collection.Add(columnSeries); } } } PropertyName = Extensions.GetMemberName <ColumnSeries> (х => x.DependentValuePath); columnSeries.Properties [PropertyName] SetValue ("X");. PropertyName = Extensions.GetMemberName <ColumnSeries> (х => x.IndependentValuePath); ColumnSeries. . Свойства [PropertyName] SetValue ("Y"); PropertyName = Extensions.GetMemberName <Chart> (х => x.Series); item.Properties [PropertyName] Collection.Add (ColumnSeries);.}}} 

Technorati