WPF:如何从事件处理程序中获取触发动画的控件的名称?

时间:2016-04-03 16:36:16

标签: c# wpf xaml

我正在使用DoubleAnimation在XAML中设置淡出动画。它会淡出Frame,然后在Completed事件结束时触发。

我想从事件处理程序中获取触发动画的控件的名称,但我无法找到方法。

XAML

<Button x:Name="btnNavMessages">
    <!-- Some Text-->
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.PreviewMouseDown">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation
                        Storyboard.TargetName="MichaelFrame"
                        Storyboard.TargetProperty="Opacity"
                        To="0"
                        Duration="0:0:1" 
                        Completed="DoubleAnimation_Completed" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Button.Triggers>
</Button>

代码隐藏

private void DoubleAnimation_Completed(object sender, EventArgs e)
{
    // How to find out which control fired the animation? e.g. "btnNavMessages"
    // Tried `Button btn = sender as Button;`
    // But `sender.ToString()` is `System.Windows.Media.Animation.AnimationClock`, not `Button`
}

任何帮助将不胜感激。感谢。

修改

我尝试过以下代码,但它确实有效,但它并不优雅。除了优雅之外,它还有一个令人讨厌的错误 - 当我点击按钮时,在动画期间按 tab ,焦点会改变,应用程序也会停止。还有其他解决方案吗?

Button btn = FocusManager.GetFocusedElement(this) as Button;

1 个答案:

答案 0 :(得分:1)

这可能是一个解决方案吗?

XAML 除去

Completed="DoubleAnimation_Completed"

修改

<Button x:Name="btnNavMessages" Click="btnNavMessages_Click"  >

代码隐藏

private void btnNavMessages_Click(object sender, RoutedEventArgs e)
{
    var btn = sender as Button;
}