Ottieni un elemento Framework da uno storyboard
-
22-07-2019 - |
Domanda
Ho un riferimento a un'istanza di un oggetto Storyboard e desidero acquisire l'elemento Framework a cui è collegato / animare. Non sono stato in grado di trovare alcun modo per farlo.
Ad esempio, nella XAML in basso, posso passare da un riferimento allo Storyboard per ottenere l'etichetta o la griglia
<Grid>
<Grid.Resources>
<Storyboard x:Key="myStoryboard">
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:5"/>
</Storyboard>
<Style x:Key="myStyle" TargetType="{x:Type Label}">
<Style.Triggers>
<DataTrigger
Binding="{Binding Path=StartAnimation}" Value="true">
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource myStoryboard}" />
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<Label x:Name="labelHello" Grid.Row="0" Style="{StaticResource myStyle}">Hello</Label>
</Grid>
Per coloro che si chiedono perché mai devo farlo, è perché sto cercando di creare una classe Storyboard derivata o un comportamento collegato che mi consentirà di specificare un nome metodo su DataContext da chiamare quando lo Storyboard è stato completato incendi di eventi. Questo mi permetterà di fare MVVM puro piuttosto che avere bisogno di un po 'di codice per chiamare il mio View Model.
Soluzione
Se hai cambiato il tuo XAML in qualcosa del genere:
<Grid x:Name="grid">
<Grid.Resources>
<Storyboard x:Key="myStoryboard">
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:5" Storyboard.Target="{Binding ElementName = grid}"/>
</Storyboard>
<Style x:Key="myStyle" TargetType="{x:Type Label}">
<Style.Triggers>
<DataTrigger
Binding="{Binding Path=StartAnimation}" Value="true">
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource myStoryboard}" />
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<Label x:Name="labelHello" Grid.Row="0" Style="{StaticResource myStyle}">Hello</Label>
</Grid>
Questo introduce un nome x: alla griglia e uno Storyboard. Obiettivo a DoubleAnimation. Ora puoi ottenere un riferimento alla griglia con questo codice:
Storyboard sb = //You mentioned you had a reference to this.
var timeLine = sb.Children.First();
var myGrid = Storyboard.GetTarget(timeLine);