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