Удалить по умолчанию эффект наведения мыши / фокусировки на текстовые поля - PullRequest
15 голосов
/ 19 июня 2011

Я создал своего рода TextBox в Expression Blend. Я изменил заливку фона и границы на градиент и добавил эффект тени.

Я заметил, что при наведении курсора или наведении курсора на TextBox некоторые настройки по умолчанию / (стиль?) WPF вступают во владение, и моя граница изменяется.

Мне было интересно, можно ли было как-то предотвратить или помешать WPF изменить мой стиль TextBox es, когда я фокусируюсь или налагаю на него курсор мыши. Возможно ли это?

Ответы [ 3 ]

19 голосов
/ 05 ноября 2016

Более простое решение - просто установить толщину границы texbox равной 0, а затем обернуть texbox своей собственной границей:

<Border BorderBrush="LightGray" BorderThickness="1">
   <TextBox Text="{Binding OutlinePlain, Mode=TwoWay, NotifyOnTargetUpdated=True}"
                         BorderThickness="0"                                
   </TextBox>
</Border>
18 голосов
/ 19 июня 2011

Вы должны использовать новый шаблон:

<Style TargetType="{x:Type TextBox}">
  <Setter Property="SnapsToDevicePixels" Value="True"/>
  <Setter Property="OverridesDefaultStyle" Value="True"/>
  <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
  <Setter Property="AllowDrop" Value="true"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type TextBoxBase}">
        <Border 
          Name="Border"
          CornerRadius="2" 
          Padding="2"
          Background="#FFFFFF"
          BorderBrush="#888888"
          BorderThickness="1" >
          <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsEnabled" Value="False">
            <Setter TargetName="Border" Property="Background" Value="#EEEEEE"/>
            <Setter TargetName="Border" Property="BorderBrush" Value="#EEEEEE"/>
            <Setter Property="Foreground" Value="#888888"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Я удалил триггер IsMouseOver

для получения дополнительной информации см. Здесь: Стили и шаблоны TextBox

2 голосов
/ 19 июня 2011

Устанавливает ли пользовательский стиль для свойства OverridesDefaultStyle значение true?Я считаю, что это должно предотвратить отображение значений по умолчанию из стиля по умолчанию.

Если это так, и это не работает (или вы хотите использовать собственную рамку), все, что я могу думатьявляется то, что вам нужно будет переопределить механизм стилей по умолчанию для события соответствующего свойства, используя Trigger в вашем Style / ControlTemplate:

<Style x:Key="Triggers" TargetType="TextBox">
  <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="true">
        <Setter Property = "BorderBrush" Value="{Binding ToYourBorder}"/>
    </Trigger>
  </Style.Triggers>
</Style>
...