BorderThickness为1渲染,厚度为2像素 - 我在这里缺少什么?

Mal*_*oss 7 wpf xaml rendering

我在XAML/WPF中有一个Border,我用它来给对话框中的文本标题提供一个全段宽的下划线.我将其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>
Run Code Online (Sandbox Code Playgroud)

我对WPF很新,所以我怀疑我遗漏了一些关于它的渲染模型的基础知识.

  • 边框渲染是否在像素边界上?似乎不是这样,因为我认为如果是这样的话会部分透明.
  • 有没有办法保证我能得到我所要求的厚度?
  • 我甚至犯了嚎叫错误吗?

作为参考,我没有应用缩放变换(或任何其他类型的变换).任何帮助,将不胜感激.:)

小智 9

我认为你要找的是在你的XAML中设置这个属性:

SnapsToDevicePixels = "真"

参考:http://msdn.microsoft.com/en-us/library/vstudio/aa970908( v = vs.90).aspx


Gra*_*meF 6

元素占用的像素数取决于几个因素,包括:

  • 屏幕的DPI
  • 元素或其任何祖先的变换
  • 它相对于屏幕的像素边界呈现的位置

您使用的数字应该被认为是相对于彼此而不是绝对值,就它们的呈现方式而言.

话虽如此,WPF 4.0将包括布局舍入,您可以使用它来减少应该是相同厚度的线根据它们是否恰好穿过像素边界而呈现不同的情况.

  • 实际上,仅仅在Border上设置SnapsToDevicePixels似乎已经达到了我想要的效果.我的下划线现在都是1像素厚,漂亮而清脆. (4认同)