2013-01-07 2 views
2

Код для создания CustomMessageBox:CustomMessageBox с Windows Phone 8 Инструментарий броска NullPointerException

CustomMessageBox это свойство, а не ссылка на 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, которое является правильным.

Если пользователь решает вернуться, с Hardware кнопки Назад, приложение 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); 
    } 
} 

кто-нибудь знает, что делать?

ответ

2

Я нашел решение своей проблемы. Вместо того, чтобы использовать неисправный CustomMessageBox, я нашел Coding4Fun Windows Phone Toolkit, который предоставляет гораздо более стабильное окно с сообщением 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 является то, что вы не привязаны к двум статическим левых и правых кнопок как с CustomMessageBox.

И если вы хотите, вы можете установить свойство Body на совершенно новую страницу XAML, что делает этот элемент управления гибким.

Ссылка: Coding4Fun WP7 Message Prompt in depth

1

Разве эта проблема не имеет ничего общего с жизненным циклом приложения Windows Phone. Как можно найти here, figure 6. При активации другой программы, когда ваша программа активна, вы должны сохранить все данные приложения, чтобы повторное активирование, например, переключение с помощью кнопки «Назад» в приложение, снова запускает вашу программу, вы можете снова загрузить данные пользователя.

+0

Теперь я уже думаю, что я могу сделать, чтобы сохранить _property_ в данных приложения? – KristianB

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; 
    } 
}; 
+0

Это не сработало, к сожалению. Я думаю, @ user1767746 имеет точку; что приложение утилизируется при навигации от себя. – KristianB

1

My 0.02 $: это ошибка в CustomMessageBox. Они держат там много синглетов, и хорошая ошибка времени не делает этого мира добра. Согласился с KooKiz, что вы не можете обойтись без этого, не устанавливая CustomMessageBox или не дожидаясь завершения CustomMessageBox. Из моего ad-hoc-тестирования он должен находиться где-то между 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(); 
    } 
} 
+0

Я попытался использовать этот метод, и вот что происходит. Когда мой почтовый ящик запускает отклоненное событие, я перенаправляется на приложение SMS, которое правильно. Я возвращаюсь назад, чтобы вернуться в свое приложение. Вот забавная вещь: она кратко показывает мое приложение, а затем переключается обратно на приложение SMS, и я могу сделать это еще несколько раз, прежде чем приложение появится и останется на экране. – KristianB

+0

Правильно, не забудьте отменить регистрацию обработчика событий перед перенаправлением на SmsComposeTask. И зарегистрируйте этот обработчик событий только до вызова Show(). – JustinAngel

0

Проблема только происходит в WP8. Я использую тот же код в wp7, ничего плохого не происходит.

Использование Code4fun MessageBox является хорошим выбором, но кнопка Нажмите обработчик необходимо вызвать

MessagePrompt.Hide(); 

закрыть MessagePrompt.

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(); 
    }; 
0

Это известная ошибка. Он был исправлен в последней версии. Удалить ссылку и установить набор инструментов еще раз.