Как получить размер текущего экрана в WPF?



Я знаю, что могу получить размер основного экрана с помощью



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


но как я могу получить размер текущего экрана? (Пользователи с несколькими экранами не всегда используют основной экран, и не все экраны используют одно и то же разрешение, верно?)



было бы неплохо иметь доступ к размеру из XAML, но этого было бы достаточно из кода (C#).

1509   9  

9 ответов:

насколько я знаю, нет собственной функции WPF для получения размеров текущего монитора. Вместо этого вы могли бы PInvoke native функции нескольких мониторов, оберните их в управляемый класс и предоставьте все свойства, необходимые для их использования из XAML.

Я создал небольшую обертку вокруг экрана из системы.Окна.Формы, в настоящее время все работает... Однако не уверен в "независимых от устройства пикселях".

public class WpfScreen
{
    public static IEnumerable<WpfScreen> AllScreens()
    {
        foreach (Screen screen in System.Windows.Forms.Screen.AllScreens)
        {
            yield return new WpfScreen(screen);
        }
    }

    public static WpfScreen GetScreenFrom(Window window)
    {
        WindowInteropHelper windowInteropHelper = new WindowInteropHelper(window);
        Screen screen = System.Windows.Forms.Screen.FromHandle(windowInteropHelper.Handle);
        WpfScreen wpfScreen = new WpfScreen(screen);
        return wpfScreen;
    }

    public static WpfScreen GetScreenFrom(Point point)
    {
        int x = (int) Math.Round(point.X);
        int y = (int) Math.Round(point.Y);

        // are x,y device-independent-pixels ??
        System.Drawing.Point drawingPoint = new System.Drawing.Point(x, y);
        Screen screen = System.Windows.Forms.Screen.FromPoint(drawingPoint);
        WpfScreen wpfScreen = new WpfScreen(screen);

        return wpfScreen;
    }

    public static WpfScreen Primary
    {
        get { return new WpfScreen(System.Windows.Forms.Screen.PrimaryScreen); }
    }

    private readonly Screen screen;

    internal WpfScreen(System.Windows.Forms.Screen screen)
    {
        this.screen = screen;
    }

    public Rect DeviceBounds
    {
        get { return this.GetRect(this.screen.Bounds); }
    }

    public Rect WorkingArea
    {
        get { return this.GetRect(this.screen.WorkingArea); }
    }

    private Rect GetRect(Rectangle value)
    {
        // should x, y, width, height be device-independent-pixels ??
        return new Rect
                   {
                       X = value.X,
                       Y = value.Y,
                       Width = value.Width,
                       Height = value.Height
                   };
    }

    public bool IsPrimary
    {
        get { return this.screen.Primary; }
    }

    public string DeviceName
    {
        get { return this.screen.DeviceName; }
    }
}

здесь Буды. Это даст вам только ширину и высоту рабочей области

System.Windows.SystemParameters.WorkArea.Width
System.Windows.SystemParameters.WorkArea.Height

найдите время для сканирования членов SystemParameters.

  • VirtualScreenWidth
  • VirtualScreenHeight

Они даже принимают во внимание относительное положение экранов.

протестирован только с двумя мониторами.

Это даст вам текущий экран, основанный на верхнем левом углу окна просто вызовите это.CurrentScreen () для получения информации на текущем экране.

using System.Windows;
using System.Windows.Forms;

namespace Common.Helpers
{
    public static class WindowHelpers
     {
        public static Screen CurrentScreen(this Window window)
         {
             return Screen.FromPoint(new System.Drawing.Point((int)window.Left,(int)window.Top));
         }
     }
}

Если вы знакомы с использованием

почему бы просто не использовать это?

var interopHelper = new WindowInteropHelper(System.Windows.Application.Current.MainWindow);
var activeScreen = Screen.FromHandle(interopHelper.Handle);
double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth;
double screenhight= System.Windows.SystemParameters.PrimaryScreenHeight;

Он работает с

this.Width = System.Windows.SystemParameters.VirtualScreenWidth;
this.Height = System.Windows.SystemParameters.VirtualScreenHeight;

проверено на 2 мониторах.

Comments

    Ничего не найдено.