前回の疑問から、WindowクラスとFormクラスのプロパティ、メソッド、イベントを並べて比較し、大きな違いがあることが分かりました。

 

しかし、

 

この比較で「Formに(コントロールを追加する時に使うForm.Controls.Add()の親玉である)Controlsがプロパティにない」ことに気が付きました。またWPFのWindowクラスではForm.Controls.Add()は使えないので(エラーが出ます)、ウィンドウにコントロールをどのように入れるのでしょうか?Web等では「コントロールなどを追加する際に"(Window).Content = Object"のようにしてウィンドウにオブジェクトを設定」するようなことを書いていますが、これもプロパティにはありません。

 

なので、

 

自分で調べてみました。

 

【WinForm】

Microsoftは「フォームの Controls コレクションを使用して、コントロール(注)を作成し、実行時にフォームに追加することができます。」(出典)と書いていますが、FormクラスとControlsコレクション(Control.Controls)の関係は直接言及していません。その為、クラス定義由来を見てみますと、

Form→public class Form : System.Windows.Forms.ContainerControl

とあり、ContainerControlから派生し、それを内包していることが分かります。そしてこのContainerControlクラスは、「他のコントロールのコンテナーとして機能するコントロールにフォーカスを管理する機能を提供します。」ということで、謎が解けました。

注:この「コントロール」とはWin32のコモンコントロール等("The majority of the controls in the System.Windows.Forms namespace use the underlying Windows common control as a base to build on.")、これらの伝統的なWindows コントロールを意味します。

 

【WPF】

Windowクラスも同様に、その定義で、

Window→public class Window : System.Windows.Controls.ContentControl

Controls.ContentControl(注)から派生して、それを内包しているので、謎が解けました。しかし、今度は「コンテンツ」という耳慣れない言葉が出てきました。

注:参照先にContentControlは「任意の種類のコンテンツContentクラス)が 1 つあるコントロールを表します。」と書かれています。

 

しかし、このContentControlが管理するContent(注)とは具体的に何なのか、複数のWin32のコントロール等はどう扱えばよいのか、などという疑問が生じます。

注:参照先に

Contentコントロールは、コンテンツ ページのコンテンツとコントロールのコンテナーです。 Contentコントロールは、対応するコントロールを定義するマスター ページでのみ使用されますContentPlaceHolder。 Content実行時にコントロールはコントロール階層に追加されません。 代わりに、コントロール内の Content 内容は、対応する ContentPlaceHolder コントロールに直接マージされます。

と書かれていますが、自動訳文のようで却ってわかりにくいので英文原文を載せます。「コンテンツページ」「マスターページ」「コンテンツプレースホールダー」等の耳慣れない言葉が多くなってきました。

"Content control is a container for the content and controls of a content page. A Content control is used only with a master page that defines a corresponding ContentPlaceHolder control. A Content control is not added to the control hierarchy at runtime. Instead, the contents within the Content control are directly merged into the corresponding ContentPlaceHolder control."

いずれにしてもまだ「寿限無寿限無」ですね。

 

全体像をもう少しわかりやすくしてくれるのは、このページですね。

WPF のコンテンツモデル

結構なんでもコンテンツとして表示できそうです。

 

しかし、

 

もうここら辺から、伝統的な「ウィンドウにコントロールを貼り付けて表示する」というWin32 "Windows Conttols"の世界(従って、そのラッパーとして作られたC# WinFormの世界)から大きく離れて、「インターネット上に掲載されている情報すべて」「Webサイト上に掲載された情報(中身)全てを指す言葉」というようなWEB "Content"の世界に入り込んでゆくようです。