Архив

Записи с меткой 'Control'

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

Ссылки

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

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

  / / (С) 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).
         }
     }
 } 

Technorati