Bonjour,
Programmeur expérimenté en framework .Net 2 (VB et C#), j'ai (enfin) l'opportunité de me former sur les dernières versions du framework, en particulier WPF, ce que je fais avec plaisir. Mais j'avoue avoir du mal à saisir certains concepts, dont celui présenté ici. Ce que j'essaie de faire n'a sans doute rien de bien compliqué, mais je ne comprends pas vraiment ce qui me bloque, même après avoir cherché des tutoriaux et exemples sur le Net. Je m'en remets donc à des développeurs plus expérimentés.
J'essaie de créer un système d'affichage de message d'erreurs dynamiques, réutilisable dans différentes applications, personnalisable, facile à utiliser et respectant la séparation interface / code préconisée en .Net 3 et +. Je m'en sers pour appliquer les concepts vus dans les docs que j'ai lues. J'ai donc essayé de faire un TextBlock auquel j'applique un style pour l'esthétique, mais surtout pour déclencher une apparition et un masquage automatiques et progressifs à l'aide d'une animation. Coté code une instance d'un objet contient une propriété "Error" à laquelle un trigger est lié pour déclencher l'animation d'affichage du TextBlock , puis sa disparition. Une autre propriété liée "Message" contient le texte à afficher. Ça marche très bien (j'ai ajouté un bouton pour déclencher manuellement l'erreur à des fins de tests).
Voici le code :
Par contre j'aimerais aussi pouvoir lier les durées des clefs de l'animation pour pouvoir configurer son déroulement à volonté. Ça ne marche pas, même en tentant de lier KeyTime à une propriété "Time" de mon objet (qui renvoit une chaîne "0:0:5" valide) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 <Window x:Class="Test.WindowPrincipale" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WindowPrincipale" Height="350" Width="525" WindowStartupLocation="CenterScreen" WindowState="Maximized"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Button Grid.Row="0" Height="100" Width="200" Click="Button_Click">Test</Button> <TextBlock Grid.Row="1" Name="BandeauErreur"> <TextBlock.Style> <Style TargetType="TextBlock"> <Setter Property="Background" Value="Red" /> <Setter Property="Foreground" Value="White" /> <Setter Property="FontFamily" Value="Arial" /> <Setter Property="FontSize" Value="32" /> <Setter Property="Opacity" Value="0" /> <Setter Property="VerticalAlignment" Value="Stretch" /> <Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="Text" Value="{Binding Path=ErrorMessage}" /> <Style.Triggers> <DataTrigger Binding="{Binding Path=Error, Mode=OneWay}" Value="True"> <DataTrigger.EnterActions> <BeginStoryboard HandoffBehavior="Compose"> <Storyboard > <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Name="Animation"> <LinearDoubleKeyFrame Value="1" KeyTime="0:0:0.125" /> <LinearDoubleKeyFrame Value="1" KeyTime="0:0:1.625" /> <LinearDoubleKeyFrame Value="0" KeyTime="0:0:2.125" /> </DoubleAnimationUsingKeyFrames> </Storyboard> </BeginStoryboard> </DataTrigger.EnterActions> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> </Grid> </Window>
L'exécution déclenche une erreur. Si je supprime cette liaison dans la KeyTime ça marche. Mon animation est dans un style qui est lui-même appliqué au TextBlock. C'est l'accès au DataContext qui me pose problème, je pense. Le style en a hérité mais l'animation qu'il contient apparemment non.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <LinearDoubleKeyFrame Value="0" KeyTime="{Binding Path=Time}" />
Merci d'avance pour votre aide (en espérant avoir été clair).
Partager