2009-06-10 8 views
3

Ich schreibe ein XBAP mit einem komplexen Popup (Canvas Z-Index von 99 mit einem Raster darauf ...), das ich an den Button "anhängen" möchte öffnet es und folgt dem Knopf, wohin auch immer er auf dem Bildschirm geht. Wenn sich die Schaltfläche beispielsweise in einer ListBox oder einem XamDataGrid befindet, möchte ich, dass das Popup beim Durchblättern der Schaltfläche folgt. Wenn es unter einem Expander ist, möchte ich, dass es an der Taste bleibt, wenn der Expander es zwingt, sich zu bewegen, usw.Binden eines Popups an die relative Bildschirmposition eines anderen Steuerelements

Irgendwelche Ideen?

Antwort

0

Ich bin mir nicht sicher, ob es automatisch für Sie aktualisiert wird oder nicht, aber die Eigenschaft PlacementTarget ermöglicht es Ihnen, ein Steuerelement anzugeben, um das Popup relativ zu positionieren. Wenn das nicht funktioniert, dann wird vielleicht CustomPopupPlacementCallback den Trick machen?

7

Bei Verwendung eines Popup wird weder PlacementTarget noch CustomPopupPlacementCallback verwendet, nachdem das Popup ursprünglich erschienen ist. Jede Verwendung dieser Eigenschaften ermöglicht es dem Popup nicht, die Schaltfläche beim Verschieben zu verfolgen.

Mehrere Möglichkeiten fallen mir zu erreichen, was Sie sich wünschen:

  1. eine benutzerdefinierte Attach Adorner auf die Taste und setzen Sie das Popup in seinem Inneren. Nachteil: Popup ist nicht mit Button oder umgebenden Elementen verbunden, so dass es keine Eigenschaften & DataContext von ihnen erbt.

  2. Schließen Sie eine benutzerdefinierte Adorner an die Schaltfläche an. Dieser Adorner wird messen und ordnen Anrufe, wenn die Schaltfläche relativ zum AdornerLayer bewegt, so dass Sie die Popup Position manuell aktualisieren können. Solange sich Ihr AdornerDecorator nicht relativ zu Ihrem Window bewegt (z. B. wenn es sich um das direkte Kind des Fensters handelt), können Sie leicht erkennen, dass AdornerLayer verschoben wird, indem Sie Änderungen an der Fenstergröße überwachen. Nachteil: Komplex zum Code & bekommen Sie Recht.

  3. Verwenden Sie keinen Popup überhaupt. Wickeln Sie stattdessen die Taste in eine <Grid> neben einer <Canvas> mit Null Breite und Höhe und die gewünschte Position. Innerhalb der <Canvas> fügen Sie die UserControl für das Popup mit einem geeigneten ZIndex. Es erstreckt sich über die Kante des Canvas hinaus, was in WPF gut funktioniert. Anstatt eine Popup Steuerung zu verwenden, kontrollieren Sie einfach die Sichtbarkeit des UserControl. Nachteil: Wird nicht wirklich ganz oben auf allen anderen Objekten sein, kann nicht über den Rand des Fensters hinausragen (ist aber möglicherweise kein Problem für XBAP).