是否有可能有嵌套的视觉状态。我的意思是如果 ParentControl 有一个 ChildControl 并且都有自己的视觉状态,是否可以通过设置 ParentControl 的状态来相应地更改 ChildControl 的状态。
问问题
675 次
2 回答
1
您需要调用该GoToState
方法来更改子控件的视觉状态。
由于您需要调用一个方法,因此您不能在父控件的可视状态管理器中使用 Storyboard,因为它们只能为属性设置动画。
因此,您需要在子控件中编写一些代码。监控父母的状态并做出适当的回应。
有许多不同的方法可以做到这一点,但重要的信息块是使用该VisualStateManager.GetVisualStateGroups
方法找到VisualStateGroup
您感兴趣的父级,然后附加到该组的CurrentStateChanging
事件。因此,当父控件将其感兴趣的状态转换到子控件时,可以通知子控件中的代码,并且可以对其GoToState
自身进行适当的调用。
于 2010-01-28T15:04:27.147 回答
0
我只是要声明一个新的依赖属性:
public static readonly DependencyProperty StateProperty =
DependencyProperty.Register("State",
typeof( string ),
typeof( TextBlockControl ),
new PropertyMetadata("Top",
new PropertyChangedCallback(StateChanged)));
[Category("DigItOut"), Description("State")]
public string State
{
get
{
return this.GetValue(StateProperty).ToString();
}
set
{
this.SetValue(StateProperty, value);
}
}
private static void StateChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
if (!String.IsNullOrEmpty(args.NewValue.ToString()))
VisualStateManager.GoToState(sender as TextBlockControl, args.NewValue.ToString(), true);
}
然后从它的父母状态设置它:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="States">
<VisualState x:Name="Reverse">
<Storyboard>
<ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="textBlockControl" Storyboard.TargetProperty="(TextBlockControl.State)">
<DiscreteObjectKeyFrame KeyTime="00:00:00">
<DiscreteObjectKeyFrame.Value>
<System:String>Bottom</System:String>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Straight"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
但是如果我仍然想控制过渡的使用,那么我将不得不找到另一个解决方案。可能是第二个属性。
于 2010-01-28T17:18:46.597 回答