2

CustomMessageBoxSilverlight Toolkit for Windows Phoneのコントロールを使用しています。チュートリアルで提案されているように、匿名のコールバック (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 参照例外が発生するのはデリゲートが終了したときだけなので、スコープの問題ではない可能性があります...

4

2 に答える 2

1

わかりました。Windows Toolkit .dll (を含むCustomMessageBox) の最新ビルドには、私のソリューションでの参照が必要でした。

ContextMenu と CustomMessageBox の両方が事前に少なくとも部分的に機能していたため、デフォルトの参照のどこかに含まれている古いバージョンの Windows Toolkit があり、非常に混乱しています...

更新された参照を追加するために、別のプロジェクトでソースから .dll をビルドし、それを自分のプロジェクトにコピーしました。VS の [参照] 右クリック メニューから参照を追加し、debug\binディレクトリ内のファイルを参照しました。

于 2012-10-22T14:43:00.110 に答える
1

簡単なハックは、ツールキットのソース コードで CustomMessageBox.cs ファイルの 657 行目をコメント化し、再度コンパイルすることです。次に、アプリでこの新しい dll を参照します。

...
private void ClosePopup(bool restoreOriginalValues)
        {
            // Remove the popup.

            _popup.IsOpen = false;
            //_popup = null; <-- THIS IS LINE 657
...

http://phone.codeplex.com/workitem/10575に投稿された問題があります

于 2012-11-12T23:01:22.803 に答える