Silverlightのコントロールのためのモデル&デフォルトの初期化子を編集する
導入
これは、実装機能の設計時に一部のシリーズですSilverlightをツールキット。 このポストはどのようにSilverlightコントロールのデフォルトの初期化を実装するために説明するために、グラフのデフォルトの初期化子を使用して、基になる編集モデルのアーキテクチャを説明します。
エクスペリエンス
インストールする場合は、 Silverlightを3 Toolkitをで2009年3月リリースには、ライブラリ資産管理からブレンドチャートことができますドラッグして、表面のデザイナーにドロップして、あなたはレンダリングを持ってグラフうまく初期化さ:
あなたが投稿する前に読むことができるの詳細についてはSilverlightのツールキットデザイン時の特徴:2009年3月発売更新 。
アーキテクチャ
DefaultInitializer
これは、実際にはかなり単純なSilverlightのコントロールの既定の初期化を提供することです:
- のサブクラスを実装するDefaultInitializer 、そのオーバーライドInitializeDefaults 関数
- 関連付けるデフォルトの初期化を介してコントロールクラスを持つクラスをFeatureAttribute
以下のスクリーンショットは、他のクラスまもなく議論されるMicrosoft.Windows.Design.Model名前空間内のDefaultInitializer抽象基本クラスの実装を示しています:
初期化がInitializeDefaultsでオーバーライド行われ、結果がXAMLにシリアル化されます。 デフォルトの初期化を実装する最初のステップは、生産される目的のXAMLを定義することですので。
編集モデル
一度結果XAMLが定義されて、私はより高いレベルの抽象化は、XAMLを取る/メソッドがしたい。 しかし残念ながら、私たちはのようなクラスを持っているために使用はるかに低いレベル(したがって、より柔軟ないわゆる編集モデルで構成されAPI)を強力な命令ModelItem 、 ModelProperty 、 ModelEvent 、 ModelFactoryとModelService 。 MSDNのページの編集モデルのアーキテクチャの概要を与える基本的な:
あなたのデザイン時実装では、プログラミングインターフェイスを編集モデルと呼ばれるが、実行時のコントロールと対話します。 オブジェクトが編集可能なオブジェクトと呼ばれて設計されて。
あなたのコントロールは、拡張アプリケーションマークアップ言語(XAMLの)で定義されます。 あなたのコントロールのプログラム編集モデルを使用して、XAMLを更新します。
モデル、ラッパー、およびビュー
編集モデルは、3つの機能のサブユニットから構成さ:モデル、公共のラッパーを抽象化するモデル、およびモデルのユーザーインターフェイス(UI)を表すビューを返します。 モデルとビューは別ですが、ラッパーとモデルは密接に関連している。 次の図は3つのサブユニット間の関係を示しています。
デザイン環境で使用ModelItemのモデル、基になるとタイプを通信します。 すべての変更は行われModelItem の基になるモデルをラッパーに影響を与える。 このモデルは単純なことができます。 ModelItem ラッパーは、のようなトランザクションのサポートデザイナ機能を処理する複雑なトラッキングを元に戻すと、変更通知。
以下のクラス図を編集するモデルのコアクラス間の相互作用を説明することがあります:
使用例として、XAMLを以下:
<UserControlの xmlns属性 ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns属性:はx ="http://schemas.microsoft.com/winfx/2006/xaml" Width ="640" Height ="480" > にx:Class ="ModelTest.Page" 幅 ="640" 高さ ="480"> x:Name ="LayoutRoot" Background ="White" > < グリッド のx:Name ="LayoutRoot" 背景 ="ホワイト"> x:Name ="Button" > < ボタン のx:Name ="ボタン"> x:Name ="Rectangle" /> < 長方形 のx:Name ="長方形"/> > </ ボタン > > </ グリッド > > </ UserControlの >
- ModelItemは: アイテムを取る変数は、コントロールModelItemがボタンの上
- 名前はとして永続化のx:でXAML属性は名前:item.Name ="ボタン"は 、XAMLで永続化などのx:Name ="ボタン"。
- ItemTypeが、基になるオブジェクトですタイプ制御と/>、 および <Button XAMLのタグが決定タグを使用でXAML:item.PropertyType == tyepof)(ボタン。
- プロパティは、プロパティのコレクション、ModelPropertyタイプで、基になるコントロールのラップされます。 例: アイテム["ClickModeは"] = ClickMode.Release XAMLで永続化されるようにClickMode ="発売"。
- コンテンツは)ContentプロパティをはContentControlで定義され(とサブクラスの継承で表す:item.Content は、オブジェクトである四角形ModelItem表す。
- ソースは:ModelItem、別の要素のプロパティの要素を表し、ソースは、そのプロパティのModelPropertyのラッパーです。 たとえば、item.Content.Value.Source == item.Content / /長方形。
- イベントは、ModelEventのタイプに包まれ、基になるコントロールのイベントのコレクションを表します。 私のデバッグの経験から、それは常にnullですので、イベントのプロパティはまだSilverlight3まだのBlend3でサポートされていないようです。
- 親は、基になるコントロールのロジックの親、ModelItem型でラップされます。 例:item.Parent ModelItemグリッドです。
- ルートは、ルート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 Rectangleオブジェクトを表しています。
- 親は、コントロール、これのプロパティが所属するModelItem型でラップされます。 例:prop.Parent ==アイテムです 。
- ModelEventは:前述のように、item.Eventsは常にnullですが、Blend3でSilverlight3はまだサポートされているModelEventに見えるしないように。 しかし、evtは想定し、動作、変数、すなわち、であるModelEventのButton.Click evtは"クリック= item.Events ["]
- 名前は、イベントの名前です。 例:evt.Name =="をクリックして"。
- 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 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 ="(バインディング)" DependentValuePath ="X"は IndependentValuePath ="Y"を/> > </ チャート:Chart.Seriesは > > </ チャート:Chart.DataContext> > </ グラフ:グラフ >
登録
完了ChartMetadata.csのコードを次のように:
(ChartDefaultInitializer))); b.AddCustomAttributes( 新しいFeatureAttribute(typeof演算 (ChartDefaultInitializer)));
参照
以下のスクリーンショット参照してください:
DefaultInitializerはMicrosoft.Windows.Design.Interaction.dllのバージョン3.5で(%devenvdirの%\ PublicAssemblies、すなわち下、C定義されても:\プログラムファイル\のMicrosoft Visual Studio 9.0の\ Common7 \ IDEの\ PublicAssemblies 32 Windowsの場合)、それはBlend2またはVisual Studio 2008 Silverlightをサポートしていません。 これは、およびVisual Studio 2010 Blend3が、Microsoft.Windows.Design *. dllファイル(3.7ブレンド3プレビュー、4.0ブレンド3 RTMとのための新しいバージョンには、両方のスイッチは、Visual Studio 2010)ので、にリンクする必要がサポートされてMWDsの新しいバージョンです。 ご投稿参照してください前にどのように時間を書くSilverlightのデザインデザイナーのためのすべて:Visual Studio 2008の、ブレンド2;ブレンド3、およびVisual Studio 2010については、詳細。
してくださいまた、SilverlightのSystem.Windows.dllにその参照を通知、およびエイリアスですPointCollectionは、特にSilverlightの1つではなく、WPFのであることが呼び出されます。 名前空間からWPFとSilverlightで同じクラスの多くを共有することが重要であることSilverlightのタイプではなく、WPFのは、コントロールのSilverlightの初期化ModelPropertyをデフォルトのされている使用されて作成ModelItem。
コレクション
下のスクリーンショット注意してください他のすべてのプロパティの値がModelProperty.SetValueを介して設定することができますが:
Chart.Seriesは、コレクションのタイプ(コレクション<Series>)のため、その値は最初ModelItem ModelFactory.CreateItemを介して値をクリックし、追加作成することによって設定されるているModelItem ModelProperty.Collection.Addを介して作成しました。 それ以外の場合にもかかわらず、適切なXAMLが生成されるが、ブレンドが正常にグラフコントロールをレンダリングするために更新されますので、それが正しくレンダリングしているページをリロードしなければならない。
ChartDefaultInitializer.cs
/ /(c)の著作権マイクロソフト株式会社。 / /このソースは)さんは被写体に、Microsoft Public Licenseの(のPL。 / /詳細については、http://go.microsoft.com/fwlink/?LinkID=131993を参照してください。 / /他のすべての権利を保有。 のexternエイリアスのSilverlight。 System.Windows.Controls.DataVisualization.Chartingを使用して; System.Windows.Controls.Design.Common 使用して ; Microsoft.Windows.Design.Metadataを使用して; Microsoft.Windows.Design.Modelを使用して; Silverlightを使用して南南西=::System.Windows。 Silverlightを使用して SSWD =::System.Windows.Data; Silverlightを使用して SSWM =::System.Windows.Media; 名前空間 System.Windows.Controls.DataVisualization.Design ( / / / <summary> /デフォルトの初期化のグラフ/ /。 / / / </概要> 内部クラス ChartDefaultInitializer:DefaultInitializer ( / / / <summary> / / /グラフのデフォルトのプロパティ値のために設定します。 / / / </概要> / / / <param name="item">チャートModelItem。</パラメータの> 公共オーバーライドするvoid InitializeDefaults(ModelItem項目) ( 文字列 propertyNameの。 / / <Charting:ChartのTitle="ChartのTitle"> propertyNameは= Extensions.GetMemberName <Chart>が(x => x.Title); item.PropertiesはpropertyNameの[編集]。SetValueを(Properties.Resources.ChartTitle); / / <Charting:Chart.DataContext> / / <PointCollection> / />をY="10" / <Point X="1" / />をY="20" / <Point X="2" / />をY="30" / <Point X="3" / />をY="40" / <Point X="4" / / </ PointCollectionの> / / </チャート:Chart.DataContext> SSWM::PointCollectionのdefaultItemsSource = 新しい SSWM::PointCollection(); i = 1; i <= 4; i++) 1 = するfor(int私は、私は<= 4;私+ +) ( 南南西defaultItemsSource.Add( 新 ::ポイント(私は、10 * 1)); ) propertyNameは= Extensions.GetMemberName <Chart>が(x => x.DataContext); item.PropertiesはSetValueを(defaultItemsSource)propertyNameの[編集]; / / <Charting:Chart.Series> / / <グラフを:ColumnSeriesはItemsSource ="(バインディング)" / / DependentValuePath ="X"が / / IndependentValuePath ="Y"を/> / / </チャート:Chart.Seriesは> ModelItemのcolumnSeries = ModelFactory.CreateItem(item.Context、typeof演算(ColumnSeries)); propertyNameは= Extensions.GetMemberName <ColumnSeries>が(x => x.ItemsSource); columnSeries.Propertiesは、(columnSeries.Context [propertyNameの]を。SetValueを(ModelFactory.CreateItem typeof演算 (SSWD::バインディング))); propertyNameは= Extensions.GetMemberName <ColumnSeries>が(x => x.DependentValuePath); columnSeries.Properties)はXの"[propertyNameの]を。SetValueを("; propertyNameは= Extensions.GetMemberName <ColumnSeries>が(x => x.IndependentValuePath); columnSeries.Properties)がY"の [propertyNameの]を。SetValueを("; propertyNameは= Extensions.GetMemberName <Chart>が(x => x.Series); item.PropertiesはCollection.Add(columnSeries)propertyNameの[編集]; ) ) )

.png)








