Получение четких линий в WPF может быть довольно сложным! А иногда ... кажется, что для этого нужно немного черной магии!
Я думаю, что ответы Фоеле и Кимке указывают в правильном направлении. То есть, часто вам захочется поместить однопиксельные линии на границе 0,5 пикселя ... учитывая то, как она рисует линию (половина на одной стороне и половина на другой).
Однако, это не всегда так просто. Например, это также зависит от окружающего xaml . Например, попробуйте этот код и измените размер, когда вы делаете:
<Canvas HorizontalAlignment="Center" VerticalAlignment="Center">
<Line X1="0" Y1="5" X2="200" Y2="5" StrokeThickness="1" Stroke="Black" UseLayoutRounding="True"/>
<Line X1="0" Y1="15" X2="200" Y2="15" StrokeThickness="1" Stroke="Black" UseLayoutRounding="True"/>
</Canvas>
Затем попробуйте этот код (снова измените размер, когда вы это сделаете):
<Canvas HorizontalAlignment="Center" VerticalAlignment="Center" UseLayoutRounding="True">
<Line X1="0" Y1="5" X2="200" Y2="5" StrokeThickness="1" Stroke="Black"/>
<Line X1="0" Y1="15" X2="200" Y2="15" StrokeThickness="1" Stroke="Black"/>
</Canvas>
Единственное различие между двумя фрагментами заключается в том, что первый использует UseLayoutRounding для строк, а второй использует UseLayoutRounding для контейнера Canvas (который затем также наследует свойство для строк).
Однако эта разница дает некоторые интересные результаты. Когда UseLayoutRounding используется в контейнере, отдельные пиксельные линии постоянно остаются растянутыми на 2 пикселя, и они не перемещаются. Когда UseLayoutRounding используется на линиях напрямую, и вы изменяете размер, линии иногда будут иметь резкость 1 пиксель ... а в других случаях будет превышать 2 пикселя.
И это подводит меня к примеру xaml в оригинальном вопросе. Несколько комментариев по этому поводу:
- Прежде всего, вы должны понимать, что оба свойства UseLayoutRounding и SnapsToDevicePixels наследуются. То есть, если вы используете его в контейнере макета, он наследует элементы в контейнере макета.
- UseLayoutRounding и SnapsToDevicePixels не обязательно должны использоваться вместе. Они могут быть ... но я обычно пытаюсь использовать их по отдельности ... либо один, либо другой. Более подробная информация здесь: Когда мне следует использовать SnapsToDevicePixels в WPF 4.0?
- Параметры TextOptions.TextFormattingMode влияют на текст, а не на строки.
- Эта StackPanel, которую вы используете в качестве контейнера макета, также может влиять на расположение линий. Canvas позволяет более точно управлять позициями ваших линий. StackPanel просто разместит одну строку за другой ... и может привести к неожиданным результатам.
Больше информации, чем хотел оригинальный плакат. Тем не менее, я лично знаю, как сложно получить четкие линии в WPF. Надеюсь, эта информация кому-нибудь поможет!