Архив

Архив за мая 2009

Редактирование модели и по умолчанию 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 в качестве примера:

  <UserControl
     XMLNS = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     XMLNS: х = "http://schemas.microsoft.com/winfx/2006/xaml"
     Width ="640" Height ="480" > х: Class = "ModelTest.Page" ширина = "640" высота = "480">
     x:Name ="LayoutRoot" Background ="White" > <Сетка х: Name = "LayoutRoot" Background = "Белая">
         x:Name ="Button" > Кнопка <х: Name = "Button">
             x:Name ="Rectangle" /> <Rectangle х: Name = "Прямоугольник" />
         > </ Button>
     > </ Grid>
 > </ UserControl> 

  • 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 == "Нажмите кнопку".
    • EventType является типом делегата события, например: evt.EventType == TypeOf (RoutedEventHandler).
    • Обработчики это строка коллекции обработчиков событий, например: evt.Handlers = новая строка [] {"Button_Click"} будет сохранен как 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 может быть создан, смесь не будет обновить для отображения диаграмм контроль правильно, вы должны перезагрузить страницу, чтобы он отображается правильно.

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> (х => х . название); 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 (новый Южный: : 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