2009-07-14 5 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. Можете ли вы быть более конкретным? Как показать остальную часть вашей разметки; и скриншот, возможно, тоже поможет. –

+0

Я добавил скриншот. –

+0

выглядит нормально, просто donn указать свойство width в текстовое поле ... –

ответ

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 Property="Template" 
     Value="{DynamicResource TextBoxBaseControlTemplate1}"/> 
+0

Большое спасибо. Наконец, рабочее решение! У каменщика! –

+0

Это такой простой ответ Я хочу похлопать себя. – Xcalibur37

2

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

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

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

+0

Я пробовал без успеха :-(Те TextBoxes помещаются в грид. Может быть, проблема? Но для большинства текстовых ящиков я устанавливал Width = «Auto» или Width = «*» .. поэтому я не вижу смысла скрываться. –

+0

Хмм. Наличие текстовых полей в сетке не должно быть проблемой. Можете ли вы обновить свой вопрос с полным определением стиля? –

0

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

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

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

Надежда это помогает:

+0

Хм. уже все пробовал. Я думаю, что проблема должна быть где-то в другом месте. –

0

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

+0

Попробуйте уменьшить ширину и высоту текстового поля ... наблюдайте за любыми изменениями –