2010-01-28 62 views
2

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

回答

1

您需要调用GoToState方法来更改子控件的视觉状态。

既然你需要调用一个方法,你不能在父控件的可视化状态管理器中使用Storyboard,因为这些只能动画属性。

因此,您需要在子控件中编写一些代码。监视父母的状态并做出适当的回应。

有许多不同的方法可以做到这一点,但信息的关键金块是使用VisualStateManager.GetVisualStateGroups方法来找到你感兴趣的父VisualStateGroup,然后附加到该组的CurrentStateChanging事件。因此,当它感兴趣的状态正由父代转换到其可以通过GoToState对其本身进行适当调用时,可以通知子控件中的代码。

+0

我希望有更多的陈述方法。这在某种程度上迫使我每次使用它时都会对控制进行更改。我想我只需要实现一个依赖属性,它可以满足我需要,然后在父母状态中使用它。 – 2010-01-28 17:11:11

+0

@Petar:好的,如果你需要一个更一般的解决方案来将控件粘合在一起,那么在一个附属属性中定义的一些外部对象将会分离控件。然而,你这样做,它还不存在,你需要编写一些代码来实现它。 – AnthonyWJones 2010-01-28 17:22:29

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> 

但是,如果我仍然希望对使用的控制过渡,那么我将不得不寻找另一种解决方案。可能是第二个属性。