Я закончил тем, что создал базовый класс всплывающих окон и добавил этот код в:
private void HookIntoPage()
{
if (UserControlHelper.RootVisual != null)
{
PhoneApplicationPage page = (PhoneApplicationPage)UserControlHelper.RootVisual.Content;
// Hook up into the back key press event of the current page
page.BackKeyPress += BackKeyPress;
FrameworkElement element = page.FindVisualChild("MainGrid");
if (element != null && element is Grid)
{
Grid grid = element as Grid;
grid.Children.Add(this);
}
else
{
throw new Exception("Popup cannot find MainGrid");
}
}
}
Он немного жестко запрограммирован, поскольку ищет элемент управления сеткой MainGrid. Это можно улучшить, чтобы найти подходящий контейнер верхнего уровня.
Здесь есть 2 вспомогательных класса. UserControlHelper имеет следующие методы:
public static PhoneApplicationFrame RootVisual
{
get
{
return Application.Current == null ? null : Application.Current.RootVisual as PhoneApplicationFrame;
}
}
FindVisualChild происходит от класса VisualTreeHelperExtension, который поставляется с Phone7.Fx.preview, который я использую для его привязываемой панели приложений.