Buttonコントロールに見るWPF 3.5とSilverlight 2 Betaの違い

Silverlight 2 Betaがリリースされ、WPFベースのUI Frameworkが実装されたことでようやくSilverlightWPFのサブセットであると言えるようになってきたように思います。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プロパティ
これはドラッグ&ドロップ操作の対象として使用するかどうかを示すプロパティです。このプロパティがないということは、SilverlightWPFのように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コントロールの違いはこれでつかんでいただけたかと思います。サブセット度数は何パーセントくらいでしょうか。個人的に影響が大きいと思うのはやはりプロパティトリガがないということですね。