Я столкнулся с проблемой растровых изображений в WPF.Когда контейнер изображения начинается с позиции, которая не является целым числом, изображение, похоже, не соответствует значению SnapsToDevicePixels
.
Пример кода:
<Window x:Class="BlurryImage.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="110" Width="200">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<Button SnapsToDevicePixels="True">
<Image SnapsToDevicePixels="True" Source="i16.png" Stretch="None"/>
</Button>
<Button SnapsToDevicePixels="True" Margin="10.333333,0,0,0">
<Image SnapsToDevicePixels="True" Source="i16.png" Stretch="None"/>
</Button>
</StackPanel>
</Window>
(Обратите внимание на значениелевого поля: 10,333333.)
Здесь изображение i16.png
представляет собой простое растровое изображение 16x16 с разрешением 96 DPI с тонкими вертикальными линиями:
.(У меня разрешение системы 96 DPI, Windows XP, .NET 4)
Когда я запускаю программу, первое изображение получается резким, а второе - размытым: ![blurry image screenshot](https://i.stack.imgur.com/IepMG.png)
ДругойИсточники, в том числе некоторые из них, посвященные stackoverflow, предлагают различные обходные пути.(Например, эти сообщения: [1] , [2] и [3] .) Я попробовал обходные пути, и они, кажется, работают.Использование UseLayoutRounding="true"
в главном окне делает оба изображения четкими.Использование RenderOptions.BitmapScalingMode="NearestNeighbor"
на изображении также делает его резким.
Вопрос в том, почему SnapsToDevicePixels="True"
не работает без обходных путей?Это ошибка в WPF или я использую ее неправильно?