【发布时间】:2012-08-09 04:36:02
【问题描述】:
我在 Metro XAML 应用程序中弄乱了一些情节提要。我必须在代码中创建一个Storyboard。我想将Storyboard.TargetProperty 设置为CompositeTransform.Rotation
似乎不可能……
我在 XAML 中的故事板如下所示:
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="grid">
<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="60"/
</DoubleAnimationUsingKeyFrames>
</Storyboard>
我想创建类似的东西。
重要提示:我不想重新创建这个确切的故事板。我在自定义ContentControl 的代码中,所以this 是Control,并且没有将动画定位到的“网格”。目标是控件本身,它之前设置了CompositeTransform。
到目前为止我的代码是这样的:
var turnSB = new Storyboard();
var doubleAnim = new DoubleAnimationUsingKeyFrames();
doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(0), Value = currentAngle });
doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(500), Value = targetAngle });
turnSB.Children.Add(doubleAnim);
Storyboard.SetTarget(doubleAnim, this.RenderTransform);
Storyboard.SetTargetProperty(doubleAnim, "(CompositeTransform.Rotation)");
turnSB.Begin();
一旦遇到 Begin 方法,我就会收到一个异常,指出 (CompositeTransform.Rotation) 无法解决。所以我猜我没有完全正确的财产路径。我尝试了不同的变体,但根据 PropertyPaths,这应该是正确的,不是吗? :S
如果这是一个无法解决的问题,我愿意接受有关解决方法的建议...
编辑:
我想我现在已经解决了这个问题。虽然我有一些有趣的发现......
如果我制作一个 UserControl,我几乎可以做任何事情。一切正常,我可以设置 Storyboard.Target 属性,并且动画可以正确播放。
但是,如果我使用自定义控件,或从另一个控件(例如 ContentControl)继承,我无法从代码中启动 Storyboard,只有在某些情况下。
例如:如果我制作一个故事板(在 XAML 中定义)来动画旋转(或任何与此相关的转换属性)并尝试从代码开始,我会得到上述异常。但是如果我为一个简单的属性设置动画,比如不透明度,它就可以正常工作。
(我对 UserControl 做了同样的事情,并且它有效。)
有人可以解释一下吗?
【问题讨论】:
-
我遇到了同样的问题,继承了 Grid 控件的类,故事板根本无法启动。
-
需要注意的一点是 Grid 不是从 Control 继承的,所以它并不是你真正创建的自定义控件。
-
我没有使用 Grid,我是从 ContentControl 继承的。 xaml 来自先前的尝试,其中我有一个 UserControl,其中有一个 Grid,这是动画的目标。但是对于这种情况,目标应该是控件本身。其中 - 如果您仔细阅读 - 我在“重要”部分中进行了描述。
-
Tenshiko,抱歉我指的是@sharpjohnny 的评论...
标签: storyboard microsoft-metro winrt-xaml attached-properties