2

を作成するためのコードCustomMessageBox:

CustomMessageBoxはプロパティであり、Toolkit の C# クラスへの参照ではありません。

CustomMessageBox.Dismissed += (dismissSender, dismissedEvent) =>
{
    switch (dismissedEvent.Result)
    {
        case CustomMessageBoxResult.LeftButton:
            PlaceCall(clickedFavorite.Name, clickedFavorite.PhoneNo);
            break;
        case CustomMessageBoxResult.RightButton:
            HERE ---> SendText(clickedFavorite.PhoneNo);
            break;
    }
};

メソッドのコードSendText():

private void SendText(String phoneNo)
{
    var smsTask = new SmsComposeTask
                      {
                          To = phoneNo
                      };

    smsTask.Show();
}

問題は、SmsComposeTaskが開始されると、電話が SMS アプリケーションに移動することです。これは正しいことです。

その後、ユーザーがハードウェアの [戻る] ボタンを使用して戻ることにした場合、SMS アプリケーションが閉じて、電話にアプリが再び表示されますが、NullPointerException が原因ですぐに閉じます。

   at Microsoft.Phone.Controls.CustomMessageBox.ClosePopup(Boolean restoreOriginalValues)
   at Microsoft.Phone.Controls.CustomMessageBox.<>c__DisplayClass4.<Dismiss>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)

OnBackKeyPress次のように、イベントをオーバーライドしようとしました。

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
    if (CustomMessageBox != null && CustomMessageBox.IsEnabled)
    {
        e.Cancel = true;
    }
    else
    {
        base.OnBackKeyPress(e);
    }
}

誰も何をすべきか知っていますか?

4

7 に答える 7

2

私は自分の問題の解決策を見つけました。faultyを使用する代わりに、はるかに安定したメッセージ ボックスを提供するCoding4Fun Windows Phone ToolkitCustomMessageBoxを見つけました。使用方法は次のとおりです。MessagePrompt

ボタンを作成する

var smsButton = new Button { Content = "SMS" };
smsButton.Click += (o, args) =>
{
    // do something
};

var buttonList = new List<Button>
{
    smsButton
};

実際のメッセージ プロンプトを作成する

var msgPrompt = new MessagePrompt
{
    Title = "Message Prompt Title",
    Body = new TextBlock { Text = "Text for the Body", FontSize = 25, TextWrapping = TextWrapping.Wrap },
    ActionPopUpButtons = buttonList
};

それを示す

msgPrompt.Show()

雄牛なし

これで私が経験した良いことは、 のMessagePromptように 2 つの静的なボタンとボタンに拘束されないことですCustomMessageBox

また、必要に応じて、Bodyプロパティをまったく新しい XAML ページに設定して、このコントロールを柔軟にすることもできます。

参照: Coding4Fun WP7 メッセージ プロンプトの詳細

于 2013-01-09T12:40:29.340 に答える
1

私の0.02$:これはCustomMessageBoxのバグです。彼らはそこでたくさんのシングルトンを生き続けています、そして良いタイミングのバグはそれを良い世界にしません。CustomMessageBoxを修正するか、CustomMessageBoxが終了するまで待つことなく、これを回避することはできないというKooKizに同意しました。私のアドホックテストから、これらのアクションが完了するまで、2〜6のDispatcher.BeginInvoke()が必要です。代わりに、DispatcherTimerの使用を検討し、十分な時間である256MSを待つことを検討してください。

private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    var msgBox = new CustomMessageBox()
                 {
                     Caption = "foo",
                     Message = "bar",
                     LeftButtonContent = "baz",
                     RightButtonContent = "goo",
                     IsFullScreen = false,

                 };


    msgBox.Dismissed += (s, args) =>
    {
        DispatcherTimerHelper.InvokeReallySoon(() =>
        {
            new SmsComposeTask()
            {
                Body = "foo",
                To = "bar"
            }.Show();
        });

    };

    msgBox.Show();
}


public static class DispatcherTimerHelper
{
    public static void InvokeReallySoon(Action action)
    {
        var t = new DispatcherTimer() {Interval = TimeSpan.FromMilliseconds(256)};
        t.Tick += (s, args) => action();
        t.Start();
    }
} 
于 2013-01-09T01:15:01.300 に答える
1

この問題は、Windows Phone アプリケーションのライフサイクルに関係していませんか。ここにあるように、図 6 . プログラムがアクティブなときに別のプログラムをアクティブ化する場合は、すべてのアプリケーション データを保存する必要があります。これにより、[戻る] ボタンでアプリケーションに戻るなどの再アクティブ化イベントが発生したときに、プログラムが再び開始され、ユーザーのデータを再度ロードできるようになります。

于 2013-01-07T09:50:33.760 に答える
1

何が起こっているのかわかりませんが、SMS タスクを遅らせて問題を回避できます。

CustomMessageBox.Dismissed += (dismissSender, dismissedEvent) =>
{
    switch (dismissedEvent.Result)
    {
        case CustomMessageBoxResult.LeftButton:
            PlaceCall(clickedFavorite.Name, clickedFavorite.PhoneNo);
            break;
        case CustomMessageBoxResult.RightButton:
            Dispatcher.BeginInvoke(new Action(() => SendText(clickedFavorite.PhoneNo)));
            break;
    }
};
于 2013-01-07T10:00:13.870 に答える
0

問題はwp8で発生します。wp7で同じコードを使用していますが、何も問題はありません。

Code4funメッセージボックスを使用するのは良い選択ですが、ボタンクリックハンドラを呼び出す必要があります

  MessagePrompt.Hide();

MessagePrompt を閉じます。

于 2013-05-08T13:11:24.567 に答える
0

却下されたイベントでブール値を使用して、どのボタンが押されたかを定義しました。次に、代わりに Unloaded イベントの却下イベントに実装するコードを実装しました。これで問題は解決したようです。

すなわち

    messageBox.Dismissed += (s1, e1) =>
    {
        switch (e1.Result)
        {
            case CustomMessageBoxResult.LeftButton:
                {
                    delete = true ;
                }
                break;
            case CustomMessageBoxResult.RightButton:
                break;
            case CustomMessageBoxResult.None:
                break;
            default:
                break;
        }
    };

    messageBox.Unloaded += (s1, e1) =>
    {
        if (delete)
            DeleteWorkout();
    };
于 2013-06-18T21:43:43.700 に答える