5

SetValuewith (たとえば)Canvas.LeftPropertyMarginProperty?の使用には違いがありますか?

より明確にするために:

<Canvas>
   <Rectangle x:Name="rect">                         
</Canvas>

rect.SetValue(Canvas.LeftProperty, 10)

に相当

rect.Margin = new Thickness(10, 0, 0, 0)

か否か?

4

5 に答える 5

4

Margin プロパティは、オブジェクトの周りの余分なスペースを決定するために、すべての要素で使用されます。ほぼすべての種類のレイアウト (StackPanel、Grid、ContentControls など) で機能します。

Canvas.LeftProperty (および Top、Right、および Bottom) は、Canvas 内に直接ある要素にのみ適用されます。Canvas はこれらの値を使用して、オブジェクトの位置を決定します。Path のような Shape 要素を使用すると、Canvas は位置を決定するときに Shape の位置データも参照します。

技術的には、Canvas 添付プロパティは、Shape (存在する場合) および Margin の固有の位置データと共に蓄積する必要があります。3つすべてを使用して位置を変更できます。しかし、通常はシンプルにしようとします。

たとえば、Rectangle は、その Width プロパティと Height プロパティ、および Canvas.Left と Canvas.Top を使用する必要があります。Path は、そのポイント データに依存するか、Canvas.Left と Canvas.Top でオフセットします。Canvas 内の要素には margin を使用しない方が適切に制御できるため、margin を使用しないでください。ただし、技術的には可能です。

于 2012-06-13T15:31:49.100 に答える
1

に直接含まれる要素のCanvas場合、唯一の違いは手段にあります。最終結果はまったく同じです。

Rectangle配置されると、レイアウト エンジンはその位置に影響するすべての値を合計します。X座標の場合、これにはCanvas.Leftとが含まれMargin.Leftます。

したがって、ある場合は を追加10 + 0し、別の場合は を追加し0 + 10ます。

ですから、好きな方で行ってください。個人的にCanvas.Leftは、この状況の方が文脈的に意味があるように見えるので、この状況の方が好きです。

于 2012-06-13T15:33:20.567 に答える
1

同じように見えますが、最初のケースでは、キャンバスがrect適切に移動します10。2 番目rectに右に移動し10ます。

目的に合わせて使い分けてください。

EDIT: WPFコードをもっと深く見てください。最初のケースでは、Canvas のArrangeOverriderectで移動され、2 番目のケースでは、Rectangle のArrangeOverrideで移動されます。

于 2012-06-13T15:26:33.657 に答える
0
Canvas.Left
Canvas.Right
Canvas.Top
Canvas.Bottom

キャンバス コンテナー内でのみ適用され、アタッチされているコントロールの幅と高さは変更されません。(左 = 10、右 = 10 は、両側に 10 のマージンを与えるために引き伸ばされません)

Margin.Left
Margin.Right
Margin.Top
Margin.Bottom

設定されているオブジェクトによって制御されます。たとえば、グリッド上のキャンバスの外側で機能し、任意のコントロールの幅と高さを変更してその値を適用します (幅と高さが NaN の場合)。

于 2012-06-13T15:32:19.693 に答える
0

DependencyProperty であるため、TemplateBinding または通常の Binding を使用して、オブジェクトのテンプレート内でMarginプロパティを使用できます。これにより、オブジェクトの幅と高さも調整されます。

Canvas プロパティは FrameworkElement に添付されたプロパティであり、Margin プロパティを持たない可能性がある要素の配置を可能にします。また、オブジェクトに Canvas の親がない場合は機能しません。

于 2012-06-13T15:32:51.243 に答える