Windows Phone内置的MessageBox弹出窗口局限性太大,不能满足各种个性化的弹出窗口的需求,即使使用第三方的控件库也会有一些局限性,又或者封装的东西太多了,那么这时候就需要自己去根据自己的需求去自定义一个弹出窗口了。
大概的原理就是使用Popup控件来实现弹出窗的效果,Popup控件可以把包含在其中的控件显示在最外面,从而可以把当前页面的控件都给盖住了,再加点半透明的效果,若隐若现的,一个弹窗就出来了。好吧,下面来看一下Demo。
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Controls.Primitives;
using Microsoft.Phone.Controls;
namespace MessageControl
{
public class MyMessage : ContentControl
{
private System.Windows.Controls.ContentPresenter body;
private System.Windows.Shapes.Rectangle backgroundRect;
private object content;
public MyMessage()
{
//这将类的styleKey设置为MyMessage,这样在模板中的style才能通过TargetType="local:MyMessage"与之相互绑定
this.DefaultStyleKey =
typeof(MyMessage);
}
//重写OnApplyTemplate()方法获取模板样式的子控件
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.body =
this.GetTemplateChild(
"body")
as ContentPresenter;
this.backgroundRect =
this.GetTemplateChild(
"backgroundRect")
as Rectangle;
InitializeMessagePrompt();
}
//使用Popup控件来制作弹窗
internal Popup ChildWindowPopup
{
get;
private set;
}
//获取当前应用程序的UI框架PhoneApplicationFrame
private static PhoneApplicationFrame RootVisual
{
get {
return Application.Current ==
null ?
null : Application.Current.RootVisual
as PhoneApplicationFrame;
}
}
//弹窗的内容,定义为object,可以赋值为各种各样的控件
public object MessageContent
{
get {
return this.content;
}
set {
this.content = value;
}
}
//隐藏弹窗
public void Hide()
{
if (
this.body !=
null)
{
//关闭Popup控件
this.ChildWindowPopup.IsOpen =
false;
}
}
//判断弹窗是否打开
public bool IsOpen
{
get {
return ChildWindowPopup !=
null && ChildWindowPopup.IsOpen;
}
}
//打开弹窗
public void Show()
{
if (
this.ChildWindowPopup ==
null)
{
this.ChildWindowPopup =
new Popup();
this.ChildWindowPopup.Child =
this;
}
if (
this.ChildWindowPopup !=
null && Application.Current.RootVisual !=
null)
{
InitializeMessagePrompt();
this.ChildWindowPopup.IsOpen =
true;
}
}
//初始化弹窗
private void InitializeMessagePrompt()
{
if (
this.body ==
null)
return;
this.backgroundRect.Visibility = System.Windows.Visibility.Visible;
//把模板中得body控件内容赋值为你传过来的控件
this.body.Content = MessageContent;
this.Height =
800;
}
}
}
using System.Windows;
using System.Windows.Controls;
namespace TestMessageControl
{
public partial class WindowsPhoneControl1 : UserControl
{
public WindowsPhoneControl1()
{
InitializeComponent();
}
private void button2_Click(
object sender, RoutedEventArgs e)
{
(App.Current
as App).myMessage.Hide();
}
}
}
namespace TestMessageControl
{
public partial class App : Application
{
……
public MyMessage myMessage =
new MyMessage { MessageContent =
new WindowsPhoneControl1() };
……
}
}
using Microsoft.Phone.Controls;
using MessageControl;
namespace TestMessageControl
{
public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
}
private void button1_Click(
object sender, RoutedEventArgs e)
{
(App.Current
as App).myMessage.Show();
}
}
}