2017-02-10 7 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> 

Мне нужно создать этот код XAML программно с помощью C# код.

Текущий код

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

Как создать раскадровку и добавить эти свойства?

+0

Дайте ему попробовать, а затем обратиться за помощью сюда с конкретным вопросом, когда вы застряли. – niksofteng

+0

XAML esssentially сериализует объекты как XML, поэтому все, что вы видите как элемент или атрибут, также существует как класс или свойство. Вы уже использовали свойство StateTriggers. Также есть свойство «Раскадровка». Вы попробовали это? Вы столкнулись с проблемой? –

+1

Если вы посмотрите на документацию «VisualState», вы увидите, что у нее есть [[ContentPropertyAttribute («Storyboard»)], поэтому вы можете назначить раскадровке свойству с тем же именем, хотя в XAML он не завернут в ' ...' – grek40

ответ

1

Если вы хотите использовать VisualState в коде позади, вы должны быть в состоянии добавить Setter к SetterBaseCollection в VisualState. Также мы должны иметь возможность добавить VisualState в VisualStateGroup. Затем мы можем добавить VisualStateGroup к нашему контролю.

Чтобы получить Style в коде позади, мы должны использовать 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); 
}