あなたはどのような方法DefaultInitializer(と時間のかかる操作するためのユーザーのために私が進行バーを表示するようなものを意味するフィードバックを提供するための対応)ですか?
問題は、私は初めに、進行状況バーを表示できますInitializeDefaultsメソッドの最後でそれを隠すには、この方法では時間だけコントロールを生成するために必要なほとんどの部分を消費している。
グレート投稿!
@ミロスラフPaskov
こんにちはミロスラフ、
選択した項目が表示されます最新のリリース(Silverlightは3 RTMとツールキットは、2009年7月)、あなたはすでにアコーディオン、TreeViewコントロール、パンダ、DatePickerなどで1つのアイテムを行うことができます:します。 私は、ブログの記事をどのようにこれが行われて説明しているの周りはまだそれを仕上げるのになったいない。 コンテキストメニュー等については、次のツールキットのリリースを待つ。 私はSilverlightのTabControlのすべてのデザイン時の動作を、あなたがWPFで参照してください実装したと思う。 それは一度リリースしたについては私のブログです。
おかげで、
寧
こんにちは寧、
グレート投稿! してください彼らは続けている。 私はブレンドの拡張に探していたと私はいくつかの質問があります:
1。 デフォルトのTabControlのインタラクションを実現するには? ユーザーがマウスでそれらを選択してTabItemsを切り替えることができます。 これは、これが可能であれば、ブレンド2でもあるようです。
2。 どのように""TabControlのためのTabItemを追加するコンテキストメニューを、に似て追加することが? 再び、これはブレンド2と思われる。
ミロスラフ