2011-02-22 3 views
1

밖으로 패널을 애니메이션 VisualStateManager를 사용하여 상태 : '있음'및 '있음' 그런 다음 버튼의 클릭 이벤트에서 VisualStateManager.GoToState를 호출하여 두 상태를 전환 할 수 있습니다.WPF <p></p>는 내가하고 싶은 두 사이에 StackPanel의 토글 버튼이 있습니다 ...에 및 나는 시각적 상태를 사용 가능하다 할 노력하고있어 바라고 있어요

Panel States

내가 StackPanel의에 상태를 연결하는 방법을 알아낼 수 없습니다입니다으로 실행했습니다 문제. Expression Blend를 사용하지 않아도됩니다. 그래서 붙어 있어요 ... 어쨌든 VisualStateManager를 사용하여이 패널 안팎을 움직이게할까요? (나는 스토리 보드를 사용하여 애니메이션을 만들고 애니메이션 할 수 있지만 가능한 경우 미국을 사용하도록 권장 함)

정말 이것이 가능하기를 바랍니다. 그렇지 않으면 버튼에 변칙적 인 롤오버 효과를주는 것 외에 VisualStateManager는 무엇이 좋을까요?

도움 주셔서 감사합니다.

+0

또한 VisualStateGroup을 윈도우의 LayoutRoot에 추가 한 다음 'this'를 Click 이벤트에서 VSM으로 전달하려고 시도했습니다. (예 : VisualStateManager.GoToState (this, "In", true) ...하지만 그 중 하나는 나를 위해 작동하지 않습니다. –

+0

이상한 ... 난 그냥 WinPhone7 프로젝트에 동일한 코드를 넣어, 그리고 그것은 잘 작동 .. WPF가 아닌 WinPhone7 Silverlight에서 작동하는 이유는 무엇입니까? –

답변

2

는 혼합을 발사이있어 :

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
    x:Class="WpfApplication1.MainWindow" 
    x:Name="Window" 
    Title="MainWindow" 
    Width="640" Height="480"> 

    <StackPanel x:Name="LayoutRoot"> 
     <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="PanelState"> 
       <VisualState x:Name="In"/> 
       <VisualState x:Name="Out"> 
        <Storyboard> 
         <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" Storyboard.TargetName="stackPanel"> 
          <EasingThicknessKeyFrame KeyTime="0" Value="-65,15,0,0"/> 
         </ThicknessAnimationUsingKeyFrames> 
        </Storyboard> 
       </VisualState> 
      </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 
     <i:Interaction.Behaviors> 
      <ei:DataStateBehavior Binding="{Binding IsChecked, ElementName=toggleButton}" Value="True" TrueState="In" FalseState="Out"/> 
     </i:Interaction.Behaviors> 
     <Button Content="Button" Width="50" HorizontalAlignment="Left" Click="Button_Click"/> 
     <StackPanel x:Name="stackPanel" Height="100" HorizontalAlignment="Left" Margin="0,15,0,0"> 
      <TextBlock><Run Text="Funnytext"/></TextBlock> 
     </StackPanel> 
     <ToggleButton x:Name="toggleButton" Content="Toggle" Width="50" HorizontalAlignment="Left"/> 
    </StackPanel> 
</Window> 

뒤에 코드 :

private void Button_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    var sgs=VisualStateManager.GetVisualStateGroups(LayoutRoot); 
    var sg=sgs[0] as VisualStateGroup; 
    VisualStateManager.GoToElementState(LayoutRoot, ((VisualState) sg.States[sg.CurrentState == sg.States[0]?1:0]).Name,true); 
} 

(당신이 그렇게 의미 난 그냥이 포함 StackPanel을 알고하지 않았다) 편집 : 나쁘다, 나는 clickhandler를 포함하지 않았다는 것을 알지 못했다. 귀하의 편의를 위해 Togglebutton을 사용하여 상태를 토글하는 예제를 포함 시켰습니다 ...

+0

단추에 이벤트 처리기를 추가하지 않은 경우 ... 무엇을 보여 주려고합니까? 내 질문은이 코드를 사용하는 것입니다. –

+0

@ Matt.M : 내 편집 된 게시물 –

+0

감사합니다! 그래서 WPF에서 가장 사용하기 쉬운 것 같습니다. GoToState와는 대조적으로 GoToElementState는 시각적 상태가 LayoutRoot에 적용되기 때문에 발생합니다. (지연에 대한 미안, 주말에 그것을 얻을 수 없었다) –