Как предотвратить масштабирование WPF с помощью параметров размера шрифта Windows?

Я не хочу, чтобы мой графический интерфейс WPF масштабировался с параметрами размера шрифта Windows (DPI). Это не просто вопрос указания фиксированного размера шрифта в UserControl, поскольку масштабирование влияет на изображения и границы в UserControl. Есть ли свойство, которое я могу установить на UserControl, чтобы отключить scalling? Если нет, то как я могу это сделать?

3 ответов


кроме того, DpiDecorator, вам также нужно будет исправить размер шрифта ваших элементов. Например, в Windows XP, если ваш параметр установлен на большие шрифты, размер шрифта элемента меню установлен на 14 и также масштабируется с помощью параметра DPI, так что если вы не исправить размер шрифта MenuItem или любой другой шрифт элемента пользовательского интерфейса, вы получите значение по умолчанию окна для этого типа элемента. Также помните, что пользователь может вручную изменить размер шрифта/начертание шрифта для других элементов...


вы можете уменьшить свой UserControl на основе текущей настройки DPI. Например, если вы обернули свой UserControl следующим DpiDecorator, то он должен выглядеть одинаково независимо от настройки DPI:

public class DpiDecorator : Decorator {

    public DpiDecorator() {
        this.Loaded += (s, e) => {
            Matrix m = PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice;
            ScaleTransform dpiTransform = new ScaleTransform(1 / m.M11, 1 / m.M22);
            if (dpiTransform.CanFreeze)
                dpiTransform.Freeze();
            this.LayoutTransform = dpiTransform;
        };
    }

}

или вы можете переместить эту логику в свой UserControl.

код для получения масштабного коэффициента DPI был из этого блоге.


Windows включает в себя помощник совместимости для багги приложений, которые терпят неудачу при настройках с высоким разрешением:

обязательно остановитесь (или выключите)"используйте масштабирование DPI в стиле Windows XP":

enter image description here

и убедитесь, что ваше приложение не имеет"dpiAware" запись в манифесте сборки.

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

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

Примечание: на dpiAware запись манифеста позволяет вашему приложению сообщать Windows, что оно хочет отказаться масштабирования dpi. Приложения добавляют этот элемент, только если они были протестированы с высоким разрешением.