Для тех, кто будет искать подобное решение:
Я не нашел способа заставить приложение не масштабироваться вместе с операционной системой, но нашел, как сохранить масштаб 1: 1.
Первое, что вам нужно сделать, это определить, что приложение поддерживает dpi, поэтому оно будет масштабироваться не системой, а самим приложением. Вот код app.manifest:
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
</windowsSettings>
</application>
</assembly>
Тогда вы сможете получить текущий масштаб для визуала:
double xScale = PresentationSource.FromVisual(someVisual).CompositionTarget.TransformToDevice.M11;
double yScale = PresentationSource.FromVisual(someVisual).CompositionTarget.TransformToDevice.M22;
И затем вы можете привязать преобразование макета к элементу управления (изображение в моем случае), чтобы отменить эффект масштабирования:
<Image.LayoutTransform>
<ScaleTransform ScaleX="{Binding ElementName=_this, Path=ScaleX}"
ScaleY="{Binding ElementName=_this, Path=ScaleY}" />
</Image.LayoutTransform>
Обратите внимание, что пропорции должны быть инвертированы, поэтому ScaleX и ScaleY будут иметь следующие значения:
ScaleX = 1 / scaleX;
ScaleY = 1 / scaleY;