Проблема с разрешением экрана в WPF?
Я собираюсь определить разрешение с помощью следующего кода в WPF:
double height = System.Windows.SystemParameters.PrimaryScreenHeight;
double width = System.Windows.SystemParameters.PrimaryScreenWidth;
Текущее разрешение моего экрана - 1920 * 1200, но height
- 960.0, а width
- 1536.0!!!
Что с ним не так?
Спасибо заранее.
Ответы
Ответ 1
Имейте в виду, что все местоположения и размеры 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 ", никогда не пикселями.
Ответ 2
Для еще более надежной реализации вам необходимо рассчитать коэффициенты 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 должны соответствовать тому, что вы видите в окне свойств вашего монитора.
Ответ 3
Попробуйте SystemParameters.FullPrimaryScreenWidth и FullPrimaryScreenHeight, я считаю, что PrimaryScreenWidth и Height возвращают размер доступного окна клиента после удаления панели задач и других настольных диапазонов на вашем экран.
Ответ 4
Пожалуйста, вызовите это после загрузки 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);
}
}
Ответ 5
вы можете использовать это вместо: http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.primaryscreen.aspx
Ответ 6
Если вы установите флажок "Использовать масштабирование DPI в стиле Windows XP", возвращается верное значение "Screen.PrimaryScreen.Bounds". Если нет, возвращаемое значение пропорционально сокращается значением DPI (которое является значением по умолчанию).
Чтобы установить флажок "Использовать масштабирование DPI в стиле Windows XP", разверните флажок "Чтобы сделать текст и элементы на экране более четкими в программах, которые не предназначены для высокого уровня DPI" в следующей ссылке:
http://windows.microsoft.com/en-us/windows-vista/Make-the-text-on-your-screen-larger-or-smaller
Ответ 7
Вы можете использовать это:
float dpiX, dpiY;
using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
{
dpiX = graphics.DpiX;
dpiY = graphics.DpiY;
}
double screenX = SystemParameters.PrimaryScreenWidth / 96 * dpiX;
double screenY = SystemParameters.PrimaryScreenHeight / 96 * dpiY;
Ответ 8
попробуйте эти.. я считаю, что это может исправить ошибку.....
System.Windows.Form1.Screen.PrimaryScreen.Bounds.Height;
System.Windows.Form1.Screen.PrimaryScreen.Bounds.Widtht;