0

Ich habe eine Schaltfläche dynamisch über Code hinter erstellt. Der Grund ist, weil ich möchte, dass die EntranceThemeTransition jedes Mal wiederholen, wenn die Schaltfläche sichtbar ist.VisualStateManager hinzugefügt über Code hinter ausgelöst Windows 10

<Grid x:Name="gridRoot"> 
    <Grid x:Name="gridNextKitty" Visibility="{Binding IsNextKittyButtonVisible, Converter={StaticResource BooleanToVisibilityConverter}}"> 
     <Grid.ChildrenTransitions> 
      <TransitionCollection> 
       <EntranceThemeTransition FromHorizontalOffset="1000" FromVerticalOffset="0" IsStaggeringEnabled="False"/> 
      </TransitionCollection> 
     </Grid.ChildrenTransitions> 
     <!--<Button x:Name="btnNextKitty" Content="Next Kitty" FontSize="40" Command="{Binding BtnNextKittyClick}" Style="{StaticResource ButtonMenuStyle}" Background="#74b025" Width="300" Height="80" Margin="24" HorizontalAlignment="Center" VerticalAlignment="Center"/>--> 
    </Grid> 
</Grid> 

ist der Knopf wie dieses ich die VisualStateManager über Code

  if (viewModel.IsNextKittyButtonVisible) 
      { 
       btnNextKitty = new Button() 
       { 
        Content = "Next Kitty", 
        FontSize = 40, 
        Command = viewModel.BtnNextKittyClick, 
        Style = (Style)Application.Current.Resources["ButtonMenuStyle"], 
        Background = new SolidColorBrush(Color.FromArgb(255, 116, 176, 37)), 
        Width = 300, 
        Height = 80, 
        Margin = new Thickness(24), 
        HorizontalAlignment = HorizontalAlignment.Center, 
        VerticalAlignment = VerticalAlignment.Center 
       }; 

       gridNextKitty.Children.Add(btnNextKitty); 
       addVisualStateManager(); 

      } 
      else 
      { 
       gridNextKitty.Children.Remove(btnNextKitty); 
       VisualStateManager.GetVisualStateGroups(gridRoot).Remove(vsg); 
      } 

hinzugefügt hinter hinzugefügt, aber die StateTriggers ist immer wahr, obwohl MinWindowWidth < 500.

private void addVisualStateManager() 
    { 
     vsg = new VisualStateGroup(); 
     VisualState vs = new VisualState(); 
     vs.StateTriggers.Add(new AdaptiveTrigger 
     { 
      MinWindowWidth = 500,     
     }); 

     vs.Setters.Add(new Setter 
     { 
      Target = new TargetPropertyPath 
      { 
       Path = new PropertyPath("(FrameworkElement.Width)"), 
       Target = btnNextKitty 
      }, 

      Value = "240" 
     }); 

     vsg.States.Add(vs); 
     VisualStateManager.GetVisualStateGroups(gridRoot).Add(vsg); 
    } 

Wie kann ich machen Der Auslöser funktioniert über Code hinterher?

Antwort

0

Sie sollten Standard-Status für die Breite von 0 bis 500 hinzufügen. Zum Beispiel, leeren visuellen Zustand.

vsg.States.Add(vs); 

vs = new VisualState(); 
vs.StateTriggers.Add(new AdaptiveTrigger 
{ 
    MinWindowWidth = 0, 
}); 

vsg.States.Add(vs); 
+0

Ich habe Ihren Vorschlag versucht. Die Tastenbreite wurde nur am ersten Eingang angepasst. Sobald der Knopf entfernt und der Auslöser neu ausgelöst wurde, funktioniert es nicht mehr. – PutraKg

0

Ich habe eine andere Route gewählt. Anstatt EntranceThemeTransition zu verwenden, habe ich mich entschieden, Storyboard Animation zu verwenden.

<Grid.Resources> 
    <Storyboard x:Name="storyboardbtnNextKitty"> 
     <DoubleAnimation Storyboard.TargetName="btnNextKitty" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" From="1000" To="0" Duration="0:0:0.5"> 
      <DoubleAnimation.EasingFunction> 
       <CubicEase EasingMode="EaseOut"/> 
      </DoubleAnimation.EasingFunction> 
     </DoubleAnimation> 
    </Storyboard> 
</Grid.Resources> 

In der Code-behind, abonnierte ich zum ViewModel_PropertyChanged Ereignisse. Wenn IsNextKittyButtonVisible wahr ist, spiele ich einfach die Animation.

if (viewModel.IsNextKittyButtonVisible) 
{ 
    storyboardbtnNextKitty.Begin(); 
} 

Die Schaltfläche wird in XAML erstellt und nicht hinter dem Code.