I looked at a couple options and samples out there. The thing that seems to work best for me is to “bump” one of the properties that causes the Popup to reposition itself on its own. The property that I used is HorizontalOffset.
I set it to (itself + 1) and then set it back the original value. I do this in an event handler that runs when the window is repositioned.
// Reference to the PlacementTarget.
DependencyObject myPopupPlacementTarget;
// Reference to the popup.
Popup myPopup;
Window w = Window.GetWindow(myPopupPlacementTarget);
if (null != w)
{
w.LocationChanged += delegate(object sender, EventArgs args)
{
var offset = myPopup.HorizontalOffset;
myPopup.HorizontalOffset = offset + 1;
myPopup.HorizontalOffset = offset;
};
}
When the window is moved, the popup will reposition. The subtle change in the HorizontalOffset is not noticed because the window and popup are already moving anyway.
I’m still evaluating whether a popup control is the best option in cases where the control stays open during other interaction. I’m thinking that Ray Burns suggestion to put this stuff in an Adorner layer seems like a good approach for some scenarios.