The opacity mask is not very good, as it changes the opacity. In addition, opacitymask can be any brush, it should not be a gradient.
You can do one of two things: manipulate the current brush or add a black rectangle over the control and change the opacity of the rectangle.
If you let me know what you prefer, I can write code.
( , xaml?)
<Window x:Class="TestWpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestWpfApplication"
Title="MainWindow"
Height="350"
Width="525">
<StackPanel>
<Grid>
<TextBox Background="Red"
FontSize="24" />
<Rectangle x:Name="overlay"
Fill="Black"
IsHitTestVisible="False"
Opacity="0" />
<Grid.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation To="0.9"
Duration="0:0:0.2"
Storyboard.TargetName="overlay"
Storyboard.TargetProperty="(Rectangle.Opacity)" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation To="0"
Duration="0:0:0.2"
Storyboard.TargetName="overlay"
Storyboard.TargetProperty="(Rectangle.Opacity)" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
</Grid>
</StackPanel>
</Window>