积极答复者
XAML代码 转换成 CS文件的代码

问题
-
TransformGroup transformGroup = new TransformGroup(); ScaleTransform scaleTransform = new ScaleTransform(-1.1, 1.1); transformGroup.Children.Add(scaleTransform); image.RenderTransform = transformGroup;
万能的斑竹 这段代码用Storyboard或其他动画执行的方法用blend我知道怎么做,但是因为控件是Add()上去的,所以要在后台写,blend的话,
我不知道怎么对还未出现的元素指定动画,有没有这种方法呢
答案
-
在后台,你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.
- 已标记为答案 Jie BaoModerator 2011年6月27日 3:53
-
额,我搞定了,我用了依赖项属性对应 ScaleTransform 的x值.
故事板来更改依赖项,从而改变ScaleTransform值.
Hero- 已建议为答案 Jie BaoModerator 2011年6月21日 6:31
- 已标记为答案 Jie BaoModerator 2011年6月27日 3:53
全部回复
-
在后台,你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.
- 已标记为答案 Jie BaoModerator 2011年6月27日 3:53
-
这个相当于你在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.
-
我并没有用到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 -
额,我搞定了,我用了依赖项属性对应 ScaleTransform 的x值.
故事板来更改依赖项,从而改变ScaleTransform值.
Hero- 已建议为答案 Jie BaoModerator 2011年6月21日 6:31
- 已标记为答案 Jie BaoModerator 2011年6月27日 3:53
-
我还想问下
是不是我只要 在后台的构造函数里写
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 -
不好意思,还有一点
这里我设置了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
-
我还想问下
是不是我只要 在后台的构造函数里写
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.
-
不好意思,还有一点
这里我设置了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.