1

たとえば、WPFでは、楕円の垂直位置を設定するには、メソッドを使用します Canvas.SetTop(ellipseObj, y)。つまり、場所は、楕円を含むキャンバスオブジェクトではなくクラスCanvasに保存されます。

理由を理解したいです!では、なぜアタッチされたプロパティがクラス変数として格納されるのでしょうか。

4

2 に答える 2

2

WPF のポイントは、UIPanelsが子要素を描画する場所を決定することです。そのため、コントロール自体には、配置できる場所についての発言権はありません。UI レイアウトのメジャー パスでは、コントロールのサイズのみが考慮されます。

あなたの場合、Canvas例として使用していますが、これは非常に近視眼的です。キャンバスは、子コントロールをレイアウトできる数少ない方法の 1 つにすぎず、子要素を正確に配置できるように設計されています。したがって、子ごとに Top 値と Left 値を設定できるのは理にかなっています。また、UI をレイアウトする方法として Canvas を使用することはあまりお勧めできません。

しかし、Gridでは、そのようなことはできません。ここでは、どのRowColumnおよび何RowSpanColSpan子供が持つべきかを設定します。ではDockPanel、子要素をドッキングするさまざまな方法があります。

そして、他のパネルにはそのようなオプションがStackPanelありWrapPanelません。

これを解決するには、次の 2 つのオプションがあります。

  1. それらをすべて各要素に保存します。これにより、未使用のプロパティが多くなり、拡張性が失われます。誰かが独自の Panel を実装したい場合、子を別の方法でレイアウトし、子ごとに別の種類のプロパティが必要な場合はどうすればよいでしょうか?
  2. これらのプロパティをコンテナー自体に保存します。これにより、スペースを節約し、全体を拡張するオプションが得られます。

また、添付プロパティは、パネル レイアウト以外にも多くのことに役立ちます。

于 2012-12-08T22:45:37.687 に答える
1

添付プロパティはそのように実装されているため、フレームワーク要素 (Line や TextBox など) に別のオブジェクト (Canvas や Grid など) との関係を与えることができます。プロパティは、その子要素の配置を担当するコンテナー コントロールと同様LeftでありTop、コンテナー コントロールに正しく属します。

これはビジター パターンのようなものと考えることができます。Canvas コンテナは、子要素の構造を実際に変更することなく、子要素の動作を効果的に変更できます。

添付プロパティに関するMSDNの記事で説明されている方法は次のとおりです。

添付プロパティの目的の 1 つは、親要素で実際に定義されているプロパティに対して、さまざまな子要素が一意の値を指定できるようにすることです。

于 2012-12-08T20:04:54.200 に答える