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

时间:2009-12-10 11:58:50

标签: 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>

我对WPF很陌生,所以我怀疑我遗漏了一些关于渲染模型的基本信息。

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

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

2 个答案:

答案 0 :(得分:8)

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

SnapsToDevicePixels = “真”

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

答案 1 :(得分:6)

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

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

您使用的数字应该被认为是彼此相对的,而不是根据它们的呈现方式的绝对值。

话虽如此,WPF 4.0将包含Layout Rounding,您可以使用它来减少应该具有相同厚度的线根据它们是否恰好穿过像素边界而呈现不同的情况。 / p>