2011-11-28 21 views
2

我嘗試瞭解WPF中的VisualState。我能夠在WPF中創建一個簡單的VisualState。但問題是我怎樣才能應用相同的VisualState其他控件。如何將相同的VisualState應用於許多控件?

這是我的示例VisualState代碼。

<Grid x:Name="LayoutRoot" Background="{x:Null}"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="VisualStateGroup"> 
      <VisualStateGroup.Transitions> 
       <VisualTransition GeneratedDuration="0:0:1"> 
        <ei:ExtendedVisualStateManager.TransitionEffect> 
         <ee:FadeTransitionEffect/> 
        </ei:ExtendedVisualStateManager.TransitionEffect> 
       </VisualTransition> 
      </VisualStateGroup.Transitions> 
      <VisualState x:Name="MySate"> 
       <Storyboard> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(TextElement.Background).(SolidColorBrush.Color)" Storyboard.TargetName="textBlock"> 
         <EasingColorKeyFrame KeyTime="0" Value="#FFF31515"/> 
        </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
    <VisualStateManager.CustomVisualStateManager> 
     <ei:ExtendedVisualStateManager/> 
    </VisualStateManager.CustomVisualStateManager> 

    <Grid Height="132" Margin="58,80,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="230"> 
     <TextBlock x:Name="textBlock" Margin="54,37,35,48" TextWrapping="Wrap" Text="TextBlock" Background="Black"/> 
    </Grid> 
    <Grid Height="132" Margin="58,80,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="230"> 
     <TextBlock x:Name="textBlock2" Margin="54,37,35,48" TextWrapping="Wrap" Text="TextBlock" Background="Black"/> 
    </Grid> 
    <Button x:Name="yyyyy" Content="Button" HorizontalAlignment="Right" Height="70" Margin="0,8,30,0" VerticalAlignment="Top" Width="148" Click="Clickbd"/> 
</Grid> 

C#:

private void Clickbd(object sender, System.Windows.RoutedEventArgs e) 
{ 
     VisualStateManager.GoToElementState(LayoutRoot, "MySate", true); 
} 

這的VisualState成功爲TextBlock的控制工作。我想在上應用這個VisualState textBlock2

Thank`s。

回答

3

您應該將您的VisualState添加到可以在不同控件之間共享的模板。

我沒有測試的代碼,但這樣的事情應該做的伎倆:

<Style TargetType="TextBlock"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="TextBlock"> 
     <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="VisualStateGroup"> 
       <VisualStateGroup.Transitions> 
        <VisualTransition GeneratedDuration="0:0:1"> 
         <ei:ExtendedVisualStateManager.TransitionEffect> 
          <ee:FadeTransitionEffect/> 
         </ei:ExtendedVisualStateManager.TransitionEffect> 
        </VisualTransition> 
       </VisualStateGroup.Transitions> 
       <VisualState x:Name="MySate"> 
        <Storyboard> 
         <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(TextElement.Background).(SolidColorBrush.Color)" Storyboard.TargetName="contentPresenter"> 
          <EasingColorKeyFrame KeyTime="0" Value="#FFF31515"/> 
         </ColorAnimationUsingKeyFrames> 
        </Storyboard> 
       </VisualState> 
      </VisualStateGroup> 
      </VisualStateManager.VisualStateGroups> 
      <VisualStateManager.CustomVisualStateManager> 
      <ei:ExtendedVisualStateManager/> 
     </VisualStateManager.CustomVisualStateManager> 

     <ContentPresenter x:Name="contentPresenter" /> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 
+0

你能你給我一個例子嗎? – Vero009

+0

我剛剛注意到,雖然我的手指寫了'TextBlock',我的腦海裏正在想着'TextBox',所以上面的代碼可能需要修改才能使其按預期工作。 – madd0

+0

沒關係。我明白了。 Thank's。 – Vero009

相關問題