3

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

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

我尝试了一个小型测试应用程序,但它也无法正常工作。但是后来我尝试从 Button_Click 事件中调用该事件......令人惊讶的是,它有效!当被 DispatcherTimer 调用时,它也可以工作。

我想如果我在另一个线程中启动它可能会起作用,但它并没有解决问题......

您的帮助将不胜感激!

菲利普

来源: 为什么 Silverlight ChildWindow 不显示?

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

4

1 回答 1

4

刚刚尝试了您的示例,它既是 UI 线程问题又是“其他问题”:)

计时器版本按原样工作正常(因为 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();
}
于 2011-11-10T09:24:50.170 回答