2009-06-10 29 views
3

私は複雑なポップアップ(それにグリッドが付いたCanvas Z-index ... 99)を持つXBAPを作成しています。それを開き、画面上のどこにでもそのボタンのそばをたどります。たとえば、ボタンがListBoxまたはXamDataGridにある場合、そのボタンがスクロールするときにポップアップがボタンに従うようにしたいと思います。エキスパンダーの下にある場合は、エキスパンダーが移動させるときにボタンに付いたままにしておきたい。別のコントロールの相対スクリーン位置にポップアップをバインドする

どのようなアイデアですか?

答えて

0

自動更新するかどうかはわかりませんが、PlacementTargetプロパティでは、コントロールを指定してポップアップの相対位置を指定できます。それでも問題が解決しない場合は、CustomPopupPlacementCallbackがこのトリックを行いますか?

7

Popupを使用している場合、ポップアップが最初に表示された後にPlacementTargetでもCustomPopupPlacementCallbackも使用されません。したがって、これらのプロパティを使用すると、ポップアップはボタンが移動するのを追跡することができません。

いくつかの方法は、あなたが望むものを達成するための私に発生します。

  1. がボタンにカスタムAdornerを取り付け、その中にポップアップを置きます。欠点:ポップアップはButtonやその周辺の要素には接続されていないため、それらからプロパティ&のDataContextを継承しません。

  2. ボタンにカスタムAdornerを添付します。このアドワーナーは、ボタンがAdornerLayerを基準にして移動したときに測定を行い、通話をアレンジし、Popupの位置を手動で更新できるようにします。 AdornerDecoratorWindowに対して移動しない限り(たとえば、それがウィンドウの直接の子である場合)、ウィンドウサイズの変更を監視することによって、AdornerLayerを簡単に検出できます。短所:複雑なコード&が得意です。

  3. Popupを一切使用しないでください。その代わりに、<Grid>のボタンを幅と高さがゼロで希望の位置にある<Canvas>の横にラップします。 <Canvas>の内部には、適切なZIndexをポップアップに追加するためにUserControlを追加します。それはWPFでちょうど良いキャンバスの端を越えて広がります。 Popupコントロールを使用する代わりに、UserControlの可視性を制御するだけです。欠点:他のすべてのオブジェクトの上に完全に存在するわけではありませんが、ウィンドウの端からは伸びることはできません(ただし、XBAPでは問題ではないかもしれません)。

関連する問題