0

Expander を Page に配置しました。エキスパンダー内にラベルがあります。ページが読み込まれた後、エキスパンダーはまだ展開されていません。この時点で、VisualTreeHelper を使用して Expander を検査すると、次のような構造が得られました。

  Expander
    Border
      DockPanel
        ToggleButton
          Border
            Grid
              Ellipse
              Ellipse
              Path
              ContentPresenter
        ContentPresenter

最後の ContentPresenter の下に Label がありません。

ただし、エキスパンダーが展開されてから折りたたまれると、VisualTreeHelper を使用して別の構造を取得しました。

  Expander
    Border
      DockPanel
        ToggleButton
          Border
            Grid
              Ellipse
              Ellipse
              Path
              ContentPresenter
        ContentPresenter
          Label
            Border
              ContentPresenter

今回は、ContentPresenter の下に Label が表示されます。

エキスパンダーが展開されている限り、VisualTreeHelper は Expander 内のコンテンツを認識しているようです。しかし、展開せずに VisualTreeHelper に Expander の内容を認識させる方法はありますか?

ありがとう。

4

1 に答える 1

4

コントロールのコンテンツをプログラムで強制的にロードする方法があります。

要素を検索するある種の再帰ループがあると思います。子を取得するために呼び出す前に、次の呼び出しを使用します。

if (element is FrameworkElement)
     (element as FrameworkElement).ApplyTemplate()

これにより、テンプレートが適用され、コントロールがメモリに読み込まれます。コントロールは通常、表示されるまで必要ないため、パフォーマンス上の理由からこの方法で行われると思います。

このアプローチはTabControl、コンテンツを非表示にできるその他のコントロールでも機能すると思います。

クレジットは、このソリューションをここに投稿した Tao Liang に贈られます。再帰ループに問題がある場合にも読んでください。

于 2010-07-05T05:14:43.510 に答える