从主窗口调用ChildWindow时无法显示(Silverlight,C#)

3

我有一个Silverlight应用程序(编辑:一个带有提升的离线应用程序),它必须打开一个ChildWindow(用于登录目的)。当我从主函数(或任何在主函数中调用的函数)调用下面的代码时,什么也不会发生。

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

我尝试了一个小的测试应用程序,也没有起作用。但是当我试图从Button_Click事件中调用事件时......惊奇的是,它起作用了!当通过DispatcherTimer调用时,它也可以工作。

我认为也许在另一个线程中启动它会解决问题,但实际上并没有解决......

非常感谢您的帮助!

Philippe

来源: 为什么 Silverlight ChildWindow 没有显示?

测试程序下载地址:www.philippebellefeuille.com/StackOverflow/8074918/BugChildWindowInMain.rar

1个回答

4

我刚试了你的示例,发现既存在UI线程问题,又存在其他问题 :)

计时器版本已经可以正常工作(因为ShowDialog是延迟的)。

新线程版本由于线程问题而失败。我使用了我的老助手方法(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();
}

你好!感谢您的回答。我的应用程序已经是OOB,并且我需要提升信任级别。 - Philippe
1
ChildWindows是否真的受到安全限制?我正在使用Prism和Commands来显示ChildWindows,我没有显示它们的问题。即使在调用DomainService操作并显示可能的错误消息之后也是如此。我知道对话框有限制。 - Jehof
1
欢迎通过我的网站(用户页面)向我发送代码进行测试。现在我更加好奇为什么会失败,但是没有足够的细节可以依据。 - iCollect.it Ltd
1
@Philippe:已排序。回过头来看非常明显。感谢提供如此方便的示例,这使得测试变得容易。 - iCollect.it Ltd
非常感谢!解释非常有帮助和详尽。我真的很感激! - Philippe
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接