2010-01-28 2 views
2

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

ответ

1

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

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

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

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

+0

Я надеялся на более декларативный подход. Это как-то заставляет меня вносить изменения в контроль каждый раз, когда я его использую. Я предполагаю, что мне просто нужно реализовать свойство зависимости, которое делает то, что мне нужно, а затем просто используйте его в родительских состояниях. –

+0

@Petar: Хорошо, да, если вам понадобится более общее решение для склейки элементов управления, тогда какой-то внешний набор объектов, определенных в прикрепленном свойстве, отключит элементы управления. Однако вы это делаете, но этого еще не существует, и вам нужно будет написать код для его создания. – AnthonyWJones

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> 

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

Смежные вопросы