【问题标题】:WPF: How to get the name of the control that fired an animation, from within the event handler?WPF:如何从事件处理程序中获取触发动画的控件的名称?
【发布时间】:2016-04-03 16:36:16
【问题描述】:

我正在使用 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;

【问题讨论】:

  • 我唯一能想到的就是在按下按钮时“记住”按钮。虽然这可能同样 hacky,但它不会受到您描述的错误的影响。
  • @ChrisF - 你能举个例子吗?

标签: c# wpf xaml


【解决方案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;
}

【讨论】:

  • 不,因为我需要仅在动画完成后触发处理程序:\。还有其他解决方案吗?谢谢。
猜你喜欢
  • 2022-11-19
  • 2015-02-02
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多