反向触发动画如果方法失败使用Xaml,而不是代码

时间:2015-11-05 09:48:32

标签: c# wpf xaml storyboard eventtrigger

我有一个带按钮的登录表单( btnLogin )。当用户点击 btnLogin 时,会触发以下Storyboard以禁用 btnLogin,txtUsername,pbPassword ...

<EventTrigger RoutedEvent="Button.Click">
    <EventTrigger.Actions>
        <BeginStoryboard>
            <Storyboard>
                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsEnabled" FillBehavior="HoldEnd">
                    <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False" />
                </BooleanAnimationUsingKeyFrames>
                <BooleanAnimationUsingKeyFrames Storyboard.TargetName="txtUsername" Storyboard.TargetProperty="IsEnabled" FillBehavior="HoldEnd">
                    <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False" />
                </BooleanAnimationUsingKeyFrames>
                <BooleanAnimationUsingKeyFrames Storyboard.TargetName="pbPassword" Storyboard.TargetProperty="IsEnabled" FillBehavior="HoldEnd">
                    <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False" />
                </BooleanAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger.Actions>
</EventTrigger>

...当Storyboard运行时,Button.Click事件也会附加到btnLogin_Click方法,该方法会验证用户凭据。足够公平!

目前,如果登录尝试失败,我必须在btnLogin_Click中使用以下(脏?!)代码重新启用 btnLogin,txtUsername,pbPassword 控件,以便详细说明可以重新进入...

btnLogin.Triggers.Clear();
btnLogin.BeginAnimation(UIElement.IsEnabledProperty, null);
txtUsername.BeginAnimation(UIElement.IsEnabledProperty, null);
pbPassword.BeginAnimation(UIElement.IsEnabledProperty, null);

我可以使用Xaml来处理这种重新启用吗?我确定我可以,我只是想不通怎么做?!

感谢您的帮助:O)

更新

我已尝试使用条形码222建议的EnterActionsExitActions,但此方法无法确定btnLogin_Click事件是否导致登录成功或失败。

1 个答案:

答案 0 :(得分:1)

如果我清楚地了解,您希望在登录尝试后将IsEnabled设置为true。在这种情况下,您可以使用EventTrigger.EnterActionsEventTrigger.ExitActions触发器。这里有一些例子。

<EventTrigger RoutedEvent="Button.Click">
    <EventTrigger.EnterActions>
        <BeginStoryboard>
            <Storyboard>
                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsEnabled" FillBehavior="HoldEnd">
                    <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False" />
                </BooleanAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger.EnterActions>
    <EventTrigger.ExitActions>
        <BeginStoryboard>
            <Storyboard>
                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsEnabled" FillBehavior="HoldEnd">
                    <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="True" />
                </BooleanAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger.ExitActions>
</EventTrigger>

<强>更新

数据绑定解决方案。您可以创建一些表示授权过程的属性。您应该在身份验证过程中更新此信息。

private bool _isAuth;
public bool IsAuth
{
    get { return _isAuth; }
    set { _isAuth = value; NotifyPropertyChanged( "IsAuth" ); }
}

#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
protected void NotifyPropertyChanged( String info )
{
    if ( PropertyChanged != null )
    {
        PropertyChanged( this, new PropertyChangedEventArgs( info ) );
    }
}

您应该设置DataContext这些元素。例如,如果您在授权窗口中创建了属性。你可以用构造函数编写。

this.DataContext = this;

并将其绑定到您的元素以启用/禁用它。

<Button Click="Button_Click" IsEnabled="{Binding IsAuth}" />