代码之家  ›  专栏  ›  技术社区  ›  wpfwannabe

依赖项属性值优先级和动画

  •  1
  • wpfwannabe  · 技术社区  · 14 年前

    我正在使用 DoubleAnimation . 在触发动画之前,任何本地或 Setter ClearValue InvalidateProperty 打电话也一样 SetValue

    有办法纠正这种行为吗?我想使用动画更改属性值,但仍然可以手动或通过 去做任何事。我知道一两件事 Dependency Property Value Precedence 但我现在的行为有点奇怪。我不想用“手动动画”。

    编辑:添加了示例XAML+代码。

    <Window x:Class="WpfApplication7.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window1" Height="300" Width="300"
            x:Name="_this"
            Background="Red">
        <DockPanel>
            <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" HorizontalAlignment="Center" >
                <Button Click="ToggleOnClick">Toggle!</Button>
                <Button Click="SetHalfOnClick">Set to 0.5!</Button>
            </StackPanel>
            <TextBox DockPanel.Dock="Bottom" IsReadOnly="True" Text="{Binding ElementName=_viewbox,Path=Opacity}" />
            <Viewbox x:Name="_viewbox">
                <Viewbox.Style>
                    <Style TargetType="{x:Type FrameworkElement}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=IsToggled,ElementName=_this,Mode=OneWay}" Value="True">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation To="0.2"
                                                     Duration="0:0:0.5"
                                                     Storyboard.TargetProperty="(UIElement.Opacity)" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.EnterActions>
                                <DataTrigger.ExitActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation To="1"
                                                     Duration="0:0:0.5"
                                                     Storyboard.TargetProperty="(UIElement.Opacity)" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.ExitActions>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Viewbox.Style>
    
                <TextBlock Text="Sample!" />
            </Viewbox>
        </DockPanel>
    </Window>
    

    代码如下:

    using System.Windows;
    
    namespace WpfApplication7
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
        public partial class Window1
        {
            public bool IsToggled
            {
                get { return (bool)GetValue(IsToggledProperty); }
                set { SetValue(IsToggledProperty, value); }
            }
    
            public static readonly DependencyProperty IsToggledProperty = DependencyProperty.Register("IsToggled", typeof(bool), typeof(Window1), new UIPropertyMetadata(false));
    
            public Window1()
            {
                InitializeComponent();
            }
    
            private void ToggleOnClick(object sender, RoutedEventArgs e)
            {
                IsToggled = !IsToggled;
            }
    
            private void SetHalfOnClick(object sender, RoutedEventArgs e)
            {
                _viewbox.Opacity = 0.5;
            }
        }
    }
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Steve Greatrex    14 年前

    编辑2以回应评论:

    在您的示例中,可以通过以下方法解决问题:

    1. 设置 FillBehaviour Stop 关于动画
    2. 将代码中的处理程序添加到已完成事件:

    <Storyboard Completed="FadeOut_Completed">

    private void FadeOut_Completed(object sender, EventArgs e)
    {
       _viewbox.Opacity = _viewbox.Opacity; //this sets the DP value to the animated value
    }
    

    这在您的示例中有效;希望它在您的问题中有效!


    原始答案

    如果你设置 FillBehaviour 财产 Storyboard (而不是默认值 HoldEnd )动画完成后,它将还原为属性的预动画值。 保持端

    根据评论更新:

    如注释中所述,当 保持端 填充行为

    这使得将值设置为其他值稍微有点困难。

    我不确定是否有更好的方法来实现这一点,但下面的例子显示了一种解决方法。如果没有来自OP的示例用法,很难判断这是否适用,但是在这个示例中,我正在设置 Rectangle

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Window.Triggers>
            <EventTrigger RoutedEvent="Window.Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="Target" Storyboard.TargetProperty="Width"
                                         From="10" To="100" Duration="0:00:01" FillBehavior="HoldEnd" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Window.Triggers>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Rectangle Height="10" Width="10" Fill="Red"  x:Name="Target"/>
            <Button Grid.Row="1" Content="Resize">
                <Button.Triggers>
                    <EventTrigger RoutedEvent="Button.Click">
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Target" Storyboard.TargetProperty="Width">
                                    <DiscreteDoubleKeyFrame Value="50" KeyTime="0:00:00" />
                                </DoubleAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </Button.Triggers>
            </Button>
        </Grid>
    </Window>
    

    这样做是因为 新的 动画将覆盖在原始文件中设置的值。

        2
  •  3
  •   Nicolas Repiquet    14 年前

    UIElement.BeginAnimation 动画参数设置为 无效的