Подтвердить что ты не робот

С# разрешение WPF независимость?

Я разрабатываю элемент управления картой в WPF с помощью С#. Я использую управление холстом, например. 400 x 200, которому назначена область карты, например. 2 000 м x 1000 м.

Масштаб карты будет: canvas_size_in_meters/real_size_in_meters.

Я хочу найти canvas_size_in_meters.

Холст.Актуальная ширина дает ширину в DIU (независимые от устройства единицы). Таким образом, 400 DIU составляет 400/96 = 4,17 дюйма, PROVIDED, что разрешение физическое моего монитора составляет 96 точек на дюйм.

Однако, используя линейку, я обнаружил, что физическое разрешение моего монитора составляет 87 точек на дюйм. (Есть только несколько мониторов, которые на самом деле имеют 96 физических dpi)

Эта разница DPI (10%) переводит на + 10% разницу в фактической ширине управления сетью на экране.

Как измерить размер элемента управления WPF в дюймах ТОЧНО и независимо от разрешения экрана и настройки DPI?

4b9b3361

Ответ 1

Как измерить размер элемента управления WPF в дюймах ТОЧНО и независимо от разрешения экрана и настройки DPI?

На самом деле это невозможно, поскольку для работы WPF должен будет знать разрешение (с точки зрения DPI) вашего монитора. Звучит неплохо в теории, но на практике окна не знают эту информацию. Вот почему окна всегда всегда принимают 96dpi слепо, а не умнее.

Даже если есть какой-то способ вручную сообщить об этом, или если ваш конкретный монитор имеет собственный драйвер, который передает правильную информацию в окна, это не будет работать на ком-либо компьютере, поэтому окна не проходят эту информацию для любых приложений.

Лучшее, что вы можете сделать, это нарисовать масштаб, например, карты google. Вы знаете, что 1 пиксель == 1 миля, так что вы можете нарисовать 50-пиксельную линию на своей карте с меткой, говорящей, что "эта линия равна 50 милям"

Ответ 2

Существует способ вычисления текущего размера пикселя в мм или дюймах. Как упоминалось в более ранних сообщениях, это не фиксированное значение и будет меняться в зависимости от текущего разрешения и размера монитора.

Сначала получите текущее разрешение. Предположим, что это 1280x1024 Теперь получим ширину монитора в мм с помощью функции GetDeviceCaps. Его стандартная функция библиотеки Windows.

int widthmm = GetDeviceCaps (deviceContext, HORZSIZE); Моя ширина монитора составляет 362 мм.

Итак, размер пикселя = 362/1280 = 0,282 мм

Точность этого метода зависит от того, что область отображения точно покрывает ширину монитора.

Итак, чтобы ответить на исходный вопрос, размер холста размером 400 x 200 пикселей будет (400 * 0.282/1000) x (200 * 0.282/1000) в метрах, если это показано на моем мониторе.

Ответ 3

Благодарим вас за ответ.

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

Наличие абсолютного масштаба не имеет решающего значения для приложения, было бы неплохо отобразить ориентировочную шкалу, например 1:15 000.

Абсолютный масштаб потребует для дополнительного монитора переменныхPhysicalDPI (изначально установленного на 96), который, если использование, выбранное для изменения, даст немного лучшее масштабирование (опять же это не важно). Размер элемента управления карты будет следующим:

map.ActualWidth * (96/monitorPhysicalDPI) * inchesPerDIU, inchesPerDIU - 1/96

Опять же, это косметика. Было бы неплохо, если бы Windows знала контрольные измерения ACTUAL? (пользователь должен будет предоставить информацию о размерах экрана при настройке ОС или просто установить файл INF монитора)