ChildWindow не будет отображаться при вызове с основного (Silverlight, C #) - PullRequest
3 голосов
/ 10 ноября 2011

У меня есть приложение Silverlight (редактирование: приложение вне браузера с повышенным доверием), которое должно открыть ChildWindow (для входа в систему). Когда я (пытаюсь) вызвать событие из основного (или любой функции, вызываемой в основном), с кодом ниже, ничего не происходит.

var credentials = new Credentials();
credentials.Closed += new EventHandler(Credentials_Closed);
credentials.Show();

Я пробовал с небольшим тестовым приложением, и оно тоже не работало. Но затем я попытался вызвать событие из события Button_Click ... сюрприз, он работает! Это также работает при вызове DispatcherTimer.

Я думал, может быть, это будет работать, если я запустил его в другом потоке, но это не решило проблему ...

Ваша помощь будет очень признательна!

Philippe

Источник: Почему не будет Silverlight ChildWindow Display?

Для тестовой программы: www.philippebellefeuille.com/StackOverflow/8074918/BugChildWindowInMain.rar

1 Ответ

4 голосов
/ 10 ноября 2011

Только что попробовал ваш пример, и это была проблема с потоками в пользовательском интерфейсе и "что-то еще"

Версия таймера работает нормально как есть (потому что 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();
}
...