2011-01-18 8 views
2

これをSilverlight.net(here)に投稿しました。私は、回答が得られなかったので、どのように負荷が他の人と同様に働くかについて、彼らは困惑していると思います。Silverlight Loadedイベントはどのように機能しますか?

見つかったMSDNのドキュメント:

Loadedの代わりにLayoutUpdatedを処理できます。 LayoutUpdatedは、最後の"オブジェクトの有効期間は"で、Silverlight UIでコントロールを有効にする順序です。 LayoutUpdatedの主な制限は、初期化がLayoutUpdatedが呼び出される唯一の時間ではない可能性があることです。

(質問1)上記の文の逆数は、Loadedイベントは一度しか上げることが頼ることができることを意味します。  これは正しいですか?

上記のMSDNドキュメントでは、(ロードされたイベントに関して)

が生成され、オブジェクトツリーに追加されたときに発生します。 (FrameworkElementから継承されます。)

上記のステートメントは、ここで参照されている問題を調整しようとしている文書で繰り返し強調されています。

Loadedイベントの詳細ドキュメントの内容は次のとおりです。

Silverlightでは、Loadedイベントがテンプレートの適用後に発生することは保証されていません。あなたは比較的一般的な制御シナリオのためのLoadedイベントを使用している場合、これはあなたのために問題になる可能性があります:あなたはビジュアルツリーを調べたい...

(質問2)これは非常に混乱しています。  (上記の2つのステートメントは矛盾しています)または(FrameworkElementを構築してオブジェクトツリーに追加し、テンプレートが適用されていない可能性があります)。   2番目のmsdnステートメントがビジュアルツリーを参照しているため、後者の可能性は低いです。  これらの記述のどれが正しいかを明確にしてください。 "は、以前に発生する可能性があることを意味するか、まったく発生しないことを意味しますか?" "

答えて

3

Loadedイベントは、オブジェクトツリーからオブジェクトを削除して後で再追加しない限り、すべてが再び発生しない限り、1回だけ発生します。

テンプレートを適用する前にLoadedイベントが発生する可能性があることを確認できます。この理由だけで、私はすべてのテンプレートと視覚的なツリーの検査操作を、最後の分の初期化を含めて、OnApplyTemplate()で行います。

"後に発生することは保証されていません"とは、操作の順序を指します。はい。オブジェクトがオブジェクトツリーに追加された後、常にロードされます。

+0

サンダーさん、ありがとうございました。ありがとうございました。 MSのドキュメントには、「各時間にフレームワーク要素がビジュアルツリーに追加されます」というメッセージが表示されるはずです ポップアップコントロールを使用しているメニューコントロールがあります。私は明示的にビジュアルツリーから削除しませんが、 visibiliyがトグルされています(popup.isvisibleはfalseに設定されています)。いずれの場合でも、ロードされたイベントは複数回発生しています。 しかし、2回目に私はこのエラーを受け取ります: "要素は既に別の要素の子です"。これは私にbeleiveにつながる 私は何が起こっているのか分からないので、それは視覚的な木から削除されていません。 – user579342

+0

興味深い。おそらくあなたのシナリオでは、コントロール自体ではなく、オブジェクトツリー内で祖先が移動している可能性があります。これにより、あなたのコントロール(およびツリーの一部の再追加されたすべての他のもの)がLoadedイベントを発生させます。正確にエラーが発生している場所(何が呼び出されているか、いつ呼び出されているか)に関する詳細情報がある場合、私はさらに助けてくれるかもしれません。 – Sander

+0

また、Unloadedイベントを処理することをお勧めします。これは、オブジェクトがツリーから(そして何によって)削除されたかについての手がかりを与えるかもしれません。オブジェクトまたは祖先がオブジェクトツリーから削除されるたびに、アンロードされます。 – Sander

関連する問題