2009-09-03 24 views
15

私はWPFアプリケーションをSilverlightに変換しています。Silverlightのカスタムシェイプ(WPFの移植アプリケーション)

このアプリには、Shapeから継承するクラスが含まれています。 DefiningGeometryプロパティをオーバーライドしてPathオブジェクトを返します。ただし、Silverlight ShapeクラスにはDefiningGeometryプロパティがありません。

インターネットで読む私はこの同じ問題を持つ他の人を見つけました。このソリューションは、Controlから直接継承し、Contentプロパティをパスに設定するように見えます。しかし、イベントハンドラ(MouseEnter、MouseLeave、GotFocus、LostFocus)を保持したいだけでなく、アプリケーションの残りの部分に比例して位置を保持してサイズを変更したいと思っています。

私は主にバックエンドの開発者ですので、これは私の特集ではありません。誰かが私にこれを達成するための概要サンプルを与えることができれば幸いです。

+4

元のクラスを投稿すると、さらに回答が得られる場合があります。他の人があなたのためにそれをすぐに書き換えることができました。がんばろう。 –

+0

これはSilverlightフォーラムhttp://forums.silverlight.net/forums/p/39904/113634.aspxで解決されていない問題で、Silverlight 4のサブクラス化のソリューションでさえも可能です(http://blogs.msdn.com/b /nickkramer/archive/2009/12/03/subclassing-shape-or-more-accurately-path.aspx)はDefiningGeometryプロパティの問題を解決しません。私たちはこれに対する解決策に恩恵を払うべきです。 – Alain

答えて

16

SilverlightはShape基本クラスから派生したカスタム要素の作成をサポートしていないため、同じ方法で動作するクラスを生成することはできません。

Silverlightでカスタムシェイプを作成できない理由は、SilverlightがWPFの「ビジュアルレイヤー」を共有しないためです。何をしようとしているのかを完全に理解したい場合は、SilverlightとWPFとの違いを理解する必要があります。

WPFでは、完全に異なる2つのレベル(ビジュアルレイヤーまたはフレームワークレイヤー)で作業できます。次の2つの段落をスキップします。ビジュアルレイヤのサービスは、WindowsBase.dllおよびPresentationCore.dllによって提供されます。これは、基本的なレンダリングと入力サービスを提供します。しかし、スタイリング、データバインディング、レイアウト、テンプレートなどのようなものが必要な場合は、フレームワークサービスが必要です。これらはPresentationFramework.dllによって提供されます。シェイプタイプ - RectanglePathなど - はすべてフレームワークタイプで、FrameworkElementから派生し、データバインディング、レイアウト、アニメーションなどをサポートしています。しかし、これらはビジュアルレイヤーの上に実装されています。リフレクターまたはILDASMのShapeタイプのいずれかを見ると、すべてがOnRenderメソッドをオーバーライドしていることがわかります。実際の形状が定義されているコードがここにあります。 (OnRenderはビジュアルレイヤーの機能です)。ビジュアルレイヤーは完全にサポートされ、ドキュメント化されたAPIなので、WPFで独自の図形を自由に書くことができます。組み込みのシェイプクラス。

Silverlightでは、このビジュアル/フレームワークを区別しません.Weightlightでは、WPFのビジュアルレイヤーが本質的にフレームワークレイヤーに折りたたまれています。したがって、ReflectorまたはILDASMの形状タイプを見ると、OnRenderメソッドが含まれていないことがわかります。これらはほとんど空です。これは、Silverlightでは形状がすべて組み込みであるためです。プラグインにはEllipsePathなどの特殊な処理が組み込まれています。そのため、Silverilghtでは、一連の図形が拡張されていません。 Silverlightでオーバーライドする方法はありません。OnRender SilverlightでShapeから派生した独自のカスタムクラスを作成することはできません。

したがって、カスタムControlまたはUserControlのいずれかが行く方法です、私は恐れています。これにより、MouseEnterMouseLeaveは機能しなくなります。あなたは実際にそれらが動作しないことが分かったのですか?あるいは、彼らはうまくいかないと仮定していますか?

+0

+1あなたの理論を知っている、特に新しいパラダイムの場合は+1。 – Alain

+0

+1優秀な回答 – ColinE

+0

+1の説明のために、Microsoftに-1完全に色あせない拡張性! –

0

既存のクラスをそのまま使用すると、CustomShapeをそのまま呼び出すことができます。また、CustomShapeContainerのようなものをControlの元とすることはできますか? CustomShapeContainerは基本的にはCustomShapeのラッパーになります。次に、CustomShapeContainerに入ってくるすべてのイベントをCustomShapeに直接渡してから、Containingsコンテンツとして形状DefininingGeometryオブジェクトを返します。

一見すると、これは最も抵抗の少ないパスのようです。

0

Silverlightには同じ名前空間がありません。 Silverlight xamlはWPF xamlのサブセットであり、Silvelrightには含まれていないアセンブリがあります。これらの技術は、さまざまな種類のソリューションを対象としています。

新たに開始する必要があります。しかし、MVVMパターンを使用した場合は、コードがごくわずかで、ViewModel、Model、およびサービスを再利用できる可能性があります。たぶんリソース、スタイルは "そのまま"再利用することができます。しかし、ビュー:新しいスタートを。

0

シルバーライト3からは、形状タイプがDataPathという特別なタイプのシェイプがあります。ジオメトリを作成した元のWPFコードをこのDataプロパティに移植することができます。

+1

私が知っているのは、あなたがリンクしているMSDNの記事は別にありますが、最初からPathはSilverlightに入っています。 –

関連する問題