Только что попробовал ваш пример, и это была проблема с потоками в пользовательском интерфейсе и "что-то еще"
Версия таймера работает нормально как есть (потому что ShowDialog откладывается).
Версия newthread не работает из-за многопоточности. Получил работу, используя мой старый любимый вспомогательный метод (OnUiThread). Опять же, это сработало только потому, что ShowDialog откладывается:
protected delegate void OnUiThreadDelegate();
protected void OnUiThread(OnUiThreadDelegate onUiThreadDelegate)
{
if (Deployment.Current.Dispatcher.CheckAccess())
{
onUiThreadDelegate();
}
else
{
Deployment.Current.Dispatcher.BeginInvoke(onUiThreadDelegate);
}
}
с таким звонком:
private void showdialog()
{
this.OnUiThread(() =>
{
var credentials = new Credentials();
credentials.Closed += new EventHandler(Credentials_Closed);
credentials.Show();
});
}
Прямой вызов интересен, поскольку он просто не работает, даже если вы используете showDialog выше.
Причина заключается в следующем ...
App.xaml.cs делает это:
this.RootVisual = new MainPage();
Это означает, что MainPage не является частью визуального дерева, пока не вернется конструктор! Если родительский элемент ChildWindow отсутствует в визуальном дереве, то ChildWindow не будет отображаться.
Решение - дождитесь загрузки страницы!
, например
public MainPage()
{
InitializeComponent();
this.Loaded += MainPage_Loaded;
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
showdialog();
}