5

我想覆盖 WPF 中的默认文本框边框。我有适用于所有文本框的这种风格。

<!-- 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 似乎都不同。一些边框丢失,或灰色.. 有谁知道为什么?

4

4 回答 4

7

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

<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 Property="Template" 
        Value="{DynamicResource TextBoxBaseControlTemplate1}"/>  
于 2009-07-14T10:31:50.130 回答
2

WPF 在将 UI 渲染到监视器时尝试独立于设备,除非您告诉它,否则不会绘制“像素完美”的东西。尝试将此添加到您的样式中:

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

这应该告诉 WPF 沿单个像素线渲染每个 1 像素厚的边框。

于 2009-07-14T08:59:06.663 回答
0

您需要执行以下操作来解决该问题...

  1. SnapsToDevicePixels="True"
  2. 不要指定宽度,用边距做

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

希望这可以帮助 :)

于 2009-07-14T09:17:59.217 回答
0

我认为左边框和上边框是样式化的,但右边框和下边框保持灰色,尽管我在样式中明确表示 BorderBrush=MyBrush。你怎么看?尝试从 TextBox中删除3D 效果怎么样?

于 2009-07-14T09:51:54.513 回答