【问题标题】:How to make button and background flash in wpf如何在wpf中使按钮和背景闪烁
【发布时间】:2016-03-04 15:50:25
【问题描述】:

问题


我遇到的问题是,当用户单击一个按钮时,我希望该按钮开始从 100% 可见到大约 20% 可见闪烁,并且 WPF 窗口的背景将颜色从 #ffffff 更改为 #d6786a 和这应该会发生,直到再次单击该按钮。然后动画应该停止。

代码


我已经做了一些挖掘,以找到 somone 在哪里做了这件事,但我似乎什么也看不到。我目前的代码如下。

这是我想要在单击时从 100% 可见到 20% 可见的按钮:

<Button Name="button2" Style="{DynamicResource NoChromeButton}" Visibility="{Binding VisableState, Converter={StaticResource BoolToVis}}" ToolTip="Start Live Stream" Command="{Binding PlayStream}" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="5" Height="22" Width="22" >
    <Image Source="../Images/recordicon.png"/>
</Button>

我尝试在按钮中添加情节提要,但没有成功:

<Button.Triggers>
  <EventTrigger RoutedEvent="Button.Click">
    <EventTrigger.Actions>
      <BeginStoryboard>
        <Storyboard BeginTime="00:00:00" 
                                RepeatBehavior="Forever" 
                                Storyboard.TargetName="button2" 
                                Storyboard.TargetProperty="(Visibility)">
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger.Actions>
  </EventTrigger>
</Button.Triggers>

我是 WPF 新手,所以进入动画对我来说比较困难。如果有人能在这个阶段给我一点帮助,那就太好了。

【问题讨论】:

    标签: c# wpf xaml animation wpf-controls


    【解决方案1】:

    例如像这样在资源中定义动画

    <Window x:Name="window" x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Storyboard x:Key="FlashButton" RepeatBehavior="Forever">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="button">
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0.2"/>
                <EasingDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
        <Storyboard x:Key="ChangeColor">
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="grid">
                <EasingColorKeyFrame KeyTime="0:0:1" Value="Red"/>
            </ColorAnimationUsingKeyFrames>
        </Storyboard>
        <Storyboard x:Key="ChangeColor2">
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="grid">
                <EasingColorKeyFrame KeyTime="0:0:1" Value="White"/>
            </ColorAnimationUsingKeyFrames>
        </Storyboard>
    </Window.Resources>
    <Grid x:Name="grid" Background="White">
        <Button x:Name="button" Content="Button" Margin="10,10,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75" Click="button_Click"/>
    
    </Grid>
    

    并为按钮单击创建处理程序

            private bool isRunning;
        private void button_Click(object sender, RoutedEventArgs e)
        {
            var flashButton = FindResource("FlashButton") as Storyboard;
            var changeColor = FindResource("ChangeColor") as Storyboard;
            var changeColor2 = FindResource("ChangeColor2") as Storyboard;
    
            if (isRunning)
            {
                flashButton.Stop();
                changeColor2.Begin();
                isRunning = false;
            }
            else
            {
                flashButton.Begin();
                changeColor.Begin();
                isRunning = true;
            }
        }
    

    【讨论】:

    • 感谢您的回答,代码似乎工作正常。我可以从 ViewModel 调用 FindResource 吗?而不是背后的代码?
    • 当我开始使用changeColor stroyboard 时,我也会得到'Background' property does not point to a DependencyObject in path '(0).(1)'.
    • ofc not... 在这种情况下,您需要以不同的方式进行操作。例如创建两个事件 BeginAlert、EndAlert 并在您的 VM 中引发它们,您的视图应该订阅这些事件并相应地对它们做出反应。
    • @BenClarke 并且您在该视图中有名为 grid 的网格吗?如果您只是复制并使用我的代码,一切都应该可以正常工作。
    • 我没有将背景添加到网格中,这就是它不起作用的原因。感谢您的帮助。
    【解决方案2】:

    要将“可见性更改为 20% 左右”,您必须 动画 Opacity 属性(double 类型从 0.01.0)而不是 @ 987654327@(enum 有 3 个值,请参阅 msdn)。

    如果你可以使用ToggleButton(因为它很好的CheckedUnckecked 路由事件),这个目标很容易实现:

    <ToggleButton>
        <ToggleButton.Triggers>
            <EventTrigger RoutedEvent="ToggleButton.Checked">
                <BeginStoryboard x:Name="storyboard">
                    <Storyboard RepeatBehavior="Forever"
                                AutoReverse="True">
                        <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                         To="0.2"
                                         Duration="0:0:1" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <EventTrigger RoutedEvent="ToggleButton.Unchecked">
                <StopStoryboard BeginStoryboardName="storyboard" />
            </EventTrigger>
        </ToggleButton.Triggers>
    </ToggleButton>
    

    【讨论】:

      猜你喜欢
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2015-09-29
      • 2018-01-30
      相关资源
      最近更新 更多