Buttonコントロールに見るWPF 3.5とSilverlight 2 Betaの違い
Silverlight 2 Betaがリリースされ、WPFベースのUI Frameworkが実装されたことでようやくSilverlightはWPFのサブセットであると言えるようになってきたように思います。SilverlightアプリケーションのXAMLファイルなどをコピーして少し修正することで、WPFアプリケーションとしてデスクトップアプリケーションも簡単に作成できるというような内容も、Scott Guthrieさんのblogで紹介されています(※リンク先は翻訳してくださっているChicaさんのblogです)。
一方で、Silverlight 2がどこまでWPFと同じなのかということはあまり情報として流れてきていないように思いますが、既にWPFをよくご存じの方にとっては気になる点だと思います。おそらく最終的には包括的な内容がドキュメントとして提供されると思いますが、その前にここではピンポイントでButtonコントロールのプロパティを比較することで、そのサブセット具合を調査してみたいと思います。
以下がWPF 3.5とSilverlight 2 BetaのButtonコントロールのプロパティ一覧の比較表になります。
※下記の表の作成にはExcelからはてなのtable記法に変換するこちらのページを利用させていただきました。
WPF 3.5 | Silverlight 2 Beta |
---|---|
ActualHeight | ActualHeight |
ActualWidth | ActualWidth |
AllowDrop | - |
Background | Background |
BitmapEffect | - |
BitmapEffectInput | - |
BorderBrush | - |
BorderThickness | - |
ClickMode | ClickMode |
Clip | Clip |
ClipToBounds | - |
Command | - |
CommandBindings | - |
CommandParameter | - |
CommandTarget | - |
Content | Content |
ContentTemplate | ContentTemplate |
ContentTemplateSelector | - |
ContextMenu | - |
Cursor | Cursor |
DataContext | DataContext |
DefaultStyleKey | - |
DependencyObjectType | - |
DesiredSize | DesiredSize |
Dispatcher | Dispatcher |
FlowDirection | - |
Focusable | - |
FocusVisualStyle | - |
FontFamily | FontFamily |
FontSize | FontSize |
FontStretch | FontStretch |
FontStyle | FontStyle |
FontWeight | FontWeight |
ForceCursor | - |
Foreground | Foreground |
HandlesScrolling | - |
HasAnimatedProperties | - |
HasContent | - |
Height | Height |
HorizontalAlignment | HorizontalAlignment |
HorizontalContentAlignment | HorizontalContentAlignment |
InheritanceBehavior | - |
InputBindings | - |
InputScope | - |
IsArrangeValid | - |
IsCancel | - |
IsDefault | - |
IsDefaulted | - |
IsEnabled | IsEnabled |
IsEnabledCore | - |
IsFocused | IsFocused |
IsHitTestVisible | IsHitTestVisible |
IsInitialized | - |
IsInputMethodEnabled | - |
IsKeyboardFocused | - |
IsKeyboardFocusWithin | - |
IsLoaded | - |
IsMeasureValid | - |
IsMouseCaptured | - |
IsMouseCaptureWithin | - |
IsMouseDirectlyOver | - |
IsMouseOver | IsMouseOver |
IsPressed | IsPressed |
IsSealed | - |
IsStylusCaptured | - |
IsStylusCaptureWithin | - |
IsStylusDirectlyOver | - |
IsStylusOver | - |
IsTabStop | IsTabStop |
IsVisible | - |
Language | Language |
LayoutTransform | - |
LogicalChildren | - |
Margin | Margin |
MaxHeight | MaxHeight |
MaxWidth | MaxWidth |
MinHeight | MinHeight |
MinWidth | MinWidth |
Name | Name |
Opacity | Opacity |
OpacityMask | OpacityMask |
OverridesDefaultStyle | - |
Padding | Padding |
Parent | Parent |
PersistId | - |
RenderSize | RenderSize |
RenderTransform | RenderTransform |
RenderTransformOrigin | RenderTransformOrigin |
Resources | Resources |
SnapsToDevicePixels | - |
Style | Style |
StylusPlugIns | - |
TabIndex | TabIndex |
- | TabNavigation |
Tag | Tag |
Template | Template |
TemplatedParent | - |
- | TextAlignment |
- | TextDecorations |
- | TextWrapping |
ToolTip | ToolTip |
Triggers | Triggers |
VerticalAlignment | VerticalAlignment |
VerticalContentAlignment | VerticalContentAlignment |
Visibility | Visibility |
VisualBitmapEffect | - |
VisualBitmapEffectInput | - |
VisualBitmapScalingMode | - |
VisualChildrenCount | - |
VisualClip | - |
VisualEdgeMode | - |
VisualOffset | - |
VisualOpacity | - |
VisualOpacityMask | - |
VisualParent | - |
VisualTransform | - |
VisualXSnappingGuidelines | - |
VisualYSnappingGuidelines | - |
Width | Width |
プロパティの数は、WPFが115個に対してSilverlight 2が55個と半分以下であることが分かります。
以下にWPFにあってSilverlight 2にはないプロパティをいくつか取り上げてみます。
AllowDropプロパティ
これはドラッグ&ドロップ操作の対象として使用するかどうかを示すプロパティです。このプロパティがないということは、SilverlightがWPFのようにDataObjectを使用したドラッグ&ドロップをサポートしていないと予想できます。SilverlightはWebブラウザ上で動作するプラグインですので、外部からのドラッグ&ドロップをサポートしないというのは納得できるかと思います。アプリケーション内のドラッグ&ドロップは各マウスイベントを利用することで対応できます。
Implementing Drag-and-Drop Functionality with Mouse Events and Capture
BitmapEffectプロパティ
BitmapEffectはSilverlight 2にはないということでしょう。
BorderBrush、BorderThicknessプロパティ
境界線の色と太さを設定するプロパティですが、このような外観に関係するプロパティのほとんどは実際にはTemplateBindingでテンプレート内の値を変更しているにすぎません。したがってSilverlightでこれらのプロパティがなくても、テンプレートを直接書き換えて対応すれば良いので問題ないかと思います。WPFと違ってWindowsのテーマ対応を意識する必要がないため、テンプレートを直接書き換えることのデメリットはほとんどないと思われます。
ClipToBoundsプロパティ
そもそもClipToBoudsプロパティがFalseであっても、GetLayoutClipメソッドをオーバーライドしてNothingを返すようにしないと結局クリッピングされてしまうようなので、あまり問題にはならないプロパティではないでしょうか。
Command、CommandBindings、CommandParameter、CommandTargetプロパティ
コマンドはないようです。
ContentTemplateSelectorプロパティ
ContentTemplateのDataTemplateを複数宣言して選択するときに使うプロパティだと思いますが、これはサポートされないようです。ということでほぼ同じ、ItemsControlのItemTemplateSelectorもありませんでした。
ContextMenuプロパティ
コンテキストメニューの仕組みは用意されていないので、右クリックを捕まえて自前でメニューをだすということなのでしょう。
DefaultStyleKey、OverridesDefaultStyleプロパティ
テーマはないので必要ないということになります。
FlowDirectionプロパティ
ヘブライ語とアラビア語などの右から左へ書く言語はサポートしていないということでしょう。
Focusableプロパティ
通常フォーカスを持つことができるコントロールを、フォーカスを持つことができないようにすることはできないということになります。
FocusVisualStyleプロパティ
フォーカス時のスタイルを定義しておく受け皿はないので、フォーカス時の外観はIsFocusedプロパティを判断して独自に変更する処理を書く必要があります。
InputBindingsプロパティ
コマンド、コマンドバインディングがないので、入力バインディングもありません。
Is****プロパティ
プロパティトリガがないので、そのために存在していたようなIs****プロパティはほとんどありません。
LayoutTransformプロパティ
RenderTransformはありますが、LayoutTransformはサポートされません。
逆にSilverlight 2にあってWPF 3.5にないプロパティが4つほどあります。
TabNavigationプロパティ
WPFではKeyboardNavigationからアタッチされるプロパティでしたが、Silverlight 2ではコントロールのプロパティになっています。
TextAlignment、TextDecorations、TextWrappingプロパティ
WPFではテキスト系のコントロールにそれぞれ実装されていましたが、SilverlightではControlのプロパティになりすべてのコントロールでこのプロパティを使用できるようです。
おおまかなButtonコントロールの違いはこれでつかんでいただけたかと思います。サブセット度数は何パーセントくらいでしょうか。個人的に影響が大きいと思うのはやはりプロパティトリガがないということですね。