たとえば、WPFでは、楕円の垂直位置を設定するには、メソッドを使用します Canvas.SetTop(ellipseObj, y)
。つまり、場所は、楕円を含むキャンバスオブジェクトではなく、クラスCanvasに保存されます。
理由を理解したいです!では、なぜアタッチされたプロパティがクラス変数として格納されるのでしょうか。
たとえば、WPFでは、楕円の垂直位置を設定するには、メソッドを使用します Canvas.SetTop(ellipseObj, y)
。つまり、場所は、楕円を含むキャンバスオブジェクトではなく、クラスCanvasに保存されます。
理由を理解したいです!では、なぜアタッチされたプロパティがクラス変数として格納されるのでしょうか。
WPF のポイントは、UIPanels
が子要素を描画する場所を決定することです。そのため、コントロール自体には、配置できる場所についての発言権はありません。UI レイアウトのメジャー パスでは、コントロールのサイズのみが考慮されます。
あなたの場合、Canvas
例として使用していますが、これは非常に近視眼的です。キャンバスは、子コントロールをレイアウトできる数少ない方法の 1 つにすぎず、子要素を正確に配置できるように設計されています。したがって、子ごとに Top 値と Left 値を設定できるのは理にかなっています。また、UI をレイアウトする方法として Canvas を使用することはあまりお勧めできません。
しかし、Grid
では、そのようなことはできません。ここでは、どのRow
、Column
および何RowSpan
をColSpan
子供が持つべきかを設定します。ではDockPanel
、子要素をドッキングするさまざまな方法があります。
そして、他のパネルにはそのようなオプションがStackPanel
ありWrapPanel
ません。
これを解決するには、次の 2 つのオプションがあります。
また、添付プロパティは、パネル レイアウト以外にも多くのことに役立ちます。
添付プロパティはそのように実装されているため、フレームワーク要素 (Line や TextBox など) に別のオブジェクト (Canvas や Grid など) との関係を与えることができます。プロパティは、その子要素の配置を担当するコンテナー コントロールと同様Left
でありTop
、コンテナー コントロールに正しく属します。
これはビジター パターンのようなものと考えることができます。Canvas コンテナは、子要素の構造を実際に変更することなく、子要素の動作を効果的に変更できます。
添付プロパティに関するMSDNの記事で説明されている方法は次のとおりです。
添付プロパティの目的の 1 つは、親要素で実際に定義されているプロパティに対して、さまざまな子要素が一意の値を指定できるようにすることです。