【发布时间】:2013-11-14 23:52:50
【问题描述】:
我正在开发一个 Windows Phone 8 应用程序,并且我正在尝试创建一个用户控件,该控件在被选中时会改变其自身的大小。 Selected/NotSelected 之间的更改是使用 VisualStateManager 完成的。为了保持下面的例子简单,我跳过这个并直接点击 UserControl。
问题是,我找不到任何方法来使用 Storyboard 更改 UserControl 的大小,因为我不知道如何在 Storyboard.TargetName 属性中引用 UserControl 本身:
<UserControl
x:Class="Namespace.MyUserControl"
...
Tap="UserControl_Tap">
<UserControl.Resources>
<Storyboard x:Key="Expand">
<DoubleAnimation To="400" Storyboard.TargetName="????" Storyboard.TargetProperty="Width">
<DoubleAnimation.EasingFunction>
<CubicEase EasingMode="EaseInOut"/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
<Storyboard x:Key="Collaps">
...
</Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<Rectangle x:Name="TestRect" Fill="Red" Width="10" Height="10"/>
</Grid>
</UserControl>
private void UserControl_Tap(object sender, System.Windows.Input.GestureEventArgs e) {
if (Width < 400) {
Storyboard storyBoard = (Storyboard)this.Resources["Expand"];
storyBoard.Begin();
Width = 400;
Height = 400;
} else {
Storyboard storyBoard = (Storyboard)this.Resources["Collaps"];
storyBoard.Begin();
Width = 200;
Height = 200;
}
}
Storyboard 需要指定 Storyboard.TargetName。应该使用什么来代替 ???? 来引用 UserControl 本身?使用“this”不起作用并引发 InvalidOperationException“无法解析 TargetName this”。使用“Namespace.MyUserControl”时也会发生同样的情况。
使用“LayoutRoot”作为 TargetName 不会引发任何异常,但它也不起作用:没有任何反应。
对 UserControl 中的任何子控件进行动画处理(例如,使用 Storyboard.TargetName=TestRect" 的 TestRect )都可以正常工作。此外,直接设置 Width 和 Height 而无需任何情节提要也可以正常工作。
知道如何解决这个问题吗?
【问题讨论】:
-
为什么不在目标页面中创建故事板,这样用户控件是由其属性定义的
-
UserControl 应该在许多不同的页面上使用,并且行为应该始终相同。执行一次行为(在 UserControl 内)而不是在使用 UserControl 的每个页面上执行此操作不是更好吗?
标签: c# visual-studio windows-phone-8 user-controls storyboard