【问题标题】:c# animate the Alignment - possible?c#动画对齐 - 可能吗?
【发布时间】:2011-11-15 09:53:01
【问题描述】:

是否可以为 AttachedPropertys 创建一个 c# 动画,例如对齐?从 Horizo​​ntalAlignment.Left 到 Horizo​​ntalAlignment.Right 的变化可能需要 1 秒 - 有可能吗?

非常感谢。

【问题讨论】:

    标签: c# wpf animation alignment


    【解决方案1】:

    您无法在制作平滑动画的意义上对其进行动画处理,因为它们是离散状态,因此某些东西从左向右滑动。没有任何中间值。可以创建一个“动画”,在某个点从左到右改变对齐方式,它只是不会滑过。您还可以做大量工作并测量所有控件以手动创建动画,该动画使用 Canvas.Left 或边距之类的东西从屏幕的一侧移动到另一侧来定位控件。

    附加属性部分不是问题,只需在动画的目标属性部分中使用附加属性的全名即可。

    【讨论】:

      【解决方案2】:

      虽然不可能直接在两个属性之间平滑动画,例如

      HorizontalAlignment="Right" VerticalAlignment="Bottom"
      

      HorizontalAlignment="Center" VerticalAlignment="Center"
      

      我确实想出了一种方法,以一种我认为值得分享的方式为应用程序执行此操作。我只是将控件放在占据整个窗口窗格的网格中。我将控件对齐到网格的右下角。然后我对网格进行了动画处理,以变换和缩小我需要的角到我想要对齐控件的点(在本例中为中心。请参阅下面的完整代码。

      <Grid Margin="5,5,14,70" Visibility="{Binding Path=AdminModeIsEnabled, Converter={StaticResource CollapsedVisibilityConverter}, FallbackValue=Visible}">
          <Grid.Style>
              <Style TargetType="Grid">
                  <Setter Property="LayoutTransform">
                      <Setter.Value>
                          <ScaleTransform/>
                      </Setter.Value>
                  </Setter>
                  <Setter Property="RenderTransform">
                      <Setter.Value>
                          <ScaleTransform/>
                      </Setter.Value>
                  </Setter>
                  <Style.Triggers>
                      <DataTrigger Binding="{Binding CenterPanel}" Value="True">
                          <DataTrigger.EnterActions>
                              <BeginStoryboard>
                                  <Storyboard>
                                      <DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)" To="2" Duration="0:0:0.5" />
                                      <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)" To=".5" Duration="0:0:0.5" />
                                      <DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleX)" To="2" Duration="0:0:0.5" />
                                      <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleX)" To=".5" Duration="0:0:0.5" />
                                  </Storyboard>
                              </BeginStoryboard>
                          </DataTrigger.EnterActions>
                          <DataTrigger.ExitActions>
                              <BeginStoryboard>
                                  <Storyboard>
                                      <DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:0.5" />
                                      <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:0.5" />
                                      <DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleX)" To="1" Duration="0:0:0.5" />
                                      <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleX)" To="1" Duration="0:0:0.5" />
                                  </Storyboard>
                              </BeginStoryboard>
                          </DataTrigger.ExitActions>
                      </DataTrigger>
                  </Style.Triggers>
              </Style>
          </Grid.Style>
          <Image Height="15" Source="\Images\Test.png" HorizontalAlignment="Right" VerticalAlignment="Bottom" />
      </Grid>
      

      【讨论】:

        【解决方案3】:

        有可能,这里有一个例子:

        class StoryBoardManager : System.Windows.Media.Animation.Storyboard
        {
            public void ChangeRectangleAlignment(DependencyObject target, VerticalAlignment verticalAlignment, HorizontalAlignment horizontalAlignment, int BeginTimeMillisecond)
            {
                ObjectAnimationUsingKeyFrames objectAnimation = new ObjectAnimationUsingKeyFrames()
                {
                    BeginTime = TimeSpan.FromMilliseconds(0)
                };
                Storyboard.SetTarget(objectAnimation, target);
                Storyboard.SetTargetProperty(objectAnimation, new PropertyPath("(FrameworkElement.HorizontalAlignment)"));
                DiscreteObjectKeyFrame keyFrame = new DiscreteObjectKeyFrame(horizontalAlignment, TimeSpan.FromMilliseconds(BeginTimeMillisecond));
                objectAnimation.KeyFrames.Add(keyFrame);
                this.Children.Add(objectAnimation);
            }
        }
        

        有关详细信息,请参阅this other question

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-18
          • 1970-01-01
          • 2018-05-04
          • 2013-09-04
          • 2021-05-04
          相关资源
          最近更新 更多