Почему UseLayoutRounding не работает с Viewbox?

Я пытаюсь написать игру на основе плитки в WPF 4. Я хочу, чтобы игровое поле масштабировалось по размеру окна, поэтому я использую Viewbox; но я хочу, чтобы каждая плитка располагалась на красивой четкой границе пикселей. Я могу ошибаться, но я так понимаю, что это то, для чего должно быть новое свойство UseLayoutRounding, но оно не работает так, как я ожидаю.

Вот окно, демонстрирующее проблему:

<Window x:Class="Tyler.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Width="600" Height="400" Background="Black">
    <Viewbox>
        <Canvas Width="1000" Height="1000">
            <Rectangle Canvas.Left="100" Canvas.Top="100"
                       Width="100" Height="100" Fill="Gray"/>
            <Rectangle Canvas.Left="200" Canvas.Top="100"
                       Width="100" Height="100" Fill="Gray"/>
        </Canvas>
    </Viewbox>
</Window>

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

Но UseLayoutRounding, похоже, не имеет такого эффекта. Я пытался установить UseLayoutRounding="True" для окна, окна просмотра, холста, прямоугольников — я даже пытался установить его для всех сразу. На шов не влияет.

Что я упускаю (или неправильно понимаю)? Как я могу заставить округление макета работать с Viewbox?


person Joe White    schedule 07.12.2009    source источник


Ответы (1)


SnapsToDevicePixels=True это то, что вы хотите

<Viewbox SnapsToDevicePixels="True" >
    <Canvas Width="1000" Height="1000">
        <Rectangle Canvas.Left="100" Canvas.Top="100"
                   Width="100" Height="100" Fill="Gray"/>
        <Rectangle Canvas.Left="200" Canvas.Top="100"
                   Width="100" Height="100" Fill="Gray"/>
    </Canvas>
</Viewbox>
person Simeon Pilgrim    schedule 07.12.2009
comment
Кажется, это делает то, что я хочу, но почему UseLayoutRounding не делает то же самое? Я хочу понять ULR, чтобы я тоже мог использовать Silverlight. Разве ULR не должен округляться до ближайшего пикселя? - person Joe White; 07.12.2009