Удалить эффект mouseover/focus по умолчанию для текстовых полей в WPF?
Я создал своего рода пользовательский TextBox в Expression Blend. Я изменил заливку фона и границы на градиент и добавил эффект тени.
Я заметил, что когда я наводил курсор мыши или фокусировал свой TextBox, меняет поведение по умолчанию/(стиль?) WPF и меняет границу.
Мне было интересно, не было ли вообще что-то предотвратить или остановить WPF от изменения стиля TextBoxes, когда я фокусируюсь или наводил на него курсор. Возможно ли это?
Ответы
Ответ 1
Пользовательский стиль устанавливает для свойства 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>
Ответ 2
Вы должны использовать новый шаблон:
<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
Ответ 3
Более простое решение - это просто установить толщину границы текста texbox равным 0, а затем обернуть texbox на вашу собственную границу:
<Border BorderBrush="LightGray" BorderThickness="1">
<TextBox Text="{Binding OutlinePlain, Mode=TwoWay, NotifyOnTargetUpdated=True}"
BorderThickness="0"
</TextBox>
</Border>