2017-02-10 58 views
0

视觉国XAML如何的VisualState XAML转换为C#

<VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="SectionHeader"> 
       <VisualState x:Name="SectionHeaderNormal"> 
        <VisualState.StateTriggers> 
         <AdaptiveTrigger MinWindowWidth="1200"/> 
        </VisualState.StateTriggers> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="txtUser" Storyboard.TargetProperty="Style"> 
          <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource usernameStyle}"/> 
         </ObjectAnimationUsingKeyFrames> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="txtName" Storyboard.TargetProperty="Style"> 
          <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource nameStyle}"/> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </VisualState> 
     </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

我需要通过C#代码编程创建此XAML代码。

当前代码

  var vsg = new VisualStateGroup(); 
      var vs = new VisualState(); 
      vs.StateTriggers.Add(new AdaptiveTrigger 
      { 
       MinWindowWidth = 1200.0 
      }); 

如何创建故事板,添加这些属性?

+0

给它一个尝试,然后在这里寻求帮助的具体问题时,你会被卡住。 – niksofteng

+0

XAML将对象序列化为XML,因此您作为元素或属性看到的任何内容也作为类或属性存在。你已经使用了'StateTriggers'属性。还有一个'Storyboard'属性。你试过这个吗?你遇到问题了吗? –

+1

如果您查看'VisualState'的文档,您可以看到它具有'[ContentPropertyAttribute(“Storyboard”)]',因此您可以将故事板分配给同名的属性,即使在XAML中它未被包装在' ...'中 – grek40

回答

1

如果您想在后面的代码中使用VisualState,您应该能够将Setter添加到VisualStateSetterBaseCollection。此外,我们应该能够将VisualState添加到VisualStateGroup。然后我们可以将VisualStateGroup添加到我们的控件中。我们应该能够使用FrameworkElement.Resources

例如:

<Page.Resources> 
    <Style x:Key="usernameStyle" TargetType="TextBlock"> 
     <Setter Property="Foreground" Value="Red" /> 
    </Style> 
</Page.Resources> 

<Grid Name="MyGrid" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <TextBlock Name="txtUser" Text="555555" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock> 
</Grid> 

的背后代码:

public MainPage() 
{ 
    this.InitializeComponent(); 
    var vsg = new VisualStateGroup(); 
    var vs = new VisualState(); 
    Style appButtonStyle = (Style)this.Resources["usernameStyle"]; 
    vs.StateTriggers.Add(new AdaptiveTrigger 
    { 
     MinWindowWidth = 1080 
    }); 

    vs.Setters.Add(new Setter 
    { 
     Target = new TargetPropertyPath 
     { 
      Path = new PropertyPath("(TextBlock.Style)"), 
      Target = txtUser 
     }, 
     Value = appButtonStyle 
    }); 

    vsg.States.Add(vs); 

    VisualStateManager.GetVisualStateGroups(MyGrid).Add(vsg); 
}