Задать вопрос
@Mackaron

Как узнать ClientSize окна в wpf приложения?

Пытался использовать RenderSize у Grid, но там хранится Nan, такая же проблема и с ActualWidth/ActualHeight. Я задаю размеры окна после его инециализации, возможно проблема именно в этом. Есть можно ли узнать размеры клиентской области другими способами?
  • Вопрос задан
  • 61 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Если вам именно самого окна в нормальных координатах, то можно использовать 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 добавляете ссылку на класс и спокойно используете свой элемент как обычно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы