Проблема и намерения
Я пытаюсь создать стиль TextBox
с тенью.Непрозрачность тени должна немного увеличиться при наведении курсора мыши, а затем еще больше при фокусировке TextBox
.
В настоящее время в стиле TextBox настроены два триггера: триггер IsMouseOver
иIsFocused
триггер.Оба они прекрасно работают независимо друг от друга;однако, когда они соединены вместе, возникают некоторые проблемы.IsMouseOver
работает только до срабатывания триггера IsFocused
.После этого IsMouseOver
больше не работает.
Код
<Style TargetType="TextBox">
<Style.Resources>
<Storyboard x:Key="ShowShadow">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Effect).Opacity">
<SplineDoubleKeyFrame KeyTime="0:0:0.1" Value="0.5"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="HideShadow">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Effect).Opacity">
<SplineDoubleKeyFrame KeyTime="0:0:0.1" Value="0.3"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="MaxShadow">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Effect).Opacity">
<SplineDoubleKeyFrame KeyTime="0:0:0.1" Value="0.7"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Style.Resources>
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect ShadowDepth="1" BlurRadius="6" Opacity="0.3"></DropShadowEffect>
</Setter.Value>
</Setter>
<!-- other styles such as font, color etc removed -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border Background="{TemplateBinding Background}" x:Name="Bd" BorderThickness="0" CornerRadius="4" BorderBrush="{StaticResource BorderColorBrush}">
<ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Auto" x:Name="PART_ContentHost" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard
Storyboard="{StaticResource ShowShadow}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard
Storyboard="{StaticResource HideShadow}"/>
</Trigger.ExitActions>
</Trigger>
<Trigger Property="IsFocused" Value="True">
<Trigger.EnterActions>
<BeginStoryboard
Storyboard="{StaticResource MaxShadow}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard
Storyboard="{StaticResource HideShadow}"/>
</Trigger.ExitActions>
</Trigger>
</Style.Triggers>
</Style>
Ожидаемое и фактическое поведение
Ожидаемое
- Пользователь наводит курсор наTextBox и непрозрачность тени падают немного к правильному значению.
- Пользователь нажимает на TextBox, чтобы ввести его, и непрозрачность тени еще больше увеличивается до правильного значения.
- Пользовательщелкает в другом месте и TextBox теряет фокус.Непрозрачность возвращается к исходному значению.
- Пользователь наводит курсор на TextBox, и непрозрачность тени слегка увеличивается до правильного значения.
- Пользователь нажимает на TextBox, чтобы ввести его иНепрозрачность тени уменьшается еще больше до правильного значения.
Actual
- Пользователь наводит курсор на TextBox, и непрозрачность тени слегка увеличивается до правильного значения.
- Пользователь нажимает на TextBox, чтобы ввести его, и непрозрачность тени еще больше увеличивается до правильного значения.
- Пользователь щелкает в другом месте, и TextBox теряет фокус.Непрозрачность возвращается к исходному значению.
- Пользователь снова наводит курсор на TextBox - ничего не происходит.
- Пользователь нажимает на TextBox - непрозрачность увеличивается до правильногозначение.
То, что я пробовал
- Использование триггера
IsKeyboardFocused
вместо IsFocused
- Замена порядка двух триггеров
- Thisфактически создало больше проблем - триггер
IsFocused
вообще не работал.
Видео проблемы
https://youtu.be/LT7fWA6uRLo
Обратите внимание, что я сделалпоэтому при нажатии на основной Window
он будет фокусироваться на основном Grid
.Вот так TextBox теряет фокус, когда я нажимаю на пустое место.