3

ChildWindow (ログイン目的) を開く必要がある Silverlight アプリケーション (編集: 昇格された信頼を持つブラウザー外アプリケーション) があります。以下のコードを使用して、メイン (またはメインで呼び出される任意の関数) からイベントを呼び出そうとすると、何も起こりません。

var credentials = new Credentials();
credentials.Closed += new EventHandler(Credentials_Closed);
credentials.Show();

小さなテストアプリケーションで試してみましたが、うまくいきませんでした。しかし、次に Button_Click イベントからイベントを呼び出そうとしました... 驚き、うまくいきました! DispatcherTimer によって呼び出された場合にも機能します。

別のスレッドで開始すればうまくいくかもしれないと思ったのですが、問題は解決しませんでした...

あなたの助けは非常に高く評価されます!

フィリップ

出典 : Silverlight の ChildWindow が表示されないのはなぜですか?

テスト プログラムの場合: www.philippebellefeuille.com/StackOverflow/8074918/BugChildWindowInMain.rar

4

1 に答える 1

4

サンプルを試してみましたが、それは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();
}
于 2011-11-10T09:24:50.170 に答える