Получить расстояние от элемента управления до нижней части экрана [дубликат]

Возьмите GestureDetector на верхнем уровне всех виджетов и onTap() этого gestureDetector и вызовите

FocusScope.of(context).requestFocus(new FocusNode());
117
задан Alex Jolig 30 November 2015 в 09:11
поделиться

10 ответов

Screen.FromControl, Screen.FromPoint и Screen.FromRectangle должны помочь вам в этом. Например, в WinForms это будет:

class MyForm : Form
{
  public Rectangle GetScreen()
  {
    return Screen.FromControl(this).Bounds;
  }
}

Я не знаю эквивалентного вызова WPF. Поэтому вам нужно сделать что-то вроде этого метода расширения.

static class ExtensionsForWPF
{
  public static System.Windows.Forms.Screen GetScreen(this Window window)
  {
    return System.Windows.Forms.Screen.FromHandle(new WindowInteropHelper(window).Handle);
  }
}
119
ответ дан Jeff Yates 21 August 2018 в 00:46
поделиться
  • 1
    Возможно, мой тег не дал понять, что я использую окна WPF, а не WinForms. У меня нет ссылки на System.Windows.Forms.dll, и это не сработает, поскольку WPF имеет собственное дерево наследования. – chilltemp 31 October 2008 в 18:25
  • 2
  • 3
    Пожалуйста. Приношу свои извинения за то, что я не сразу ответил на этот вопрос - мне пришлось исследовать, что было в WPF, прежде чем я обновил свой пост. – Jeff Yates 3 November 2008 в 19:37
  • 4
    +1 Спасибо за это! Да, я нашел довольно невозможным обойтись без System.Windows.Forms в моем приложении WPF - MS просто не включала достаточно одной и той же функциональности в WPF. – devios1 3 July 2010 в 02:16
  • 5
    В моем WPF-приложении VS 2015, нацеленном на .NET 4.5 на мою 4-мониторную систему на Windows 10 Pro (v10.0.14393) с window на мониторе выше мой Первичный (например, его Top < 0), , FromHandle вернул Screen для моего основного монитора (хотя window был полностью в Secondary monitor)!?! Вздох. Похоже, мне придется самому искать массив Screen.AllScreens. Почему нет вещей и просто работать??!? Arrrrgh. – Tom 28 April 2017 в 09:05

Остерегайтесь масштабного коэффициента ваших окон (100% / 125% / 150% / 200%). Вы можете получить реальный размер экрана, используя следующий код:

SystemParameters.FullPrimaryScreenHeight
SystemParameters.FullPrimaryScreenWidth
9
ответ дан aDoubleSo 21 August 2018 в 00:46
поделиться
  • 1
    Это для основного экрана - что, если ваше окно приложения находится на виртуальном (расширенном) экране (т. Е. У вас есть один или два внешних монитора, подключенных к вашему ПК)? – Matt 4 May 2018 в 08:10

Добавить в ffpf

Screen.FromControl(this).Bounds
10
ответ дан faulty 21 August 2018 в 00:46
поделиться

Вы можете использовать это, чтобы получить границы рабочего пространства рабочего стола основного экрана:

System.Windows.SystemParameters.WorkArea

Это также полезно для получения только размера основного экрана:

System.Windows.SystemParameters.PrimaryScreenWidth System.Windows.SystemParameters.PrimaryScreenHeight

