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

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

最佳答案

刚刚尝试了您的示例,它既是 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();
}

关于c# - 从 main(Silverlight, C#) 调用时不会显示 ChildWindow,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8074918/

10-12 05:38