gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:41:45 25 4
gpt4 key购买 nike

我有一个 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

最佳答案

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com