BorderThickness 1 рендерит с толщиной 2 пикселя — что мне здесь не хватает?

У меня есть граница в XAML/WPF, которую я использую для подчеркивания полной ширины абзаца текстовых заголовков в диалоговом окне. Я установил для его свойства BorderThickness значение «0,0,0,1». В некоторых местах он отображается с подчеркиванием толщиной в 2 пикселя, в то время как в других он правильно отображается как подчеркивание в один пиксель. Что я делаю неправильно?

Вот шаблон элемента управления, который я использую для замены визуального дерева моей метки (я бы подумал, что использование шаблона несущественно):

<ControlTemplate x:Key="HeaderTemplate" TargetType="{x:Type Label}">
<Border BorderThickness="0,0,0,1" Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Margin}">
  <Border.BorderBrush>
    <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
      <GradientStop Offset="0" Color="Black"/>
      <GradientStop Offset="0.6" Color="Black"/>
      <GradientStop Offset="1" Color="Transparent"/>
    </LinearGradientBrush>
  </Border.BorderBrush>
  <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" Style="{StaticResource HeaderStyle}"
             Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Padding}"/>
</Border>
</ControlTemplate>

Я новичок в WPF, поэтому подозреваю, что мне не хватает чего-то фундаментального в его модели рендеринга.

  • Отрисовывается ли граница за границей пикселя? Так не кажется, так как я думал, что это будет частично прозрачно, если это так.
  • Есть ли способ гарантировать, что я получу то, что я прошу с точки зрения толщины?
  • Я хоть ошибся?

И для справки, я не применяю преобразование масштабирования (или любое другое преобразование в этом отношении). Любая помощь будет оценена. :)


person Mal Ross    schedule 10.12.2009    source источник


Ответы (2)


Количество пикселей, которые занимает элемент, будет зависеть от нескольких факторов, в том числе:

  • DPI экрана
  • Преобразования элемента или любого из его предков
  • Где он отображается по отношению к границам пикселей экрана

Числа, которые вы используете, следует рассматривать как относительные друг к другу, а не как абсолютные значения с точки зрения того, как они отображаются.

При этом WPF 4.0 будет включать Округление макета, которое можно использовать для уменьшения количества случаев, когда линии, которые должны быть одинаковой толщины, отображаются по-разному в зависимости от того, пересекают ли они границу пикселя или нет. .

person GraemeF    schedule 10.12.2009
comment
Итак, мы говорим, что на данный момент я должен отказаться от своего желания контролировать вещи настолько строго, насколько я могу, скажем, с помощью HTML и CSS? :) - person Mal Ross; 10.12.2009
comment
Я работал над довольно сложным элементом управления в течение нескольких дней, и он постоянно расстраивает меня, размазывая цвета границ и т. Д. Первый вопрос, на который я смотрю, имеет ответ, и, хотя моя навязчивая природа говорит мне, что ДОЛЖЕН быть обходной путь , я ценю понимание. Спасибо! - person Brad; 10.12.2009
comment
На самом деле, просто установив SnapsToDevicePixels на границе, я достиг того, чего хотел. Мои подчеркивания теперь все толщиной в 1 пиксель, красивые и четкие. - person Mal Ross; 17.12.2009

Я думаю, что вы ищете, чтобы установить это свойство в вашем XAML:

SnapsToDevicePixels="True"

Ссылка: Привязка пикселей Приложения WPF: .NET 3.5

person Sam L.    schedule 17.01.2014
comment
Silverlighters идут сюда - stackoverflow.com/questions/6182320/ - person Hoody; 12.02.2015
comment
это не сработало для меня. все еще показывает разную толщину - person baye dbest; 01.09.2020