Редактирование модели и по умолчанию Initializer для управления Silverlight
Введение
Это часть серии на время разработки особенность реализации в Silverlight Toolkit . Это сообщение используется инициализатор диаграммы по умолчанию, чтобы проиллюстрировать, как реализовать по умолчанию инициализации для элементов управления Silverlight, и объяснить базовую архитектуру модели редактирования.
Опыт
Если вы устанавливаете Silverlight 3 Toolkit в марте 2009 выпуска , можно перетащить диаграмму контролем смесь библиотеки активов и перетащите его на поверхность конструктора, и у вас есть схема хорошо инициализирован и оказал:
Вы можете прочитать больше об этом в предыдущих сообщение Silverlight Toolkit время разработки Особенности: март 2009 выпуска обновлений .
Архитектура
DefaultInitializer
Это на самом деле довольно просто обеспечить умолчанию инициализатор для элемента управления Silverlight:
- реализовать подкласс DefaultInitializer , и переопределить его InitializeDefaults функции
- связать класс по умолчанию инициализатор класса элемента управления с помощью FeatureAttribute
Ниже скриншот показывает реализацию DefaultInitializer абстрактный базовый класс, и другими классами в Microsoft.Windows.Design.Model имен, которые будут обсуждаться коротко:
Инициализация выполняется в коррекции InitializeDefaults, и результат сериализуется в XAML. Таким образом, первым шагом в реализации по умолчанию инициализатор является определение желаемого XAML будет производиться.
Редактирование модели
Как только результат XAML определена, я хочу есть более высокий уровень абстракции / метод, который бы просто взять XAML. Но, к сожалению, мы должны использовать гораздо более низком уровне (таким образом, более гибкий и мощный) необходимо API под названием редактирования модели, которая состоит из классов, как ModelItem , ModelProperty , ModelEvent , ModelFactory и ModelService . MSDN странице редактирования модели архитектуры дает краткий обзор:
Ваше время разработки реализации взаимодействует с во время управления, хотя программный интерфейс называется редактирования модели. Объекты, предназначенные называют редактируемых объектов.
Ваша управления определены в Extensible Application Markup Language (XAML). Вы обновите XAML для управления программным путем с помощью модели редактирования.
Модель оболочки, и просмотр
Редактирование модели состоит из трех функциональных подразделений: модель, общественного оболочку, которая абстрагируется от модели, и тем, что представляет пользовательский интерфейс (UI) модели. Модель и вид отдельно, но обертка и модели тесно связаны. На следующем рисунке показана связь между тремя подразделениями.
Среда разработки использует ModelItem типа для связи с базовой моделью. Все изменения, внесенные в ModelItem обертки, которые влияют на базовую модель. Это позволяет модели быть простой. ModelItem обертки обрабатывать сложные функции дизайнера, такие как поддержка транзакций, отменить отслеживания и уведомления об изменениях.
Ниже диаграмма классов может помочь объяснить взаимодействия между основным классам редактирования модели:
Используйте ниже 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 Title" > <Диаграмм: Название диаграммы = "Название диаграммы"> > <Диаграмм: Chart.DataContext> > <PointCollection> X ="1" Y ="10" /> <Точка X = "1" Y = "10" /> X ="2" Y ="20" /> <Точка X = "2" Y = "20" /> X ="3" Y ="30" /> <Точка X = "3" Y = "30" /> X ="4" Y ="40" /> <Точка X = "4" Y = "40" /> > </ PointCollection> > <Диаграмм: Chart.Series> ItemsSource ="{Binding}" <Диаграмм: ColumnSeries ItemsSource = "{Binding}" DependentValuePath = "X" IndependentValuePath = "Y" /> > </ Диаграмм: Chart.Series> > </ Диаграмм: Chart.DataContext> > </ Диаграмм: Диаграмма>
Регистрация
Совершено в ChartMetadata.cs с следующий код:
(ChartDefaultInitializer))); b.AddCustomAttributes (новая FeatureAttribute (TypeOf (ChartDefaultInitializer)));
Ссылки
Смотрите скриншот ниже:
Хотя 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:
Chart.Series имеет тип коллекции (Collection <Series>), так что его значение должно быть установлено сначала создать ModelItem через ModelFactory.CreateItem для значений, а затем добавить созданный ModelItem через ModelProperty.Collection.Add. В противном случае, несмотря на правильное XAML может быть создан, смесь не будет обновить для отображения диаграмм контроль правильно, вы должны перезагрузить страницу, чтобы он отображается правильно.
ChartDefaultInitializer.cs
/ / (С) Copyright Microsoft Corporation. / / Этот источник зависит от лицензии Microsoft Public (Ms-PL). / / См. http://go.microsoft.com/fwlink/?LinkID=131993 подробности. / / Все остальные права защищены. внешний псевдоним Silverlight; использование System.Windows.Controls.DataVisualization.Charting; использование System.Windows.Controls.Design.Common; использование Microsoft.Windows.Design.Metadata; использование Microsoft.Windows.Design.Model; использование СВ = :: Silverlight System.Windows; использование SSWD = Silverlight :: System.Windows.Data; использование SSWM = Silverlight :: System.Windows.Media; Пространство имен System.Windows.Controls.DataVisualization.Design { / / / <summary> / / / По умолчанию для инициализации карты. / / / </ Резюме> внутренний ChartDefaultInitializer класса: DefaultInitializer { / / / <summary> / / / Устанавливает значения свойств по умолчанию для диаграмм. / / / </ Резюме> / / / <param Name="item"> Диаграмма ModelItem. </ Параметров> общественных коррекции недействительным InitializeDefaults (ModelItem пункт) { Строка PropertyName; / / <Charting:Chart Title="Chart Title"> PropertyName = Extensions.GetMemberName <Chart> (х => 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> / / </ Диаграмм: Chart.DataContext> SSWM :: PointCollection defaultItemsSource = новый SSWM :: PointCollection (); i = 1; i <= 4; i++) для (INT = 1, г <= 4, я + +) { defaultItemsSource.Add (новый Южный :: Point (я, 10 * я)); } PropertyName = Extensions.GetMemberName <Chart> (х => x.DataContext); item.Properties [PropertyName] SetValue (defaultItemsSource). / / <Charting:Chart.Series> / / <Диаграмм: 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 <ColumnSeries> (х => x.DependentValuePath); columnSeries.Properties [PropertyName] SetValue ("X"). PropertyName = Extensions.GetMemberName <ColumnSeries> (х => x.IndependentValuePath); columnSeries.Properties [PropertyName] SetValue ("Y"). PropertyName = Extensions.GetMemberName <Chart> (х => x.Series); item.Properties [PropertyName] Collection.Add (ColumnSeries). } } }

.png)








Последние комментарии