14

a内に要素を配置することに関する一般的な質問Canvasは、「要素の中心を(左上隅ではなく)配置する方法」です。

いくつかの解決策が提示されていますが、それらにはすべて欠点があります。

最も簡単な解決策は、プログラムでプロパティCanvas.Leftとプロパティを設定するときに要素サイズに対応することです。Canvas.Topこれは機能しますが、1回だけです。このソリューションはバインディングをサポートしておらず、要素サイズが変更されると壊れます。Canvas.Leftまた、またはCanvas.Topを使用して設定することはできません

RenderTransform別の一連のソリューションには、またはのいずれかを利用した変換変換が含まれますMargin-0.5 * Widthこれらのソリューションでは、またはにいくつかのプロパティをバインドする必要があります-0.5 * Height。このようなバインディングにはカスタムの作成が必要であり、ValueConverterXAMLのみを使用して作成することはできません。

では、要素をキャンバス内に配置して、要素の中心に対応し、サイズと位置の両方のプロパティを他のプロパティにバインドできるようにする簡単な方法はありCanvas.LeftますCanvas.Topか?

4

4 に答える 4

11

XAMLとバインディングは非常に強力に見えますが、非常に複雑なソリューションを必要とする単純な問題がある場合があります。私のバインディングライブラリでは、そのようなバインディングを作成するのは、書くのと同じくらい簡単element.Center = positionですelement.TopLeft = position - element.Size / 2が、私を夢中にさせないでください。

XAMLのみを使用し、要素のサイズと位置の両方のプロパティのバインドをサポートする非常に単純なソリューションを見つけました。位置合わせを設定したWPFコントロールもキャンバスStretchCenterに配置すると、要素はポイント(目的の状態)として中心に向かって「重力」しますが、同じポイント(Canvas.Left, Canvas.Top)に配置された「アングルプレート」によって停止されるようです。 (Canvas.Left, Canvas.Top)。この「重力」をどうやって知ることができますか?Margin要素のを負の値に設定してブロックを緩和すると、それは明らかです。負のマージンを設定すると、要素を中央の目標に向かって移動できます。Margin要素がに達するまで移動(-Height / 2, -Width / 2)し、要素が完全に中央に配置されるようにします。(Canvas.Left, Canvas.Top)点。要素はすでに完全に配置されているため、それ以上変更しても動きは発生しません。

解決策:設定しMargin="-1000000"ます。

したがって、次のコードでは、楕円は両方とも(200、200)ポイントの中心にあります。最初の楕円には、楕円の中心に対応するプロパティがLeftありTop、他のオブジェクトのプロパティと簡単にバインドできます。

<Canvas>
    <Ellipse Width="100" Height="100" Canvas.Left="200" Canvas.Top="200" Opacity="0.5" Fill="Red" Margin="-100000" />
    <Ellipse Width="100" Height="100" Canvas.Left="150" Canvas.Top="150" Opacity="0.5" Fill="Blue" />
</Canvas>

悪い点は、このソリューションがWPFでのみ機能することです。SilverlightとWinRTには、説明されている動作はありません。

于 2012-11-04T14:17:51.043 に答える
4

さらに簡単なのは、少なくともShapesの場合、適切なジオメトリを持つパスを使用することです。

<Canvas>
    <Path Canvas.Left="200" Canvas.Top="200" Fill="Red" Opacity="0.5">
        <Path.Data>
            <EllipseGeometry RadiusX="50" RadiusY="50"/>
        </Path.Data>
    </Path>
</Canvas>
于 2012-11-04T15:33:11.587 に答える
1

キャンバスを2x2グリッドの右下のセルに配置することでこれを解決しました。これにより、0,0座標がグリッドの中心になり、それに関連するすべての描画を行うことができます。

于 2016-06-26T05:07:47.580 に答える
0

このソリューションは、WPFキャンバス上の特定のポイントでテキストを中央に配置するために機能しました。彼はMultiBindingとカスタムコンバーターを使用して要素のマージンを調整します。素晴らしい!

于 2014-04-24T19:58:26.360 に答える