none
XAML代码 转换成 CS文件的代码 RRS feed

  • 问题

  •       TransformGroup transformGroup = new TransformGroup();
          ScaleTransform scaleTransform = new ScaleTransform(-1.1, 1.1);
          transformGroup.Children.Add(scaleTransform);
          image.RenderTransform = transformGroup;


    万能的斑竹 这段代码用Storyboard或其他动画执行的方法

     

    用blend我知道怎么做,但是因为控件是Add()上去的,所以要在后台写,blend的话,

    我不知道怎么对还未出现的元素指定动画,有没有这种方法呢

     

    2011年6月19日 11:58

答案

全部回复

  • 在后台,你Add一个元素,你需要注册这个元素的名字到可视树上,这样就可以让动画去通过TargetName指定了。 用下面的方法去注册名字:

    http://msdn.microsoft.com/zh-cn/library/system.windows.frameworkcontentelement.registername.aspx

     

    即使这个元素在动画之后增加,只要你的动画的TargetName和之后注册的元素名字一致,动画就可以运行

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月20日 6:23
    版主
  • image.RegisterName("scaleTransform",image);
    
    这样么,这个方法的意思,是不是给原本不能用于动画的属性,变成可以呢

    您上面说的,我有点看不明白

    Hero
    2011年6月21日 2:18
  • 这个相当于你在XAML写了一个Image元素,并且赋予了一个x:Name,然后在这个名字范围内可以用这个Name来给故事版TargetName赋值。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月21日 3:00
    版主
  • 我并没有用到TargetName这个属性啊.

    给您看下我写动画的方法

          protected Storyboard m_Storyboard = new Storyboard();
          protected DoubleAnimation m_DoubleAnimation = new DoubleAnimation();
    
          m_Storyboard.Children.Add(m_DoubleAnimation);
    
          Storyboard.SetTarget(m_DoubleAnimation, this);
          Storyboard.SetTargetProperty(m_DoubleAnimation, new PropertyPath("Canvas.Left");
          m_DoubleAnimation.From = 100;
          m_DoubleAnimation.To = 50;
          m_Storyboard.Duration = new Duration(TimeSpan.FromSeconds(1));
          m_Storyboard.Begin();
    

    我现在就是想把

     TransformGroup transformGroup = new TransformGroup();
       ScaleTransform scaleTransform = new ScaleTransform(-1.1, 1.1);
       transformGroup.Children.Add(scaleTransform);
       image.RenderTransform = transformGroup;

    这段代码也用上面的方法执行

    但就是不知道,应该对哪个属性进行动画

    Storyboard.SetTargetProperty(m_DoubleAnimation, new PropertyPath("Canvas.Left");
    

    这里应该怎么设置


    Hero
    2011年6月21日 3:12
  • 额,我搞定了,我用了依赖项属性对应 ScaleTransform 的x值.

    故事板来更改依赖项,从而改变ScaleTransform值.


    Hero
    2011年6月21日 3:22
  • 我还想问下

    是不是我只要 在后台的构造函数里写

    image.RegisterName("Image1",image1);

    就可以在前台写

     

    <Storyboard x:Key="Storyboard1">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="Image1">
         <EasingDoubleKeyFrame KeyTime="0:0:1" Value="-1"/>
        </DoubleAnimationUsingKeyFrames>
       </Storyboard>
    <Image1.Triggers>
    		<EventTrigger RoutedEvent="FrameworkElement.MouseDown">
    			<BeginStoryboard Storyboard="{StaticResource Storyboard1}"/>
    		</EventTrigger>
    	</Image1.Triggers>

    这样写 对么

     

    这样用Image1了呢?

    这样的话,前台可以找到后台的Image1么?

     


    Hero
    2011年6月21日 6:48
  • 不好意思,还有一点

    这里我设置了1秒,动画是正常执行的

     Storyboard.SetTarget(m_DoubleAnimation, this);
     Storyboard.SetTargetProperty(m_DoubleAnimation, new PropertyPath("Canvas.Left");
     m_DoubleAnimation.From = 100;
     m_DoubleAnimation.To = 50;
     m_Storyboard.Duration = new Duration(TimeSpan.FromSeconds(1));
     m_Storyboard.Begin();
    


    但是当我设置了0.5秒 或者 500毫秒后,动画却不是变快,而是执行了一半 我的要求是 100 -50  结果设置成0.5秒后,到 75就停了,这是怎么回事呢,代码是在后台写的

    Storyboard用了好几次,总觉得他结束的时机不是很准确


    Hero

    2011年6月21日 7:08
  • 我还想问下

    是不是我只要 在后台的构造函数里写

    image.RegisterName("Image1",image1);

    就可以在前台写

     

    <Storyboard x:Key="Storyboard1">
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="Image1">
       <EasingDoubleKeyFrame KeyTime="0:0:1" Value="-1"/>
      </DoubleAnimationUsingKeyFrames>
      </Storyboard>
    <Image1.Triggers>
    		<EventTrigger RoutedEvent="FrameworkElement.MouseDown">
    			<BeginStoryboard Storyboard="{StaticResource Storyboard1}"/>
    		</EventTrigger>
    	</Image1.Triggers>
    

    这样写 对么

     

    这样用Image1了呢?

    这样的话,前台可以找到后台的Image1么?

     


    Hero

    不是一定能找到,这个要看你的代码的执行顺序。如果你的名字是在你的这个动画版资源被执行前注册的,就能找到。否则找不到。
    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月22日 3:44
    版主
  • 不好意思,还有一点

    这里我设置了1秒,动画是正常执行的

     Storyboard.SetTarget(m_DoubleAnimation, this);
     Storyboard.SetTargetProperty(m_DoubleAnimation, new PropertyPath("Canvas.Left");
     m_DoubleAnimation.From = 100;
     m_DoubleAnimation.To = 50;
     m_Storyboard.Duration = new Duration(TimeSpan.FromSeconds(1));
     m_Storyboard.Begin();
    


    但是当我设置了0.5秒 或者 500毫秒后,动画却不是变快,而是执行了一半 我的要求是 100 -50  结果设置成0.5秒后,到 75就停了,这是怎么回事呢,代码是在后台写的

    Storyboard用了好几次,总觉得他结束的时机不是很准确


    Hero

    一个写法有点问题,

    m_Storyboard.Duration = TimeSpan.FromSeconds(1);  这样就可以了。

     

    还有,我测试这样子的代码,是可以的:

          DoubleAnimation m_DoubleAnimation = new DoubleAnimation();
          m_DoubleAnimation.From = 100.0;
          m_DoubleAnimation.To = 50.0;
          m_DoubleAnimation.Duration=TimeSpan.FromSeconds(.5);
          rect.BeginAnimation(Canvas.LeftProperty, m_DoubleAnimation);

     




    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月22日 5:06
    版主