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

本文关键字:动画 隐藏 代码 方法 Xaml 失败 如果 | 更新日期: 2023-09-27 18:20:41

我有一个带有按钮的登录表单(btnLogin)。当用户单击btnLogon时,会触发以下Storyboard以禁用BTnLogon、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中使用以下(脏?!)代码来重新启用btnLogon、txtUsername、pbPassword控件,以便可以重新输入详细信息。。。

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

我可以使用Xaml来处理重新启用吗?我相信我能,我就是不知道怎么做?!

谢谢你的帮助:


更新

我已经尝试过按照bars222的建议使用EnterActionsExitActions,但这种方法无法确定btnLogin_Click事件是导致登录成功还是失败。

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

如果我清楚地理解,您希望在登录尝试后将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}" />