Windows Phone 7 的 MessageBox.Show

7

我需要一个MessageBox.Show(),但是它需要扩展功能:Windows Phone 7内置的消息框只能显示确定或取消按钮,我需要例如YesNo等其他选项。我需要一个Show方法,只有当用户点击按钮时它才会返回。我尝试自己制作弹出框,但问题是它是异步的,因为在WP7中UI线程中的所有内容都是异步的,而且我不能阻止UI线程,因为UI线程还负责处理按钮点击事件。我看到了一个WP7的ChildWindow示例,但那也是异步的,我必须有一个Show()方法,只有当用户点击时才返回。有什么建议吗?某种形式的DoEvents()可以帮助我很多,但在WP7中没有这样的方法:(

3个回答

6
你可以使用XNA的Guide.BeginShowMessageBox()来显示一个带有自定义按钮的消息框。这里有一个关于如何使用它的教程。
请注意,MessageBoxIcon参数在WP7上不会选择图标,而是在消息框显示时选择通知声音。 编辑: 糟糕,我在发布之前没有阅读你同步需求。也许你可以设置一个标志来停止你想要防止运行的任何东西,并在用户做出选择后重置它。

是的,但我最大的问题是必须使用一个仅在按钮被点击时才返回的方法。我可以使用定时器等待点击事件,并在超时事件处理程序中继续程序,如果满足条件,但我无法想出如何在一个方法中实现这一点 :( - Vic
AutoResetEvent waitHandle = new AutoResetEvent(false); Guide.BeginShowMessageBox("Windows版本", "选择一个Windows版本.", new List<string> { "Vista", "Seven" }, 0, MessageBoxIcon.Error, asyncResult => { int? returned = Guide.EndShowMessageBox(asyncResult); waitHandle.Set(); }, null); waitHandle.WaitOne();这不会阻塞UI线程!谢谢 :) - Vic
感谢您发布解决方案。 - Praetorian
1
@Vic:必须引用Xna来满足如此基本的要求,这似乎有些可惜。这是由于您的代码需要在等待UI事件时阻塞。您确定不能以其他方式编写代码吗? - AnthonyWJones
代码很复杂,这是一个多平台框架,例如在不同的平台上必须以以下方式实现MessageBox.Show():它必须返回结果(按下按钮的文本)。为了实现这一点,需要两个线程和线程同步,因为Show()必须阻止程序以便能够返回结果。我知道这很遗憾,但我不知道其他解决方案,如果您知道,请告诉我。 - Vic

2

我在寻找类似的东西时发现了这个,但最终还是使用了内置的消息框。它肯定可以让你拥有自定义按钮的能力。

Windows Phone 7自定义消息框


谢谢您的回复,但是在这个解决方案中,Show() 部分并不满足要求,只有任意按钮部分;如果我修改为:NotificationBox.Show("Exit","Are you sure?", new NotificationBoxCommand("Yes", () => { }), new NotificationBoxCommand("No", () => { }));变成:AutoResetEvent waitHandle = new AutoResetEvent(false); NotificationBox.Show("Exit","Are you sure?", new NotificationBoxCommand("Yes", () => { waitHandle.Set(); }), new NotificationBoxCommand("No", () => { waitHandle.Set(); })); waitHandle.WaitOne();...那么我就会遇到死锁问题,这就是我的问题 :( - Vic

1
使用一个包含你想要的所有内容的画布。然后只需使用可见性属性将其弹出即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接