如何使用App.xaml资源中定义的Popup?

Kat*_*own 3 windows-phone-7

我在App.xaml资源中定义了一个弹出窗口:

<Application.Resources>
        <Popup x:Key="popup">
            //some content here
        </Popup>
   </Application.Resources>
Run Code Online (Sandbox Code Playgroud)

我想以这种方式使用它:

                    Popup popup = this.Resources["popup"] as Popup;
                    popup.IsOpen = true;
Run Code Online (Sandbox Code Playgroud)

出于某种原因,弹出窗口没有显示?任何帮助都非常感谢.

Ste*_*ssi 5

您的问题是,当您PopUp在App.xaml中定义及其内容时Resources,您将其分配给与页面上显示的树不同的可视树.将IsOpen属性设置为true works不足以实际使其可见,您必须将其添加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;
Run Code Online (Sandbox Code Playgroud)

请注意,这样您不再在App的Resource字典中引用它,如果您尝试后续调用此方法,它将因NullReferenceException而失败.再次,通过一些代码,您可以解决此问题,并在关闭它时将PopUp添加回资源:

popup.IsOpen = false; //在ContentPanel.Children.Remove(popup)之前存储的PopUp的本地引用; //从当前可视树中删除App.Current.Resources.Add("popup",popup); //将它添加回资源

虽然这段代码可以正常工作,你可以正确显示你的PopUp,但我觉得这有点过分,只是PopUp你可以在你的页面内部实际定义,只需通过更改IsOpen属性使其可见即可.