我有一个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
答案 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();
}