Почему UseLayoutRounding не работает с Viewbox? - PullRequest
0 голосов
/ 07 декабря 2009

Я пытаюсь написать игру на основе тайлов в 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>

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

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

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

1 Ответ

3 голосов
/ 07 декабря 2009

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>
...