Проблема разрешения экрана в WPF? - PullRequest
24 голосов
/ 10 февраля 2010

Я определю разрешение с помощью следующего кода в WPF:

double height = System.Windows.SystemParameters.PrimaryScreenHeight;
double width = System.Windows.SystemParameters.PrimaryScreenWidth;

Текущее разрешение моего экрана - 1920 * 1200, но <strong>height</strong> - 960,0, а <strong>width</strong> - 1536,0 !!!

Что с ним не так?
Заранее спасибо.

Ответы [ 7 ]

33 голосов
/ 10 февраля 2010

Имейте в виду, что все местоположения и размеры WPF имеют плавающую точку с единицей 1/96 дюйма. Не пикселей. Это делает ваши оконные проекты независимыми. Делаем математику: высота = 960/96 = 10 дюймов. Если для вашего видеоадаптера установлено значение 120 DPI (120/96 = 125%): 10 * 120 = 1200 пикселей. То же самое для ширины: 1536/96 * 120 = 1920 пикселей.

System.Windows.Forms работает в пикселях. Вы получаете меньше 1050 за высоту, потому что она вычитает высоту панели задач. Но для WPF вы всегда хотите работать с 1/96 ", а не с пикселями.

25 голосов
/ 15 июня 2010

Для еще более надежной реализации вы должны рассчитать факторы DPI в вашей системе и работать с этими факторами. Нормальное значение DPI - 96, но некоторые мониторы могут иметь разные значения. Предположим, что ваш код работает на мониторе, значение DPI которого отличается от значения 96. Рассмотрим этот код:

    private static void CalculateDpiFactors()
    {
        Window MainWindow = Application.Current.MainWindow;
        PresentationSource MainWindowPresentationSource = PresentationSource.FromVisual(MainWindow);
        Matrix m = MainWindowPresentationSource.CompositionTarget.TransformToDevice;
        thisDpiWidthFactor = m.M11;
        thisDpiHeightFactor = m.M22;
    }

Затем вы можете использовать эти соотношения для получения окончательных значений:

CalculateDpiFactors();
double ScreenHeight = SystemParameters.PrimaryScreenHeight * thisDpiHeightFactor;
double ScreenWidth = SystemParameters.PrimaryScreenWidth * thisDpiWidthFactor;

Значения ScreenHeight и ScreenWidth должны соответствовать тому, что вы видите в окне «Свойства» вашего монитора.

1 голос
/ 16 февраля 2016

Пожалуйста, позвоните после загрузки Windows.

 public static class Ext
{
    public static Size GetNativePrimaryScreenSize(this Window window)
    {
        PresentationSource mainWindowPresentationSource = PresentationSource.FromVisual(window);
        Matrix m = mainWindowPresentationSource.CompositionTarget.TransformToDevice;
        var dpiWidthFactor = m.M11;
        var dpiHeightFactor = m.M22;
        double screenHeight = SystemParameters.PrimaryScreenHeight * dpiHeightFactor;
        double screenWidth = SystemParameters.PrimaryScreenWidth * dpiWidthFactor;

        return new Size(screenWidth, screenHeight);
    }
}
1 голос
/ 10 февраля 2010

Попробуйте SystemParameters.

0 голосов
/ 03 мая 2012

Если вы отметите «Использовать масштабирование DPI в стиле Windows XP», возвращаемое значение «Screen.PrimaryScreen.Bounds» будет правильным. Если нет, возвращаемое значение пропорционально сокращается до значения DPI (по умолчанию).

Чтобы найти флажок «Использовать масштабирование DPI в стиле Windows XP», разверните ссылку «Чтобы сделать текст и экранные элементы более понятными в программах, не предназначенных для высокого разрешения», по следующей ссылке: http://windows.microsoft.com/en-us/windows-vista/Make-the-text-on-your-screen-larger-or-smaller

0 голосов
/ 15 марта 2010

попробуйте эти ... я считаю, что это может исправить ошибку .....

System.Windows.Form1.Screen.PrimaryScreen.Bounds.Height; System.Windows.Form1.Screen.PrimaryScreen.Bounds.Widtht;

0 голосов
/ 10 февраля 2010

вы можете использовать это вместо: http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.primaryscreen.aspx

...