2009-07-14 47 views
4

我想覆盖WPF中的默认TextBox边框。我有这种适用于所有文本框的样式。WPF TextBox难看的边框问题

<!-- StyleTextBox--> 
<Style x:Key="StyleTextBox" TargetType="{x:Type TextBox}"> 
    <Setter Property="MinHeight" Value="20" /> 
    <Setter Property="HorizontalAlignment" Value="Left"/> 
    <Setter Property="Margin" Value="3"/> 
    <Setter Property="IsEnabled" Value="{DynamicResource WriteAble}"/> 
    <Setter Property="SnapsToDevicePixels" Value="True" /> 
    <Setter Property="VerticalContentAlignment" Value="Top" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="BorderBrush" Value="{StaticResource ButtonFont_DarkGray}" /> 
    <Style.Triggers> 
     <!--Resolves multiline textbox vertical alignment problem--> 
     <Trigger Property="TextWrapping" Value="NoWrap"> 
      <Setter Property="VerticalContentAlignment" Value="Center" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

我加了SnapsToDevicePixels="True"在液晶显示器上正确显示边框。

但是,每个TextBox看起来都不一样。有些边界缺失,或灰色.. 有谁知道为什么?

+0

我不能重现XamlPad效果。你能更具体地了解它吗?就像显示其余的标记一样;并且截图也可能有帮助。 – 2009-07-14 08:10:34

+0

我添加了一个截图。 – 2009-07-14 08:53:50

+0

看起来不错,只是donn指定宽度属性文本框... – 2009-07-14 09:34:27

回答

7

您可以尝试编辑文本框的模板,并将边框名称Bd更改为“真实”边框而不是镀铬边框。就像这样:

<ControlTemplate x:Key="TextBoxBaseControlTemplate1" 
      TargetType="{x:Type TextBoxBase}"> 
    <Border x:Name="Bd" SnapsToDevicePixels="True" 
      Background="{TemplateBinding Background}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      BorderThickness="{TemplateBinding BorderThickness}" > 
    <ScrollViewer x:Name="PART_ContentHost" 
       SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
    </Border> 
    <ControlTemplate.Triggers> 
    <Trigger Property="IsEnabled" Value="False"> 
     <Setter Property="Background" TargetName="Bd" 
      Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
     <Setter Property="Foreground" 
      Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
    </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

此setter添加到您的风格,使模板:

<Setter Property="Template" 
     Value="{DynamicResource TextBoxBaseControlTemplate1}"/> 
2

当向显示器渲染UI时,WPF尝试与设备无关,除非您告诉它,否则不会绘制“像素完美”的东西。尝试添加到您的风格:

<Setter Property="SnapsToDevicePixels" Value="True" /> 

这应该告诉WPF沿单个像素线呈现每个1像素厚的边界。

+0

我试过没有成功:-(那些文本框被放置在一个网格中,可能是一个问题?但对于大多数文本框我设置宽度=“自动”或宽度=“*”..所以我没有看到隐藏点 – 2009-07-14 09:16:31

+0

嗯,在网格中放置文本框应该不是问题,你可以用完整的样式定义来更新你的问题吗? – 2009-07-14 09:18:30

0

你需要做以下内容来解决这个问题......

  1. SnapsToDevicePixels="True"
  2. 不要指定宽度,随着利润率

    <Setter Property="BorderBrush" HorizontalAlignment="Left" Margin="2,2,2,2" Value="{StaticResource DarkGray}" />

希望这会做到这一点帮助:)

0

我认为左边框和上边框是样式的,但是右边框和边框边框保持灰色,尽管我在Style中明确指出BorderBrush = MyBrush。 你觉得呢?怎么样从TextBox中删除3D效果