私はそれを開くボタンに「アタッチ」し、そのボタンがどこにあるのかをたどりたい複雑なポップアップ(キャンバスのZインデックス99...)を使用してXBAPを作成しています画面。たとえば、ボタンが ListBox または XamDataGrid にある場合、ボタンがスクロールするときにポップアップがボタンに追従するようにします。エキスパンダーの下にある場合は、エキスパンダーがボタンを強制的に動かしたときなどに、ボタンに取り付けられたままにしたい.
何か案は?
を使用する場合、ポップアップが最初に表示された後はPopup
どちらPlacementTarget
も使用されません。CustomPopupPlacementCallback
したがって、これらのプロパティを使用すると、ポップアップがボタンの移動を追跡できなくなります。
あなたが望むものを達成するためのいくつかの方法が思い浮かびます。
ボタンにカスタムをアタッチし、Adorner
その中にポップアップを配置します。欠点: ポップアップはボタンまたは周囲の要素に接続されていないため、それらからプロパティと DataContext を継承しません。
Adorner
ボタンにカスタムをアタッチします。この adorner は、ボタンが に対して相対的に移動したときに測定と配置の呼び出しを取得しAdornerLayer
、位置を手動で更新できるようにしますPopup
。AdornerDecorator
が相対的に移動しない限り(たとえば、それが Window の直接の子である場合)、 Window サイズの変化を監視することで移動Window
を簡単に検出できます。AdornerLayer
短所: コーディングと修正が複雑です。
a は一切使用しないでくださいPopup
。代わりに、幅と高さがゼロで目的の位置のa に<Grid>
沿ってボタンをラップします。<Canvas>
適切なZIndexを使用してポップアップの を<Canvas>
追加します。UserControl
キャンバスの端を越えて拡張されますが、これは WPF では問題ありません。コントロールを使用する代わりにPopup
、の可視性を制御するだけUserControl
です。短所: 他のすべてのオブジェクトの上に完全に表示されるわけではなく、ウィンドウの端からはみ出すことはできません (ただし、XBAP では問題にならない場合があります)。
自動更新されるかどうかはわかりませんが、PlacementTargetプロパティを使用すると、ポップアップを相対的に配置するコントロールを指定できます。それがうまくいかない場合は、おそらくCustomPopupPlacementCallbackでうまくいくでしょうか?