שואל
אנימציה בתוך DATATEMPLATE סילברלייט 5

שאלה
-
אלעד מה העניינים?
יש לי ב-VIEWMODEL אוסף של אובייקטים מסוג מסוים שמכיל פרופרטי IsOn
ב-XAML יש לי DATATEMPLATE שמכיל אליפסה. אני רוצה לשנות את השקיפות של האליפסה באמצעות אנימציה שתופעל בהתאם לערך של IsOn
איך עושים את זה?
(ובאנגלית:
I have in a viewmodel a collection of objects (ObservableCollection<Sensor>) that contains one property IsOn:
public class Sensor { public bool IsOn { get; set; } } public class AreaSensorsPanelViewModel : ViewModelBase { private ObservableCollection<Sensor> _areaSensors = new ObservableCollection<Sensor>(); public AreaSensorsPanelViewModel() { for (int i = 0; i < 4; i++) { Sensor sense = new Sensor(); AreaSensors.Add(sense); } } public ObservableCollection<Sensor> AreaSensors { get { return _areaSensors; } set { _areaSensors = value; OnPropertyChanged("AreaSensors"); } } }
This collection of objects represented in ListBox that its ItemTemplate is binded to
datatemplate which contains 2 viewboxes. each one of them contains 3 ellipses that represents "Led light indicator". (one is Green, one is Red)
Only one of them needs to be set to On (based on the property IsOn)
My Code is:
<DataTemplate x:Key="SensorDataTemplate"> <StackPanel Orientation="Horizontal" Margin="0,-1,0,10"> <StackPanel.Resources> <Storyboard x:Name="SBTurnRedSensorOn"> <ColorAnimation Duration="0:0:0.5" To="#FFE93911" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="RedEllipse" d:IsOptimized="True"/> <DoubleAnimation Duration="0:0:0.5" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="RedEllipse" d:IsOptimized="True"/> </Storyboard> <Storyboard x:Name="SBTurnGreenSensorOn"> <ColorAnimation Duration="0:0:0.5" To="#FF24AB00" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="GreenEllipse" d:IsOptimized="True"/> <DoubleAnimation Duration="0:0:0.5" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="GreenEllipse" d:IsOptimized="True"/> </Storyboard> <Storyboard x:Name="SBTurnRedSensorOff"> <ColorAnimation Duration="0:0:0.5" To="#00E93911" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="RedEllipse" d:IsOptimized="True"/> <DoubleAnimation Duration="0:0:0.5" To="0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="RedEllipse" d:IsOptimized="True"/> </Storyboard> <Storyboard x:Name="SBTurnGreenSensorOff"> <ColorAnimation Duration="0:0:0.5" To="#0024AB00" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="GreenEllipse" d:IsOptimized="True"/> <DoubleAnimation Duration="0:0:0.5" To="0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="GreenEllipse" d:IsOptimized="True"/> </Storyboard> </StackPanel.Resources> <TextBlock Text="Area: " Foreground="White"/> <Viewbox HorizontalAlignment="Right" Height="20" Margin="13,0,0,0" VerticalAlignment="Bottom" Width="20"> <Grid Height="26" Width="25"> <Ellipse Height="25" x:Name="RedEllipse" VerticalAlignment="Top" Width="25" HorizontalAlignment="Left" Opacity="0"> <Ellipse.Fill> <LinearGradientBrush EndPoint="0.148,0.175" StartPoint="0.852,0.825"> <GradientStop Color="#FFFF0606" Offset="0"/> <GradientStop Color="#FFE93911" Offset="1"/> </LinearGradientBrush> </Ellipse.Fill> </Ellipse> <Ellipse Margin="0,11,0,0" Height="15" VerticalAlignment="Top" HorizontalAlignment="Left" Width="25"> <Ellipse.OpacityMask> <RadialGradientBrush> <GradientStop Color="Black"/> <GradientStop Offset="1"/> </RadialGradientBrush> </Ellipse.OpacityMask> <Ellipse.Fill> <LinearGradientBrush EndPoint="0.148,0.175" StartPoint="0.852,0.825"> <GradientStop Color="#FFEDF3F2" Offset="0"/> <GradientStop Color="#FFEDF3F2" Offset="1"/> </LinearGradientBrush> </Ellipse.Fill> </Ellipse> <Ellipse Margin="3,2,0,0" Height="15" VerticalAlignment="Top" HorizontalAlignment="Left" Width="20"> <Ellipse.OpacityMask> <LinearGradientBrush EndPoint="0.503,0.826" StartPoint="0.468,-0.287"> <GradientStop Color="Black" Offset="0"/> <GradientStop Color="#14FFFFFF" Offset="1"/> </LinearGradientBrush> </Ellipse.OpacityMask> <Ellipse.Fill> <LinearGradientBrush EndPoint="0.192,0.11" StartPoint="0.808,0.89"> <GradientStop Color="#FFEDF3F2" Offset="0"/> <GradientStop Color="#FFEDF3F2" Offset="1"/> </LinearGradientBrush> </Ellipse.Fill> </Ellipse> </Grid> </Viewbox> <Viewbox Height="20" Margin="26,0,1,0" VerticalAlignment="Bottom" HorizontalAlignment="Right"> <Grid Height="26" Width="25"> <Ellipse x:Name="GreenEllipse" Height="25" VerticalAlignment="Top" Width="25" HorizontalAlignment="Left"> <Ellipse.Fill> <LinearGradientBrush EndPoint="0.148,0.175" StartPoint="0.852,0.825"> <GradientStop Color="#FF0EFF06" Offset="0"/> <GradientStop Color="#FF24AB00" Offset="1"/> </LinearGradientBrush> </Ellipse.Fill> </Ellipse> <Ellipse Margin="0,11,0,0" Height="15" VerticalAlignment="Top" HorizontalAlignment="Left" Width="25"> <Ellipse.OpacityMask> <RadialGradientBrush> <GradientStop Color="Black"/> <GradientStop Offset="1"/> </RadialGradientBrush> </Ellipse.OpacityMask> <Ellipse.Fill> <LinearGradientBrush EndPoint="0.148,0.175" StartPoint="0.852,0.825"> <GradientStop Color="#FFEDF3F2" Offset="0"/> <GradientStop Color="#FFEDF3F2" Offset="1"/> </LinearGradientBrush> </Ellipse.Fill> </Ellipse> <Ellipse Margin="3,2,0,0" Height="15" VerticalAlignment="Top" HorizontalAlignment="Left" Width="20"> <Ellipse.OpacityMask> <LinearGradientBrush EndPoint="0.503,0.826" StartPoint="0.468,-0.287"> <GradientStop Color="Black" Offset="0"/> <GradientStop Color="#14FFFFFF" Offset="1"/> </LinearGradientBrush> </Ellipse.OpacityMask> <Ellipse.Fill> <LinearGradientBrush EndPoint="0.192,0.11" StartPoint="0.808,0.89"> <GradientStop Color="#FFEDF3F2" Offset="0"/> <GradientStop Color="#FFEDF3F2" Offset="1"/> </LinearGradientBrush> </Ellipse.Fill> </Ellipse> </Grid> </Viewbox> </StackPanel> </DataTemplate>
how can I change (or, play/trigger the storyboards) in order to change the lightning indicator?
- נערך על-ידי Yehuda A יום רביעי 27 מרץ 2013 12:40 לא משנה - הצלחתי לפתור את זה לבד :-)
יום רביעי 27 מרץ 2013 07:57
כל התגובות
-
ואו לכתוב בפוסט לפורום "אלעד מה עניינים"... עצוב שרק אלעד מעורב פה.
בכל מקרה מה שאתה צריך לעשות זה להשתמש ב-VSM. דרך Blend אתה יכול להוסיף Behavior שבשינוי של property ב-VM אתה יכול להגיד לו לעבור ל-state, משם זה מאוד פשוט להפעיל אנימציה. DataStateBehavior.
Ariel Ben Horesh | twitter: @arielbh blog: http://blogs.microsoft.co.il/blogs/arielbh/
יום שלישי 02 אפריל 2013 09:11