Оказывается, это потому, что хотя окно, конечно, выровнено по границе пикселя, сетка внутри окна может не быть. Исправить это не слишком сложно, но может потребоваться некоторое время, чтобы понять, что делать.
Есть замечательная функция SnapsToDevicePixels, которая должна правильно выровнять все. И, к сожалению, по какой-то причине, это, кажется, не работает вообще (это, кажется, понятая ошибка). Так что же делать?
Во-первых, сетка должна быть выровнена по границе пикселей (то есть не по центру или что-то в этом роде, поскольку, если окно имеет нечетное количество пикселей в горизонтальном или вертикальном направлении, то сетка и, следовательно, содержимое сетки, будет смещено.)
Но есть и другие проблемы, с которыми нужно разобраться ... как только вы начнете прокручивать полосы прокрутки, артефакт снова появится! Это связано с тем, что полосы прокрутки не обязательно прокручивают содержимое целым числом пикселей. Чтобы справиться с этим, я фиксирую некоторые события в ScrollViewer, чтобы установить в месте прокрутки целочисленные значения.
private void workingAreaScrollViewer_SizeChanged(object sender, SizeChangedEventArgs e)
{
double w = e.NewSize.Width;
double h = e.NewSize.Height;
workingAreaScrollViewer.Width = Math.Round(w);
workingAreaScrollViewer.Height = Math.Round(h);
}
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.A)
{
workingAreaCanvas.Children.Remove(p2);
}
if (e.Key == Key.Z && p2.Parent != workingAreaCanvas)
{
workingAreaCanvas.Children.Add(p2);
}
}
Сделай это, и все вроде бы хорошо.
(Как примечание: для людей, у которых возникают проблемы с изображениями внутри ScrollViews ... если вы столкнулись с той же проблемой, это также следует исправить, если изображение не масштабируется, не поворачивается, и т.д. ... до тех пор, пока вы просто пытаетесь выровнять изображение по границе пикселя, это должно сработать.)