我正在使用Windows Phone的Silverlight工具包中的CustomMessageBox
控件。当通过suggested in the tutorials传递匿名回调(在MS中是“委托”吗?)时,我引用了在代码隐藏文件中定义的页面部分类的成员。这样可以构建和部署,但是当我在运行时达到逻辑时崩溃。
我从VS调试器中注意到,回调内的作用域仅包含来自页面局部类的XAML端的成员,而不包含来自代码隐藏文件的成员。这意味着我所指的成员不在范围内(即使Intellisense也可以)。而且我不能在回调中使用NavigationService.Navigate
。
如何从回调中调用包含类中的代码?
这是代码,
// This is a member of the partial class which inherits from
// PhoneApplicationPage
private void cancelBtn_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
if ((this.nameTextBox.Text != String.Empty) || (bool)this.protectCheckBox.IsChecked)
{
CustomMessageBox messageBox = new CustomMessageBox()
{
Caption = "Confirm leave page",
Message = "You have entered some profile data which will be lost if you leave this page. Are you sure you want to leave this page?",
LeftButtonContent = "no",
RightButtonContent = "yes"
};
messageBox.Dismissed += (s1, e1) =>
{
if (e1.Result == CustomMessageBoxResult.RightButton)
{
// Both of these raise an exception ...
GoToProfilePage();
//NavigationService.Navigate(new Uri("/View/MainPage.xaml", UriKind.Relative));
// Inspecting the debugger here shows only half the expected
// number of methods in the 'this' object - specifically only
// those defined in XAML
}
};
messageBox.Show();
}
else
{
// This works fine
GoToProfilePage();
}
}
其中
GoToProfilePage()
是代码隐藏文件中的方法。这是例外
System.NullReferenceException was unhandled
Message=NullReferenceException
StackTrace:
at Microsoft.Phone.Controls.CustomMessageBox.ClosePopup(Boolean restoreOriginalValues)
at Microsoft.Phone.Controls.CustomMessageBox.c__DisplayClass4.b__1(Object s, EventArgs e)
at Microsoft.Phone.Controls.Transition.OnCompleted(Object sender, EventArgs e)
at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
更新资料
看起来代码已执行,只有在委托完成后才引发null引用异常,因此作用域可能不是问题...
最佳答案
好想通了。 Windows Toolkit .dll(包括CustomMessageBox
)的最新版本在我的解决方案中需要参考。
显然有Windows Toolkit的较旧版本,它包含在默认引用中,因为ContextMenu和CustomMessageBox都至少部分地事先起作用,这非常令人困惑。
要添加更新的参考,我从源代码中的一个单独的项目中构建了.dll,并将其复制到了我的项目中。我从VS中的“引用”右键单击菜单添加了一个引用,并浏览到debug\bin
目录中的文件。
关于c# - 如何在CustomMessageBox Dismissed事件处理程序中使用NavigationService.Navigate?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13004196/