从main(Silverlight,C#)调用时,不会显示ChildWindow

时间:2011-11-10 04:11:47

标签: c# silverlight childwindow

我有一个Silverlight应用程序(编辑:一个具有提升信任的浏览器外应用程序),它必须打开一个ChildWindow(用于登录)。当我(尝试)从main(或主要调用的任何函数)调用事件时,使用下面的代码,没有任何反应。

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

我试过一个小的测试应用程序,它也没有工作。但后来我尝试从Button_Click事件中调用该事件......出乎意料,它有效!它也可以在DispatcherTimer调用时工作。

我想如果我在另一个帖子中启动它可能会有效但它没有解决问题......

非常感谢您的帮助!

菲利普

资料来源: Why Won't the Silverlight ChildWindow Display?

对于测试程序:www.philippebellefeuille.com/StackOverflow/8074918/BugChildWindowInMain.rar

1 个答案:

答案 0 :(得分: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将不会显示。

解决方案 - 等到页面加载完毕!

e.g。

public MainPage()
{
    InitializeComponent();
    this.Loaded += MainPage_Loaded;
}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    showdialog();
}