关键词:WP7开发;自定义控件;自定义窗口;MessagePrompt
今天与大家分享一下WP7开发中如何使用自定义的弹出窗口,为MessageBox寻找一种替代方案。
两种方法:
1. 使用Coding4Fun提供的MessagePrompt(本人比较推荐这种方法);
2. 自定义UserControl,自己设计窗口布局。
本人在上述两种方案中间选择了前者作为MessageBox的替换方案,原因是简单,可定制性也比较强,可以很容易地将MessageBox替换为MessagePrompt.下面详细讲述。
1. 使用Coding4Fun提供的MessagePrompt
先决条件:下载Coding4Fun并添加对Coding4Fun.Toolkit.Controls的引用,如下图所示。(如果不知道怎么做,可随意参考一篇网上的教程,类似的教程非常多。)
下载地址:http://coding4fun.codeplex.com/
下面讲述MessagePrompt的使用方法。
必要的命名空间:
using Coding4Fun.Toolkit.Controls;
在你需要的地方,或者原先工程代码中有MessageBox的地方,参考如下代码段使用MessagePrompt:
private void button_Click(object sender, RoutedEventArgs e) //新建
{
var MymsgPrompt = new MessagePrompt
{
Title = "Notice", //标题
Body = new TextBlock //body,可定制性非常强,可以设置文字颜色,大小,换行方式等等
{
Text = "I'm MessagePrompt ^_^",
Foreground = new SolidColorBrush(Colors.White),
FontSize = 25,
TextWrapping = TextWrapping.Wrap
},
Background = new SolidColorBrush(Colors.Purple), //消息框的背景色
HorizontalAlignment = System.Windows.HorizontalAlignment.Center, //对齐方式
Width = 500, //消息框的宽度
IsAppBarVisible = true, //true表示保留OK按钮,没有这个语句,OK按钮也是会默认保留的
IsCancelVisible = true //true表示保留Cancel按钮
};
MymsgPrompt.Completed += stringObject_Completed; //该函数用来处理用户点击OK按钮或Cancel按钮的事件
MymsgPrompt.Show(); //显示如上样式的MessagePrompt
}
void stringObject_Completed(object sender, PopUpEventArgs<string, PopUpResult> e)
{
if (e.PopUpResult == PopUpResult.Ok)
{
//用户点击OK按钮时要进行的事情
}
else if (e.PopUpResult == PopUpResult.Cancelled)
{
//用户点击Cancel按钮时要进行的事情
}
}
看看效果图吧!怎么样,是不是比MessageBox漂亮了许多,此外,这个窗口在出现和消失的时候还带有动画效果哦!
上面是通过使用Coding4Fun中提供的MessagePrompt实现自定义弹出窗口。使用起来非常非常简单,在任何想用的地方将上述代码段贴过去,按照自己的喜好修改一下即可!
还有一种通过自定义控件实现自定义弹出窗口的方法。下面借着网上的一篇博文进行补充讲述,这个博文我刚开始看的时候,最大的感触是:讲的不够清楚。后来经过摸索才发现是怎么回事。如果原文作者认为我直接借着您的文章进行发挥不太妥,请通知我,我会即刻进行处理。
2. 自定义UserControl,自己设计窗口布局
原博文的链接地址:http://www.cnblogs.com/linzheng/archive/2012/03/20/2409071.html
首先要感谢原文作者加菲猫的分享,让我最终学习了这种实现方法。
但是原文中有些地方讲述的不清楚,导致一些读者看了之后,反映说是照着博主的代码做会报错。下面我讲述一下如何使用博主提供的代码。
(1)如何建立工程
大家可以看到上述链接中的文章所显示的图片中有2个项目,其中一个是Windows Phone应用程序项目,一个是Windows Phone类库项目。大家在新建项目的时候,可以先建立应用程序项目TestMessageControl,然后在解决方案资源管理器中,右键点击,并选择“添加”--->"新建项目",再选择新建Windows Phone类库项目即可,如下图所示。至此,两个项目就建立好了。按照原博文把代码贴进去。注意:Themes下面的Generic.xaml.cs是空白的。
2. 设置项目的依赖关系
很多读者表示,按照原博文的代码去做,会有“找不到这,找不到那”的报错。原因在于:还需要在TestMessageControl中添加对MessageControl的引用。具体做法如下:
如上图所示,右击“解决方案”,在菜单中选择“项目依赖项”,在弹出的“项目依赖项”窗口中按下图进行设置,即:项目TestMessageControl要依赖于MessageControl。
接着,在项目TestMessageControl下的“引用”一项上点击鼠标右键,选择“添加引用”,并在弹出的“添加引用”窗口中点击“项目”选项卡,选择MessageControl,确定!
如果你完成了如上步骤,再去运行原博文的代码,你会发现所有的报错都木有了!
后记:
对比上述两种方法,我更喜欢第一种。因为简单,所以喜欢^_^
事实上,在实践第二种方法的过程中,我遇到2个很困惑的问题:
问题一:当用户点击自定义窗口中的“是”或者“OK”按钮的时候,应该如何处理该事件?
因为对这个事件的处理是放在用户自定义控件页面对应的代码文件WindowsPhoneControl1.xaml.cs中的,显然在这个地方是无法处理使用了自定义窗口的页面上的event的。
问题二:每个自定义弹出窗口上只能显示特定的提示字符串,如果我需要多个弹出窗口且要显示不同的字符串,我应该如何操作?
显然,对每一种窗口单独进行一次定制,这样的方法可行,但是不符合工程规范。有没有更有效的办法呢?
上述两个问题,如果亲爱的读者您懂得,希望不吝告之,先谢过了!