【问题标题】:ChildWindow won't display when call from the main(Silverlight, C#)从主调用时不会显示 ChildWindow(Silverlight,C#)
【发布时间】:2011-11-10 04:11:46
【问题描述】:

我有一个 Silverlight 应用程序(编辑:一个具有提升信任的浏览器外应用程序),它必须打开一个 ChildWindow(用于登录目的)。当我(尝试)从 main(或 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

【问题讨论】:

    标签: c# silverlight childwindow


    【解决方案1】:

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

    【讨论】:

    • 您好!谢谢你的回答。我的应用程序已经 OOB,我需要提高信任度。
    • 安全限制真的适用于 ChildWindows 吗?我正在使用 Prism 和 Commands 来显示 ChildWindows,并且显示它们没有问题。即使在调用 DomainService 操作并显示可能的错误消息之后。我知道对话框的限制。
    • 我刚刚在 DispatcherTimer 中尝试过,子窗口显示正确。看来问题是我尝试在 Main 中打开它。
    • 欢迎您通过我的网站(在用户页面上)向我发送代码以进行测试。我现在更加好奇为什么这会失败,但没有足够的细节继续下去。
    • @Philippe:已排序。后位相当明显。感谢您提供一个非常方便的示例。这总是让测试变得容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多