😸

AvaloniaUI Control座標の取得方法

2024/04/02に公開

やりたいこと

AvaloniaUIの各Controlの座標をC#コードで取得したい。

使用環境

Windows 11 : Home 22H2 + Visual Studio Community 2022(64bit)
Linuxテスト環境 : 上記Windows上のWSL2 Ubuntsu 22.04.2 LTS
Visual Studio2022, AvaloniaUI 11.0.2

コントロール座標の取得

コントロール座標はBoundsから取得する

    Avalonia.Point position = MyControl.Bounds.Position;

対Windowのコントロール座標の取得

Windowクライアント領域内での座標の取得にはTransformdBoundsを使う

TransformedBounds transformedBound = (TransformedBounds)MyControl.GetTransformedBounds();
Avalonia.Point position = transformedBound.Clip.Position;

Screen座標の取得

Screen座標は以下で取得できる。ただし、Windowの外枠分はずれる気がする。Window枠のサイズはプラットフォームによって扱いが違うためにAvaloniaUIでの実装はちょっと混乱しているよう。

TransformedBounds transformedBound = (TransformedBounds)MyControl.GetTransformedBounds();

Avalonia.PixelPoint screenPosition = new Avalonia.PixelPoint(
    MyWindow.Position.X + (int)(transformedBound.Clip.Position.X * Global.mainWindow.DesktopScaling),
    MyWindow.Position.Y + (int)(transformedBound.Clip.Position.Y * Global.mainWindow.DesktopScaling)
    );

Discussion