Я думаю, вы можете сделать это.
onBlur = () => {
this.setState(prevState => ({ lastNumber: prevState.selectedNumber }));
}
onChange = (e) => {
this.setState({ selectedNumber: e.target.value });
}
Теперь, каждый раз, когда фокус размыт от ввода, ваш lastNumber обновляется. И при нажатии кнопки отмены все должно работать нормально. Надеюсь это работает. Удачного кодирования :)
Я предложил решение, которое выглядит довольно хорошим. Некоторый демонстрационный XAML, что я записал на свой счет в Смешении 2,0 SP1, похож на это:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ScreenGlintApplication.Window1"
x:Name="Window"
Title="Window1"
Width="500" Height="250" Background="#FF000000" Foreground="#FF3EE229" >
<Grid x:Name="LayoutRoot">
<TextBlock TextWrapping="Wrap" FontSize="40" >
<Run Text="This is some sample text to have something to work with. Have a nice day! /Johan"/>
</TextBlock>
<Canvas Panel.ZIndex="99" >
<Rectangle x:Name="ScreenGlintRect"
Width="{Binding Path=ActualWidth, ElementName=Window, Mode=Default}"
Height="{Binding Path=ActualHeight, ElementName=Window, Mode=Default}"
Opacity="0.4" >
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="ScreenGlintRect"
Storyboard.TargetProperty="(Canvas.Left)"
From="-500" To="1000" Duration="0:0:2" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,1" EndPoint="1,1">
<GradientStop Color="Transparent" Offset="0.0" />
<GradientStop x:Name="GlintColor" Color="LightGreen" Offset="0.50" />
<GradientStop Color="Transparent" Offset="1" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Canvas>
</Grid>
</Window>
Опция состоит в том, чтобы сделать это в коде позади, который крут, если Вы хотите иметь детализированный контроль над анимацией. Например:
ScreenGlintRect.Width = Width;
ScreenGlintRect.Height = Height;
var animation = new DoubleAnimation
{
Duration = new Duration(TimeSpan.FromSeconds(2)),
From = (-Width),
To = Width * 2
};
ScreenGlintRect.BeginAnimation(Canvas.LeftProperty, animation);
Это - код, который я использую, и это выглядит достаточно хорошим для меня. Если бы Вы получили ускорение HW, то Вы могли бы попытаться добавить некоторую размытость к нему. Вам, вероятно, придется настроить код и скрыться/показать прямоугольник, но в основном это - он.
Вы можете поместить прозрачную панель на вершину как сказанный LBugnion, но не забываете, что существует много способов, которыми можно сделать это:
Если Вы только изменяете Альфу, это все еще активируемо по щелчку, даже когда Вы не видите цвета.
Вне темы, но: попытайтесь сделать эффект тонким и возможно иметь опцию включения - выключения.
Легко поместить любую прозрачную панель "в вершину" основной Сетки и анимировать элемент, помещенный в панель. Для размещения панели "в вершину" просто поместите его в конце иерархии XAML после любого другого элемента. С другой стороны, можно использовать свойство "ZIndex".
Laurent
Присоединенный к этой статье о progressbars пример кода, который имеет индикатор выполнения стиля Vista, который имеет вспышку стиля Vista. Это использует Границу и Кисть и Преобразователь для создания анимаций. Я не могу сказать, что полностью понимаю все там, но это работает отлично. Должно быть легко скопировать в Ваши потребности.