60
ответ дан Filip Skakun 21 August 2018 в 00:46
поделиться
  • 1
    Я в замешательстве ... Кажется, это только возвращает первичные размеры экрана. Я хочу знать размеры экрана, в котором в настоящее время находится окно ... – VitalyB 16 January 2011 в 12:50
  • 2
    Я смущен тем, как это отвечает на вопрос. – Jeff Yates 28 March 2011 в 14:32
  • 3
    это не отвечает на вопрос, и даже если вы просто хотите получить размер основного дисплея, системные параметры (в WPF) неверны. они возвращают независимые устройства устройства и не пиксели. для лучшей реализации см. этот ответ: stackoverflow.com/questions/254197/… – Patrick Klug 30 September 2011 в 00:28
  • 4
    PrimaryScreenHeight / Width работал точно так, как ожидалось, и MSDN имеет на них следующее: & quot; Получает значение, которое указывает высоту экрана в пикселях основного монитора монитора. & Quot; WorkArea конкретно не говорит о пикселях, но примеры документации и использования приводят меня к тому, что я считаю, что он также находится в пикселях. У вас есть ссылка на что-то, указывающее на использование независимых устройств? – chilltemp 3 October 2011 в 16:37

Это «Центр экрана DotNet 4.5 solution », используя SystemParameters вместо System.Windows.Forms или My. Compuer.Screen : Поскольку Windows 8 изменила расчет размера экрана , единственный способ, с которым он работает для меня, выглядит следующим образом:

Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    Dim BarWidth As Double = SystemParameters.VirtualScreenWidth - SystemParameters.WorkArea.Width
    Dim BarHeight As Double = SystemParameters.VirtualScreenHeight - SystemParameters.WorkArea.Height
    Me.Left = (SystemParameters.VirtualScreenWidth - Me.ActualWidth - BarWidth) / 2
    Me.Top = (SystemParameters.VirtualScreenHeight - Me.ActualHeight - BarHeight) / 2         
End Sub

Center Screen WPF XAML [/g5]

2
ответ дан Nasenbaer 21 August 2018 в 00:46
поделиться

в winforms C # У меня есть начальная точка (для случая, когда у нас есть несколько мониторов / diplay и одна форма вызывает другую) с помощью следующего метода:

private Point get_start_point()
    {
        return
            new Point(Screen.GetBounds(parent_class_with_form.ActiveForm).X,
                      Screen.GetBounds(parent_class_with_form.ActiveForm).Y
                      );
    }
1
ответ дан Oleg Bash 21 August 2018 в 00:46
поделиться

Добавление решения, которое не использует WinForms, кроме NativeMethods. Сначала вам нужно определить собственные методы.

public static class NativeMethods
{
    public const Int32 MONITOR_DEFAULTTOPRIMERTY = 0x00000001;
    public const Int32 MONITOR_DEFAULTTONEAREST = 0x00000002;


    [DllImport( "user32.dll" )]
    public static extern IntPtr MonitorFromWindow( IntPtr handle, Int32 flags );


    [DllImport( "user32.dll" )]
    public static extern Boolean GetMonitorInfo( IntPtr hMonitor, NativeMonitorInfo lpmi );


    [Serializable, StructLayout( LayoutKind.Sequential )]
    public struct NativeRectangle
    {
        public Int32 Left;
        public Int32 Top;
        public Int32 Right;
        public Int32 Bottom;


        public NativeRectangle( Int32 left, Int32 top, Int32 right, Int32 bottom )
        {
            this.Left = left;
            this.Top = top;
            this.Right = right;
            this.Bottom = bottom;
        }
    }


    [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Auto )]
    public sealed class NativeMonitorInfo
    {
        public Int32 Size = Marshal.SizeOf( typeof( NativeMonitorInfo ) );
        public NativeRectangle Monitor;
        public NativeRectangle Work;
        public Int32 Flags;
    }
}

И затем получите ручку монитора и информацию о мониторе, как это.

        var hwnd = new WindowInteropHelper( this ).EnsureHandle();
        var monitor = NativeMethods.MonitorFromWindow( hwnd, NativeMethods.MONITOR_DEFAULTTONEAREST );

        if ( monitor != IntPtr.Zero )
        {
            var monitorInfo = new NativeMonitorInfo();
            NativeMethods.GetMonitorInfo( monitor, monitorInfo );

            var left = monitorInfo.Monitor.Left;
            var top = monitorInfo.Monitor.Top;
            var width = ( monitorInfo.Monitor.Right - monitorInfo.Monitor.Left );
            var height = ( monitorInfo.Monitor.Bottom - monitorInfo.Monitor.Top );
        }
