Ваша проблема в том, что когда вы определяете PopUp
и его содержимое внутри App.xaml Resources
, вы назначаете его визуальному дереву, отличному от того, которое отображается на вашей странице. Установка свойства IsOpen
для истинных произведений недостаточна для того, чтобы фактически сделать его видимым, необходимо добавить PopUp
к текущему визуальному дереву.
Здесь возникает ваша вторая проблема, поскольку PopUp
уже имеет Parent
, вы не можете добавить его непосредственно на свою страницу, потому что вы получите InvalidOperationException
.
Вот возможное решение:
popup = App.Current.Resources["popup"] as Popup;
App.Current.Resources.Remove("popup"); // remove the PopUp from the Resource and thus clear his Parent property
ContentPanel.Children.Add(popup); // add the PopUp to a container inside your page visual tree
popup.IsOpen = true;
Помните, что таким образом у вас больше не будет ссылки в словаре ресурсов вашего приложения, и если вы попытаетесь выполнить последующий вызов этого метода, произойдет сбой из-за исключения NullReferenceException. Опять же, немного кода, вы можете исправить это и добавить всплывающее окно обратно к ресурсам, когда вы закрываете его:
popup.IsOpen = false; // локальная ссылка на ваше всплывающее окно, сохраненное ранее
ContentPanel.Children.Remove (всплывающее окно); // удалить из текущего визуального дерева
App.Current.Resources.Add ("popup", popup); // добавить его обратно к ресурсам
Несмотря на то, что этот код работает, и вы можете правильно отобразить всплывающее окно, я думаю, что это немного излишне только для PopUp
, который вы можете определить на своей странице и просто сделать его видимым, изменив свойство IsOpen
.