2017-02-10 60 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); 
}