12
ответ дан R.Rusev 21 August 2018 в 00:46
поделиться

Я хотел иметь разрешение экрана, прежде чем открывать первый из моих окон, поэтому здесь можно быстро открыть невидимое окно перед фактическим измерением размеров экрана (вам нужно адаптировать параметры окна к окну, чтобы гарантировать, что оба являются открытыми на одном экране - в основном важно WindowStartupLocation)

Window w = new Window();
w.ResizeMode = ResizeMode.NoResize;
w.WindowState = WindowState.Normal;
w.WindowStyle = WindowStyle.None;
w.Background = Brushes.Transparent;
w.Width = 0;
w.Height = 0;
w.AllowsTransparency = true;
w.IsHitTestVisible = false;
w.WindowStartupLocation = WindowStartupLocation.Manual;
w.Show();
Screen scr = Screen.FromHandle(new WindowInteropHelper(w).Handle);
w.Close();
4
ответ дан Richard Everett 21 August 2018 в 00:46
поделиться

Также вам может понадобиться:

, чтобы получить объединенный размер всех мониторов, а не в частности.

31
ответ дан Samuel Jack 21 August 2018 в 00:46
поделиться
  • 1
    Подсказка: Чтобы использовать его, нужно добавить ссылку PresentationFramework.dll и using System.Windows; – Matt 4 May 2018 в 07:35

Мне нужно было установить максимальный размер моего окна приложения. Это может измениться, соответственно, приложение было показано на основном экране или во вторичном. Чтобы преодолеть эту проблему, e создал простой метод, который я покажу вам следующим образом:

/// <summary>
/// Set the max size of the application window taking into account the current monitor
/// </summary>
public static void SetMaxSizeWindow(ioConnect _receiver)
{
    Point absoluteScreenPos = _receiver.PointToScreen(Mouse.GetPosition(_receiver));

    if (System.Windows.SystemParameters.VirtualScreenLeft == System.Windows.SystemParameters.WorkArea.Left)
    {
        //Primary Monitor is on the Left
        if (absoluteScreenPos.X <= System.Windows.SystemParameters.PrimaryScreenWidth)
        {
            //Primary monitor
            _receiver.WindowApplication.MaxWidth = System.Windows.SystemParameters.WorkArea.Width;
            _receiver.WindowApplication.MaxHeight = System.Windows.SystemParameters.WorkArea.Height;
        }
        else
        {
            //Secondary monitor
            _receiver.WindowApplication.MaxWidth = System.Windows.SystemParameters.VirtualScreenWidth - System.Windows.SystemParameters.WorkArea.Width;
            _receiver.WindowApplication.MaxHeight = System.Windows.SystemParameters.VirtualScreenHeight;
        }
    }

    if (System.Windows.SystemParameters.VirtualScreenLeft < 0)
    {
        //Primary Monitor is on the Right
        if (absoluteScreenPos.X > 0)
        {
            //Primary monitor
            _receiver.WindowApplication.MaxWidth = System.Windows.SystemParameters.WorkArea.Width;
            _receiver.WindowApplication.MaxHeight = System.Windows.SystemParameters.WorkArea.Height;
        }
        else
        {
            //Secondary monitor
            _receiver.WindowApplication.MaxWidth = System.Windows.SystemParameters.VirtualScreenWidth - System.Windows.SystemParameters.WorkArea.Width;
            _receiver.WindowApplication.MaxHeight = System.Windows.SystemParameters.VirtualScreenHeight;
        }
    }
}
2
ответ дан VMAtm 21 August 2018 в 00:46
поделиться
  • 1
    Что делать, если ваш основной монитор находится справа? – Drew Freyling 9 October 2014 в 04:44
Другие вопросы по тегам:

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