2

是否有可能有嵌套的视觉状态。我的意思是如果 ParentControl 有一个 ChildControl 并且都有自己的视觉状态,是否可以通过设置 ParentControl 的状态来相应地更改 ChildControl 的状态。

4

2 回答 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 回答