15

WPF アプリを Silverlight に変換しています。

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

インターネットで読んでいると、同じ問題を抱えている人が他にもいます。解決策には、 Control から直接継承し、 Content プロパティをパスに設定する必要があるようです。ただし、イベント ハンドラー (MouseEnter、MouseLeave、GotFocus、LostFocus) も保持し、その位置を維持して、アプリケーションの残りの部分に比例してサイズを変更したいと考えています。

私は主にバックエンドの開発者なので、これは私の得意分野ではありません。どなたか、これを実現する方法の概要サンプルを教えていただければ幸いです。

4

4 に答える 4

16

ShapeSilverlight は基本クラスから派生するカスタム要素の作成をサポートしていないため、同じように機能するクラスを作成することはできません。

Silverlight でカスタム シェイプを作成できない理由は、Silverlight が WPF の「ビジュアル レイヤー」を共有していないためです。試みていることが不可能な理由を完全に理解したい場合は、ここで Silverlight が WPF とどのように大きく異なるかを理解する必要があります。(気にしない場合は、次の 2 つの段落をスキップしてください。)

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

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

だから、習慣Controlか、どちらかUserControlが進むべき道になると思います。MouseEnterただし、これによりandの動作が停止することはありませんMouseLeave。それらが機能しないことを実際に発見しましたか?それとも、うまくいかないと思っているだけですか?

于 2010-12-14T11:35:38.340 に答える
0

Silverlight 3以降、ジオメトリタイプのプロパティデータを定義するパスと呼ばれる特別なタイプのシェイプがあります。Geometryを作成した元のWPFコードをこのDataプロパティに移植できるはずです。

于 2010-12-16T13:31:01.550 に答える
0

既存のクラスをそのままにして、それをそのままCustomShapeと呼び、CustomShapeContainerのようなものを使用してControlに固有のものとするとどうなるでしょうか。CustomShapeContainerは、基本的にはCustomShapeのラッパーにすぎません。次に、CustomShapeContainerに着信するすべてのイベントを直接CustomShapeに渡し、シェイプDefininingGeometryオブジェクトをContainersコンテンツとして返すことができます。

一見すると、これは最も抵抗の少ない道のように見えます。

于 2010-11-05T21:44:29.987 に答える
0

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

新たに始める必要があるかもしれません。ただし、MVVM パターンを使用した場合、コード ビハインドはほとんどなく、ViewModel、モデル、およびサービスを再利用できる可能性があります。おそらく、リソース、スタイルは「そのまま」再利用しても問題ありません。しかし、View: 新規に開始します。

于 2010-12-13T18:27:39.890 に答える