Если вам именно самого окна в нормальных координатах, то можно использовать WinApi:
https://github.com/VoidVolker/LockScreen/blob/mast...
public static class Native
{
[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hwnd, ref RECT rectangle);
[DllImport("user32.dll")]
private static extern bool GetClientRect(IntPtr hwnd, ref RECT rectangle);
public RECT GetWindowPos(IntPtr hwnd)
{
var r = new RECT();
GetWindowRect(hwnd, ref r);
return r;
}
public RECT GetClientPos(IntPtr hwnd)
{
var r = new RECT();
GetClientRect(hwnd, ref r);
return r;
}
[Serializable]
[StructLayout(LayoutKind.Sequential)]
public struct RECT(int left, int top, int right, int bottom)
{
public int Left = left;
public int Top = top;
public int Right = right;
public int Bottom = bottom;
public readonly int Width => Right - Left;
public readonly int Height => Bottom - Top;
}
}
Значения
RenderSize
и
ActualWidth/ActualHeight
будут после вычисления положения самого элемента. Скорее всего вы слишком рано пытаетесь получить к ним доступ. Запустите ваше приложение и в отладчике посмотрите в дереве окон значения.
Плюс учтите, что в WPF свои пиксели, которые надо конвертировать в нормальные и обратно с учётом DPI текущего монитора, на котором располагается окно (на SO есть готовый код). И из-за этого WPF окно невозможно 100% точно позиционировать в нужных координатах и нужного размера в многомониторной конфигурации.
Пример работы с визуалом элемента при его инициализации:
public class MyControl : Control
{
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
// Размеры и позиция элемента вычислены и он готов к работе
}
}
https://github.com/VoidVolker/LockScreen/blob/mast... - пример из реального проекта.
Т.е., наследуете свой элемент от базового класса или любого другого элемента и вклиниваетесь в событие применения шаблона элемента. В разметке XAML добавляете ссылку на класс и спокойно используете свой элемент как обычно.