Проблема безобразных границ WPF TextBox - PullRequest
4 голосов
/ 14 июля 2009

Я хочу переопределить границы TextBox по умолчанию в 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 ]

7 голосов
/ 14 июля 2009

Вы можете попробовать отредактировать шаблон для текстовых полей и изменить имя границы 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 Property="Template" 
        Value="{DynamicResource TextBoxBaseControlTemplate1}"/>  
2 голосов
/ 14 июля 2009

WPF пытается быть независимым от устройства при рендеринге пользовательского интерфейса на монитор и не будет рисовать вещи «безупречно», если вы не скажете это Попробуйте добавить это в свой стиль:

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

Это должно сказать WPF визуализировать каждую границу толщиной в 1 пиксель вдоль одной линии пикселя.

0 голосов
/ 14 июля 2009

Я думаю, что левая граница и верхняя граница стилизованы, но правая и нижняя граница остаются серыми, хотя я явно сказал в стиле, что BorderBrush = MyBrush. Как вы думаете? Как насчет попытки удалить 3D-эффект из TextBox?

0 голосов
/ 14 июля 2009

Вам нужно сделать следующее, чтобы решить эту проблему ...

  1. SnapsToDevicePixels="True"
  2. Не указывайте ширину, сделайте это с полями

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

Надеюсь, это поможет:)

...