Silverlight VisualStateManager - PullRequest
       21

Silverlight VisualStateManager

2 голосов
/ 28 января 2010

Возможно ли иметь вложенные визуальные состояния. Я имею в виду, что если ParentControl имеет ChildControl и оба имеют свои собственные визуальные состояния, возможно ли, установив состояние ParentControl, соответствующим образом изменить состояние ChildControl.

Ответы [ 2 ]

1 голос
/ 28 января 2010

Вам нужно вызвать метод GoToState, чтобы изменить визуальное состояние дочернего элемента управления.

Поскольку вам нужно вызвать метод, вы не можете использовать раскадровки в диспетчере визуальных состояний родительского элемента управления, поскольку они могут только анимировать свойства.

Следовательно, вам нужно написать некоторый код в дочернем контроле. Следить за состоянием родителя и отвечать соответствующим образом.

Существует несколько различных способов сделать это, но ключевой момент информации - использовать метод VisualStateManager.GetVisualStateGroups, чтобы найти VisualStateGroup на интересующем вас родительском элементе, а затем присоединить к CurrentStateChanging этой группы событие. Следовательно, код в дочернем элементе управления может быть уведомлен, когда родитель переходит к состоянию, в котором он заинтересован, и может соответствующим образом вызвать GoToState против самого себя.

0 голосов
/ 28 января 2010

Я просто собираюсь объявить новое свойство зависимости:

    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>

Но если я все еще хочу контролировать использование переходов, мне придется искать другое решение. Вероятно, второе свойство.

...