0

Я собираюсь реализовать диалоговое окно подтверждения в OnBackKeyPress. Это легко сделать с машинным окном сообщения:Windows Phone: как добавить пользовательский диалог подтверждения в OnBackKeyPress

protected override void OnBackKeyPress(CancelEventArgs e) 
{ 
    base.OnBackKeyPress(e); 

    MessageBoxResult result = MessageBox.Show("Text"); 

    if(result==MessageBoxResult.OK) 
    { 
    e.Cancel = true; 
    } 
} 

Это работает, но мне не нравится ограничение с двумя кнопками, так что я ищу что-то еще.

Я проверил WPtoolkit:

private bool m_cansel = false; 
protected override void OnBackKeyPress(CancelEventArgs e) 
{ 
    base.OnBackKeyPress(e); 

    if (!m_cansel) 
    { 
    e.Cancel = true; 
    m_cansel = true; 
    var messageBox = new CustomMessageBox 
     { 
     Title = "Title", 
     Message = "Message", 
     RightButtonContent = "aas", 
     IsLeftButtonEnabled = false, 
     }; 
    messageBox.Dismissed += (sender, args) => 
     { 
     }; 
    messageBox.Show(); 
    } 
} 

И Coding4Fun:

private bool m_cansel = false; 
protected override void OnBackKeyPress(CancelEventArgs e) 
{ 
    base.OnBackKeyPress(e); 

    if (!m_cansel) 
    { 
    e.Cancel = true; 
    m_cansel = true; 
    var messageBox = new MessagePrompt 
     { 
     Title = "Title", 
     Message = "Message", 
     }; 
    messageBox.Completed += (sender, args) => 
     { 
     //throw new NotImplementedException(); 
     }; 
    messageBox.Show(); 
} 

И выглядит хорошо, но не работают в OnBackKeyPress методе (шоу и сразу исчезают без моего поступка).

Кроме того, я попытался XNA:

private bool m_cansel = false; 
protected override void OnBackKeyPress(CancelEventArgs e) 
{ 
    base.OnBackKeyPress(e); 

    if (!m_cansel) 
    { 
    e.Cancel = true; 
    m_cansel = true; 
    Guide.BeginShowMessageBox("Version of Windows", "Pick a version of Windows.", 
           new List<string> {"Vista", "Seven"}, 0, MessageBoxIcon.Error, 
           asyncResult => 
           { 
            int? returned = Guide.EndShowMessageBox(asyncResult); 
           }, null); 
    } 
} 

Это работает, как я ожидал (имеют обычаи в OnBackKeyPress методы), но я не уверен, что с помощью XNA в Silverlight приложении является хорошей практикой.

Итак, я ищу способ использовать окна WPtoolkit или Coding4Fun внутри метода OnBackKeyPress или любое объяснение об использовании XNA внутри приложения Silverlight (любая рекомендация или информация об утверждении такого рода приложения магазином).

ответ

2

Просто используйте диспетчер, чтобы задержать MessageBox, пока вы не получите из события OnBackKeyPress, и он должен работать:

private bool m_cansel = false; 
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) 
{ 
    base.OnBackKeyPress(e); 

    if (!m_cansel) 
    { 
     e.Cancel = true; 
     m_cansel = true; 
     var messageBox = new CustomMessageBox 
      { 
       Title = "Title", 
       Message = "Message", 
       RightButtonContent = "aas", 
       IsLeftButtonEnabled = false, 
      }; 
     messageBox.Dismissed += (sender, args) => 
      { 
      }; 

     Dispatcher.BeginInvoke(messageBox.Show); 
    } 
} 

В качестве альтернативы, вы можете использовать событие BackKeyPress вместо переопределения метода OnBackKeyPress. Таким образом, вам не нужно использовать диспетчеру:

privatevoid Page_BackKeyPress(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    if (!m_cansel) 
    { 
     e.Cancel = true; 
     m_cansel = true; 
     var messageBox = new CustomMessageBox 
     { 
      Title = "Title", 
      Message = "Message", 
      RightButtonContent = "aas", 
      IsLeftButtonEnabled = false, 
     }; 
     messageBox.Dismissed += (s, args) => 
     { 
     }; 

     messageBox.Show(); 
    } 
} 

И в XAML:

BackKeyPress="Page_BackKeyPress" 
+0

Молодцы! Так просто так ясно. – RredCat