BorderThickness TextBox в WPF (ошибка?) - PullRequest
5 голосов
/ 08 ноября 2010

Я заметил странное поведение TextBox, в то время как свойство BorderThickness установлено в 1 - фокус заставляет границу менять цвет (на что-то вроде белого). Однако, если я установлю толщину границы, отличную от 1, скажем 0,99 или 1,01, проблема исчезнет.

Это ошибка в WPF? Или это предназначено?

1 Ответ

1 голос
/ 09 марта 2011

Это стандартное поведение стиля Aero для текстовых полей. Чтобы отключить его, вам нужно будет изменить стиль TextBox. Вы можете выбрать стили по умолчанию из здесь (см. Пример загрузки).

В стиле по умолчанию для TextBoxBase (на котором основан TextBox) вы увидите, что он использует ListBoxChrome. Этот элемент определен в сборке Presentation.Aero и отвечает за отображение «сфокусированного» вида. Вы можете просто удалить настройку RenderFocus и, возможно, RenderMouseOver или заменить ее на Border.

Тогда вы захотите включить это в ресурсы своего приложения.

<LinearGradientBrush x:Key="TextBoxBorder"
      StartPoint="0,0" EndPoint="0,20" MappingMode="Absolute">
  <LinearGradientBrush.GradientStops>
      <GradientStop Color="#ABADB3" Offset="0.05" />
      <GradientStop Color="#E2E3EA" Offset="0.07" />
      <GradientStop Color="#E3E9EF" Offset="1" />
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

<Style x:Key="{x:Type TextBoxBase}" TargetType="{x:Type TextBoxBase}" BasedOn="{x:Null}">
  <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
  <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" />
  <Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}" />
  <Setter Property="BorderThickness" Value="1" />
  <Setter Property="Padding" Value="1" />
  <Setter Property="AllowDrop" Value="true" />
  <Setter Property="FocusVisualStyle" Value="{x:Null}" />
  <Setter Property="Template">
      <Setter.Value>
          <ControlTemplate TargetType="{x:Type TextBoxBase}">
              <Border x:Name="Bd" BorderThickness="{TemplateBinding BorderThickness}"
                      BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"
                      SnapsToDevicePixels="true">
                  <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
              </Border >
              <ControlTemplate.Triggers>
                  <Trigger Property="IsEnabled" Value="false">
                      <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
                      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                  </Trigger>
              </ControlTemplate.Triggers>
          </ControlTemplate>
      </Setter.Value>
  </Setter>
</Style>
<Style x:Key="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBoxBase}}" TargetType="{x:Type TextBox}"/>

Если вы посмотрите на класс ListBoxChrome в Reflector (в частности, на метод OnRender), вы увидите, что он будет отображать только сфокусированный вид, если его BorderThickness равен «1,1,1,1».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...