間隔 - WPF:キャンバス内の中央に(0,0)を作成する方法




wpf 動的 レイアウト (3)

OriginをRenderTransformOrigin変更するだけRenderTransformOrigin

    <Canvas Width="Auto" Height="Auto"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            RenderTransformOrigin="0.5,0.5">
        <Canvas.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleY="-1" ScaleX="1" />
            </TransformGroup>
        </Canvas.RenderTransform>
    </Canvas>

WPFキャンバスには、コントロールの左上に(0,0)から始まる座標系があります。

たとえば、次のように設定すると、コントロールが左上に表示されます。

<Control Canvas.Left="0" Canvas.Top="0">

標準デカルト座標に変更するにはどうすればよいですか。

基本的に:

  • 中心で(0,0)
  • 反転Y

私はこの記事が似ていることに気づきました、しかしそれは座標系を翻訳することについて話しません。 TranslateTransformを追加しようとしましたが、うまく機能させることができません。


カスタムパネルを作成する必要はありません。 キャンバスはちょうどいいでしょう。 別のコントロール(境界線など)で囲み、中央に配置し、サイズを0にして、RenderTransformを使用して反転するだけです。

<Border>
  <Canvas HorizontalAlignment="Center" VerticalAlignment="Center"
          Width="0" Height="0"
          RenderTransform="1 0 0 -1 0 0">
    ...
  </Canvas>
</Border>

(0,0)がそれを含むコントロールの中心(この場合はBorderの中心)になり、+ Yが下ではなく上になることを除いて、キャンバス内のすべてのものが表示されたままになります。

繰り返しますが、このためにカスタムパネルを作成する必要はありません


一番いいのはカスタムCanvasを書くことです。ArrangeOverrideを中心に0,0となるように書くことができます。

更新日:私はキャンバスから派生することをお勧めしません、私は以下の答え(@decasteljau)で別のコメントを与えた、あなたはパネルから派生し、2つの添付依存プロパティを追加することができます。 また、LayoutTransformを含むコンストラクタも必要ありません。また、パネルコードの変換を使用しないで、パネルのDesiredSizeに基づいて適切なサイズと配置にすることで、コンテンツのサイズ変更動作も向上します。 キャンバスのサイズが変更されても、キャンバスは動的にアイテムを配置しません。







coordinate-systems