Saturday, 7 April 2012

Visual State Manager

Here is a great early example app from Microsoft in 2008 that shows off the Visual State Manager, complete with animated transitions between states.

sunnypart-cloudyimagerainy 

Here’s the source that I’ve updated for WPF4.

The Control

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WeatherStates
{
[TemplatePart(Name = "Core", Type = typeof(FrameworkElement))]
[TemplateVisualState(Name = "Normal", GroupName = "CommonStates")]
[TemplateVisualState(Name = "MouseOver", GroupName = "CommonStates")]
[TemplateVisualState(Name = "Pressed", GroupName = "CommonStates")]
[TemplateVisualState(Name = "Sunny", GroupName = "WeatherStates")]
[TemplateVisualState(Name = "PartlyCloudy", GroupName = "WeatherStates")]
[TemplateVisualState(Name = "Cloudy", GroupName = "WeatherStates")]
[TemplateVisualState(Name = "Rainy", GroupName = "WeatherStates")]
public class WeatherControl : Control
{
public WeatherControl()
{
//Set DefaultStyleKey
DefaultStyleKey = typeof(WeatherControl);
}

private FrameworkElement CorePart
{
get { return corePart; }

set
{
FrameworkElement oldCorePart = corePart;

if (oldCorePart != null)
{
oldCorePart.MouseEnter -= corePart_MouseEnter;
oldCorePart.MouseLeave -= corePart_MouseLeave;
oldCorePart.MouseLeftButtonDown -= corePart_MouseLeftButtonDown;
oldCorePart.MouseLeftButtonUp -= corePart_MouseLeftButtonUp;
}

corePart = value;

if (corePart != null)
{
corePart.MouseEnter += corePart_MouseEnter;
corePart.MouseEnter += corePart_MouseEnter;
corePart.MouseLeave += corePart_MouseLeave;
corePart.MouseLeftButtonDown += corePart_MouseLeftButtonDown;
corePart.MouseLeftButtonUp += corePart_MouseLeftButtonUp;
}
}
}

public override void OnApplyTemplate()
{
base.OnApplyTemplate();

CorePart = (FrameworkElement)GetTemplateChild("Core");

GoToState(false);
}

private void GoToState(bool useTransitions)
{
// Go to states in NormalStates state group
if (isPressed)
{
VisualStateManager.GoToState(this, "Pressed", useTransitions);
}
else if (isMouseOver)
{
VisualStateManager.GoToState(this, "MouseOver", useTransitions);
}
else
{
VisualStateManager.GoToState(this, "Normal", useTransitions);
}


// Go to states in WeatherStates state group
if (Condition == Condition.PartlyCloudy)
{
VisualStateManager.GoToState(this, "PartlyCloudy", useTransitions);
}
else if (Condition == Condition.Sunny)
{
VisualStateManager.GoToState(this, "Sunny", useTransitions);
}
else if (Condition == Condition.Cloudy)
{
VisualStateManager.GoToState(this, "Cloudy", useTransitions);
}
else
{
VisualStateManager.GoToState(this, "Rainy", useTransitions);
}
}

#region input event handlers

private void corePart_MouseEnter(object sender, MouseEventArgs e)
{
isMouseOver = true;
GoToState(true);
}

private void corePart_MouseLeave(object sender, MouseEventArgs e)
{
isMouseOver = false;
GoToState(true);
}

private void corePart_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
isPressed = true;
GoToState(true);
}

private void corePart_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
isPressed = false;
GoToState(true);
}

#endregion

#region public properties

// Temperature DP

public static readonly DependencyProperty TemperatureProperty = DependencyProperty.Register("Temperature",
typeof(string),
typeof(
WeatherControl),
new PropertyMetadata
(OnTemperaturePropertyChanged));

// Condition DP

public static readonly DependencyProperty ConditionProperty = DependencyProperty.Register("Condition",
typeof(Condition),
typeof(WeatherControl
),
new PropertyMetadata(
OnConditionPropertyChanged));


// ConditionDescription DP

public static readonly DependencyProperty ConditionDescriptionProperty =
DependencyProperty.Register("ConditionDescription", typeof(string), typeof(WeatherControl),
new PropertyMetadata(OnConditionDescriptionPropertyChanged));

public string Temperature
{
get { return (string)GetValue(TemperatureProperty); }
set { SetValue(TemperatureProperty, value); }
}

public Condition Condition
{
get { return (Condition)GetValue(ConditionProperty); }
set { SetValue(ConditionProperty, value); }
}

public string ConditionDescription
{
get { return (string)GetValue(ConditionDescriptionProperty); }
set { SetValue(ConditionDescriptionProperty, value); }
}

#endregion

#region Change Notification Handlers

private static void OnTemperaturePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var weather = d as WeatherControl;
var newValue = (string)e.NewValue;
weather.OnWeatherChange(null);
}

private static void OnConditionDescriptionPropertyChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var weather = d as WeatherControl;
var newValue = (string)e.NewValue;
weather.OnWeatherChange(null);
}

private static void OnConditionPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var weather = d as WeatherControl;
var newValue = (Condition)e.NewValue;
weather.OnWeatherChange(null);
}

#endregion Change Notification Handlers

#region protected methods

protected virtual void OnWeatherChange(RoutedEventArgs e)
{
GoToState(true);
}

#endregion

#region private

private FrameworkElement corePart;

private bool isMouseOver, isPressed;

#endregion
}
}

The Template

<!--  Built-In Style for WeatherControl  -->
<Style TargetType="WeatherStates:WeatherControl">
<Setter Property="Template">
<Setter.Value>

<!-- ControlTemplate -->
<ControlTemplate TargetType="WeatherStates:WeatherControl">

<!-- Template's Root Visual -->
<Grid x:Name="LayoutRoot">

<!-- Resources -->
<Grid.Resources>
<SolidColorBrush x:Key="RainColor" Color="#FF12BAE4" />

<Storyboard x:Key="Glow" RepeatBehavior="Forever">
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[19].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="217.027385875156,25.8495779319949" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="193.271678188256,5.99269073781626" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="192.700388781111,8.43995886902664" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="217.027385875156,25.8495779319949" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[19].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="214.195554236379,24.1598734485195" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="190.017005638817,6.5232359929917" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="190.017005638817,6.5232359929917" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="214.195554236379,24.1598734485195" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[20].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="193.017,11.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="175.497856571438,8.89000731326221" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="176.017,-3.47687567559504" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="193.017,11.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[21].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="143.456021227293,2.28064399600896" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="130.180564027175,4.1319708409094" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="142.199537787091,34.266932435986" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="143.456021227293,2.28064399600896" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[21].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="133.273483440202,3.53683588442785" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="119.998026240084,5.3881627293283" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="132.017,35.5231243244049" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="133.273483440202,3.53683588442785" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[22].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="116.322438561857,5.62804001463961" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="103.046981361739,7.47936685954" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="115.065955121655,37.6143284546166" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="116.322438561857,5.62804001463961" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[22].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="113.15834715917,9.5799379502316" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="109.139373399254,42.4451006795598" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="109.139373399254,42.4451006795598" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="113.15834715917,9.5799379502316" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[22].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="104.017,14.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="99.9980262400841,47.3881627293282" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="99.9980262400841,47.3881627293282" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="104.017,14.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[23].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="77.6002417396145,28.8075111296135" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="73.5812679796986,61.6726738589417" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="73.5812679796986,61.6726738589417" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="77.6002417396145,28.8075111296135" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[17].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="315.045729803776,25.3219750411442" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="258.860765225674,69.4627712921137" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="282.323853363963,67.9607511297636" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="315.045729803776,25.3219750411442" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[17].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="292.017,17.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="251.017,39.5232359929916" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="274.480088138289,38.0212158306414" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="292.017,17.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[18].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="266.045729803776,14.3219750411442" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="238.360206157591,26.0192006054869" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="261.82329429588,24.5171804431367" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="266.045729803776,14.3219750411442" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[16].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="343.017,60.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="328.017,79.5232359929916" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="326.017,98.5230000000012" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="343.017,60.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[16].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="320.017,38.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="296.017,50.5232359929916" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="294.017,69.523" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="320.017,38.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[17].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="302.251552278419,21.5299630489227" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="277.800555964959,34.0145835862353" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="275.800555964959,53.0143475932437" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="302.251552278419,21.5299630489227" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[15].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="312.017,104.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="322.544690203268,105.756783342081" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="300.017,150.523000022605" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="312.017,104.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[16].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="326.937276319773,66.1565751777258" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="279.297174945034,85.1077945894012" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="325.159324267773,97.0957562808475" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="326.937276319773,66.1565751777258" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[15].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="319.017,86.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="299.017,94.5232359929916" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="316.017,116.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="319.017,86.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[14].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="320.316371432994,142.328878996393" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="304.316371432994,184.329114989386" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="329.187070466506,168.017422569527" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="320.316371432994,142.328878996393" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[14].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="314.017,111.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="298.017,153.523235992993" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="312.017,162.52300001507" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="314.017,111.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[15].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="311.443069535654,98.93568215834" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="295.443069535654,140.935918151333" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="287.017,154.523000007535" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="311.443069535654,98.93568215834" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[12].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="332.830026579832,232.35697353529" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="327.830026579832,236.357209528283" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="321.438569719492,237.414695074582" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="332.830026579832,232.35697353529" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[12].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="335.017,219.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="330.017,223.523235992993" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="323.62554313966,224.580721539292" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="335.017,219.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[13].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="336.935763419904,208.262982514449" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="331.935763419904,212.263218507442" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="325.544306559564,213.320704053741" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="336.935763419904,208.262982514449" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[11].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="265.089624097208,267.150471374951" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="289.089624097208,307.150595699357" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="289.710480443727,305.638262962633" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="265.089624097208,267.150471374951" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[11].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="285.017,236.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="309.017,276.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="295.62554313966,269.580609870705" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="285.017,236.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[12].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="291.757418733976,226.163282652512" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="315.757418733976,266.163406976918" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="303.017,224.523" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="291.757418733976,226.163282652512" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[23].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="112.12898097172,37.1807609844687" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="97.017,58.5231243244049" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="83.6717684519183,19.384842444433" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="112.12898097172,37.1807609844687" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[24].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="52.0657937772402,41.1866997589079" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="65.4748802545407,54.3547742531447" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="52.129648706459,15.2164923731728" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="52.0657937772402,41.1866997589079" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[1].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="6.85323961573832,115.415938172951" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="39.017,112.071777804023" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="14.017,131.071777804023" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="6.85323961573832,115.415938172951" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[1].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="6.85323961573832,133.867284693334" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="39.017,130.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="14.017,149.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="6.85323961573832,133.867284693334" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[2].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="6.85323961573832,140.341295751105" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="39.017,136.997135382177" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="14.017,155.997135382177" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="6.85323961573832,140.341295751105" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[3].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="41.017,191.543759858496" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="29.017,191.543884182902" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="19.017,194.543884182902" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="41.017,191.543759858496" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[3].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="41.017,214.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="29.017,214.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="19.017,217.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="41.017,214.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[4].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="41.017,236.488317217131" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="29.017,236.488441541537" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="19.017,239.488441541537" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="41.017,236.488317217131" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[4].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="13.017,246.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="-2.50446623202902,260.749226988274" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="56.017,221.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="13.017,246.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[4].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="21.017,271.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="30.112430083172,268.111076232185" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="63.017,254.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="21.017,271.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[5].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="24.313235765972,281.823736768663" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="40.6623269021674,270.492257726884" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="65.2612167546261,265.1030033105" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="24.313235765972,281.823736768663" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[6].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="95.969302550663,279.626637384605" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="68.9693025506632,306.626761709011" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="68.9693025506632,306.626761709011" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="95.969302550663,279.626637384605" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[6].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="106.017,285.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="79.017,312.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="79.017,312.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="106.017,285.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[7].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="117.799463014936,292.437387578731" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="90.7994630149357,319.437511903138" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="90.7994630149357,319.437511903138" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="117.799463014936,292.437387578731" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[8].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="164.75002531811,305.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="127.75002531811,289.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="127.75002531811,289.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="164.75002531811,305.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[8].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="197.017,305.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="160.017,289.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="160.017,289.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="197.017,305.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[9].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="209.661178771677,305.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="172.661178771677,289.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="172.661178771677,289.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="209.661178771677,305.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[7].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="122.634571235598,308.078579799153" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="104.017,315.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="101.017,300.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="122.634571235598,308.078579799153" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[7].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="129.017,319.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="117.017,308.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="114.017,293.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="129.017,319.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[8].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="142.903984439585,344.423941493566" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="142.120545463202,295.005830613451" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="139.120545463202,280.005830613451" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="142.903984439585,344.423941493566" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[5].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="60.8118957727822,259.167632153829" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="59.8118957727822,259.167756478235" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="42.8118957727822,277.167756478235" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="60.8118957727822,259.167632153829" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[5].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="75.017,266.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="74.017,266.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="57.017,284.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="75.017,266.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[6].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="82.6621288422787,270.481628811649" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="81.6621288422787,270.481753136054" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="64.6621288422787,288.481753136054" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="82.6621288422787,270.481628811649" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.StartPoint)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="56.017,103.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="43.017,77.5231243244049" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="18.017,77.5231243244049" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="56.017,103.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[0].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="50.3258680260035,114.655559799549" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="37.3258680260035,88.6556841239544" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="38.017,109.523" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="50.3258680260035,114.655559799549" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[9].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="219.127177261807,300.511191325117" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="220.127177261807,314.511315649523" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="171.017,304.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="219.127177261807,300.511191325117" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[9].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="230.017,292.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="231.017,306.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="204.017,313.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="230.017,292.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[10].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="246.856000203449,280.17081038381" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="247.856000203449,294.170934708216" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="224.164828754196,319.017986711914" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="246.856000203449,280.17081038381" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[20].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="172.424990603953,39.1109504900648" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="173.876659701476,26.7198828131649" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="176.017,-0.476875675595004" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="172.424990603953,39.1109504900648" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[20].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="158.017,31.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="159.468669097523,19.1319323231001" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="158.017,5.523124324405" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="158.017,31.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[21].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="149.077319153348,26.8149281025374" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="150.528988250871,14.4238604256375" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="148.431831708911,8.71818042143482" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="149.077319153348,26.8149281025374" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[23].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="62.017,40.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="75.3622315480817,55.6614062043768" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="62.017,16.5231243244049" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="62.017,40.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[24].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="11.017,49.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="58.4007476089011,54.8551469694999" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="36.017,5.52287567559508" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="11.017,49.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[24].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="45.017,80.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="48.2421669872349,54.8551469694999" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="25.017,35.523" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="45.017,80.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[0].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="40.017,91.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="16.4472518472481,86.0563295594422" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="39.017,87.5231243244049" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="40.017,91.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[0].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="19.017,104.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="20.5202930021668,99.3352854362725" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="31.017,102.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="19.017,104.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[1].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="1.05260359587804,115.643816821599" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="26.7159597348007,119.534439346329" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="9.58585169555629,142.706527395238" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="1.05260359587804,115.643816821599" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[10].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="251.493000956816,292.274982366367" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="235.030807105945,268.835780408701" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="203.493000956816,293.275106690773" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="251.493000956816,292.274982366367" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[10].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="275.017,286.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="258.554806149129,263.083798042334" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="227.017,287.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="275.017,286.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[11].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="300.955645580896,280.180599130366" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="284.493451730025,256.7413971727" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="252.955645580896,281.180723454773" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="300.955645580896,280.180599130366" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[2].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="45.3893843464702,162.487855077983" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="32.4754423162679,161.16156342645" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="42.3893843464702,166.487979402389" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="45.3893843464702,162.487855077983" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[2].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="30.017,177.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="17.1030579697977,176.196708348467" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="27.017,181.523124324406" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="30.017,177.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[3].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="14.7279805742795,192.476608861205" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="1.81403854407725,191.150317209672" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="11.7279805742795,196.476733185611" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="14.7279805742795,192.476608861205" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[13].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="297.722923926225,169.892684367878" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="323.595997007497,199.389483896091" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="329.722923926225,202.892684367878" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="297.722923926225,169.892684367878" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[13].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="301.017,164.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="326.890073081272,194.019799528213" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="333.017,197.523" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="301.017,164.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[14].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="314.807335940773,142.043327499874" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="340.680409022045,171.540127028087" />
<SplinePointKeyFrame KeyTime="00:00:00.6" Value="346.807335940773,175.043327499874" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="314.807335940773,142.043327499874" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[18].(BezierSegment.Point2)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="253.326079868027,32.7915428281289" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="229.384485286995,24.130104946938" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="253.326079868027,32.7915428281289" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[18].(BezierSegment.Point3)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="244.017,35.523" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="220.075405418968,26.8615621188091" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="244.017,35.523" />
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[19].(BezierSegment.Point1)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="236.944780968799,37.5981205992084" />
<SplinePointKeyFrame KeyTime="00:00:00.3" Value="213.003186387767,28.9366827180175" />
<SplinePointKeyFrame KeyTime="00:00:00.9" Value="236.944780968799,37.5981205992084" />
</PointAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="BottomCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00.000000" Value="1.048" />
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="1.048" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="1.1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="BottomCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
<SplineDoubleKeyFrame KeyTime="00:00:00.000000" Value="1.048" />
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="1.048" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="1.1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="TopCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="1.068" />
<SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="1.025" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="1.068" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="TopCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0.966" />
<SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0.986" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="0.966" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="MiddleCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="1.039" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="1.08" />
<SplineDoubleKeyFrame KeyTime="00:00:00.7000000" Value="1.032" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="1.039" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="MiddleCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="1.118" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="1.134" />
<SplineDoubleKeyFrame KeyTime="00:00:00.7000000" Value="1.117" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="1.118" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain1"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-30" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="-20" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain2"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="-10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9" Value="10" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain3"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="-15" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain4"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="-15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="10" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain5"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="30" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="20" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain6"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="-30" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="40" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="5" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain7"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="35" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="-15" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain8"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="-10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="-5" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain9"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="5" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain10"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="-20" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain11"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="30" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="8" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="-10" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain12"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="-5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="30" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="15" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain13"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="30" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-25" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="-15" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain14"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="5" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain15"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="-5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="30" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="20" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain16"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="-5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="-20" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain17"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-30" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="-30" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain18"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="-20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="10" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="15" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rain19"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="-5" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="20" />
<SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-15" />
<SplineDoubleKeyFrame KeyTime="00:00:00.9000000" Value="20" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>

<Storyboard x:Key="Burn" RepeatBehavior="Forever">
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Offset)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0.719" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4" Value="0.772" />
<SplineDoubleKeyFrame KeyTime="00:00:00.8" Value="0.719" />
</DoubleAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Duration="00:00:00"
Storyboard.TargetName="Rays"
Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Color)">
<SplineColorKeyFrame KeyTime="00:00:00" Value="#FFEE9015" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[3].(GradientStop.Color)">
<SplineColorKeyFrame KeyTime="00:00:00" Value="#FFF1A11D" />
<SplineColorKeyFrame KeyTime="00:00:00.4000000" Value="#FFFBB238" />
<SplineColorKeyFrame KeyTime="00:00:00.8" Value="#FFF1A11D" />
</ColorAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="Rays" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[3].(GradientStop.Offset)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0.737" />
<SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="0.911" />
<SplineDoubleKeyFrame KeyTime="00:00:00.8" Value="0.737" />
</DoubleAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="BottomCloud"
Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
<SplineColorKeyFrame KeyTime="00:00:00" Value="#FFCBDBF9" />
<SplineColorKeyFrame KeyTime="00:00:00.4000000" Value="#FFA2BEF2" />
<SplineColorKeyFrame KeyTime="00:00:00.8000000" Value="#FFCBDBF9" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="TopCloud"
Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
<SplineColorKeyFrame KeyTime="00:00:00" Value="#FFB3CCFB" />
<SplineColorKeyFrame KeyTime="00:00:00.2000000" Value="#FFCBDBF9" />
<SplineColorKeyFrame KeyTime="00:00:00.6000000" Value="#FFA2BEF2" />
<SplineColorKeyFrame KeyTime="00:00:00.8000000" Value="#FFB3CCFB" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="MiddleCloud"
Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
<SplineColorKeyFrame KeyTime="00:00:00" Value="#FFB4CBF7" />
<SplineColorKeyFrame KeyTime="00:00:00.2000000" Value="#FFA2BEF2" />
<SplineColorKeyFrame KeyTime="00:00:00.6000000" Value="#FFCBDBF9" />
<SplineColorKeyFrame KeyTime="00:00:00.8000000" Value="#FFB4CBF7" />
</ColorAnimationUsingKeyFrames>
</Storyboard>

<Storyboard x:Key="PartlyCloudyStoryboard">
<DoubleAnimation Duration="0"
Storyboard.TargetName="BottomCloud"
Storyboard.TargetProperty="(UIElement.Opacity)"
To="1" />
</Storyboard>

<Storyboard x:Key="CloudyStoryboard">
<DoubleAnimation Duration="0"
Storyboard.TargetName="TopCloud"
Storyboard.TargetProperty="(UIElement.Opacity)"
To="1" />
<DoubleAnimation Duration="0"
Storyboard.TargetName="MiddleCloud"
Storyboard.TargetProperty="(UIElement.Opacity)"
To="1" />
<DoubleAnimation Duration="0"
Storyboard.TargetName="BottomCloud"
Storyboard.TargetProperty="(UIElement.Opacity)"
To="1" />
<DoubleAnimation Duration="0"
Storyboard.TargetName="Rays"
Storyboard.TargetProperty="(UIElement.Opacity)"
To="0" />
<DoubleAnimation Duration="0"
Storyboard.TargetName="Core"
Storyboard.TargetProperty="(UIElement.Opacity)"
To="0" />
</Storyboard>

<Storyboard x:Key="RainyStoryboard">
<DoubleAnimation Duration="0"
Storyboard.TargetName="TopCloud"
Storyboard.TargetProperty="(UIElement.Opacity)"
To="1" />
<DoubleAnimation Duration="0"
Storyboard.TargetName="MiddleCloud"
Storyboard.TargetProperty="(UIElement.Opacity)"
To="1" />
<DoubleAnimation Duration="0"
Storyboard.TargetName="RainCanvas"
Storyboard.TargetProperty="(UIElement.Opacity)"
To="1" />
<DoubleAnimation Duration="0"
Storyboard.TargetName="Rays"
Storyboard.TargetProperty="(UIElement.Opacity)"
To="0" />
<DoubleAnimation Duration="0"
Storyboard.TargetName="Core"
Storyboard.TargetProperty="(UIElement.Opacity)"
To="0" />
</Storyboard>
</Grid.Resources>


<!-- VisualStateManager -->
<VisualStateManager.VisualStateGroups>

<!-- CommonStates StateGroup -->
<VisualStateGroup x:Name="CommonStates">

<!-- CommonStates States -->
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver" Storyboard="{StaticResource Glow}" />
<VisualState x:Name="Pressed" Storyboard="{StaticResource Burn}" />

<!-- CommonStates Transitions -->
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:1" />
<VisualTransition GeneratedDuration="0:0:.4" To="Pressed" />
<VisualTransition From="Pressed" GeneratedDuration="0:0:.4" />
</VisualStateGroup.Transitions>
</VisualStateGroup>

<!-- WeatherStates StateGroup -->
<VisualStateGroup x:Name="WeatherStates">

<!-- WeatherStates States -->
<VisualState x:Name="Sunny" />
<VisualState x:Name="PartlyCloudy" Storyboard="{StaticResource PartlyCloudyStoryboard}" />
<VisualState x:Name="Cloudy" Storyboard="{StaticResource CloudyStoryboard}" />
<VisualState x:Name="Rainy" Storyboard="{StaticResource RainyStoryboard}" />


<!-- WeatherStates Transitions -->
<VisualStateGroup.Transitions>

<!-- Sunny to PartlyCloudy Transition -->
<VisualTransition From="Sunny" To="PartlyCloudy">
<Storyboard Duration="0:0:.5">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="BottomCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-150" />
<SplineDoubleKeyFrame KeySpline="0.173,0.019,1,0.484"
KeyTime="00:00:00.5000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="BottomCloud"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0" />
<SplineDoubleKeyFrame KeySpline="0.173,0.019,1,1"
KeyTime="00:00:00.2000000"
Value="0.1" />
<SplineDoubleKeyFrame KeySpline="0,0,1,0.484"
KeyTime="00:00:00.5000000"
Value="1" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualTransition>

<!-- Sunny to Cloudy Transition -->
<VisualTransition From="Sunny" To="Cloudy">
<Storyboard>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="BottomCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-310.971" />
<SplineDoubleKeyFrame KeySpline="0.685,0.069,1,1"
KeyTime="00:00:00.5000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="MiddleCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-310.971" />
<SplineDoubleKeyFrame KeySpline="0.701,0.229,0.965,0.629"
KeyTime="00:00:00.5000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="TopCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-310.971" />
<SplineDoubleKeyFrame KeySpline="0.917,0,0.921,0.629"
KeyTime="00:00:00.5000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="BottomCloud"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0" />
<SplineDoubleKeyFrame KeySpline="0.685,0.069,1,1"
KeyTime="00:00:00.2000000"
Value="0.1" />
<SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="MiddleCloud"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0" />
<SplineDoubleKeyFrame KeySpline="0.701,0.229,1,1"
KeyTime="00:00:00.2000000"
Value="0.1" />
<SplineDoubleKeyFrame KeySpline="0,0,0.965,0.629"
KeyTime="00:00:00.5000000"
Value="1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="TopCloud"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0" />
<SplineDoubleKeyFrame KeySpline="0.917,0,1,1"
KeyTime="00:00:00.2000000"
Value="0.1" />
<SplineDoubleKeyFrame KeySpline="0,0,0.921,0.629"
KeyTime="00:00:00.5000000"
Value="1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rays"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="1" />
<SplineDoubleKeyFrame KeySpline="0,0,1,0.484"
KeyTime="00:00:00.6000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Core"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="1" />
<SplineDoubleKeyFrame KeySpline="0,0,1,0.484"
KeyTime="00:00:00.6000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualTransition>

<!-- PartlyCloudy to Cloudy Transition -->
<VisualTransition From="PartlyCloudy" To="Cloudy">
<Storyboard>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="MiddleCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-310.971" />
<SplineDoubleKeyFrame KeySpline="0.701,0.229,0.965,0.629"
KeyTime="00:00:00.5000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="TopCloud"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="-310.971" />
<SplineDoubleKeyFrame KeySpline="0.917,0,0.921,0.629"
KeyTime="00:00:00.5000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="MiddleCloud"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0" />
<SplineDoubleKeyFrame KeySpline="0.701,0.229,1,1"
KeyTime="00:00:00.2000000"
Value="0.1" />
<SplineDoubleKeyFrame KeySpline="0,0,0.965,0.629"
KeyTime="00:00:00.5000000"
Value="1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="TopCloud"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0" />
<SplineDoubleKeyFrame KeySpline="0.917,0,1,1"
KeyTime="00:00:00.2000000"
Value="0.1" />
<SplineDoubleKeyFrame KeySpline="0,0,0.921,0.629"
KeyTime="00:00:00.5000000"
Value="1" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Rays"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="1" />
<SplineDoubleKeyFrame KeySpline="0,0,1,0.484"
KeyTime="00:00:00.6000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Core"
Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="1" />
<SplineDoubleKeyFrame KeySpline="0,0,1,0.484"
KeyTime="00:00:00.6000000"
Value="0" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualTransition>

<VisualTransition GeneratedDuration="0:0:0.3" />
</VisualStateGroup.Transitions>
</VisualStateGroup>

</VisualStateManager.VisualStateGroups>

<Canvas>
<!-- Rays -->
<Path x:Name="Rays"
Canvas.Left="62.983"
Canvas.Top="-3.523"
Stretch="None"
Stroke="{x:Null}">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint="28.0174541641301,61.2980742923269">
<BezierSegment Point1="22.3263221901336,72.4306340918764"
Point2="16.4472518472481,86.0563295594422"
Point3="20.5202930021668,99.3352854362725" />
<BezierSegment Point1="26.7159597348007,119.534439346329"
Point2="6.85323961573832,115.415938172951"
Point3="6.85323961573832,133.867284693334" />
<BezierSegment Point1="6.85323961573832,140.341295751105"
Point2="32.4754423162679,161.16156342645"
Point3="17.1030579697977,176.196708348467" />
<BezierSegment Point1="1.81403854407725,191.150317209672"
Point2="0.01966987269995,204.458602862985"
Point3="0.01966987269995,227.437843004489" />
<BezierSegment Point1="0.01966987269995,249.40316022162"
Point2="-1.8463132732129,241.240787819656"
Point3="30.7705830419881,248.602637063567" />
<BezierSegment Point1="41.3204798609835,250.983818558266"
Point2="31.3714533167345,278.007139394266"
Point3="45.5765575439523,285.362507240437" />
<BezierSegment Point1="53.221686386231,289.321136052086"
Point2="75.3906659456177,266.098988785635"
Point3="85.4383633949545,271.99535140103" />
<BezierSegment Point1="97.2208264098902,278.909738979761"
Point2="113.487632821565,288.157929788435"
Point3="119.870061585967,299.602349989282" />
<BezierSegment Point1="133.757046025552,324.503291482848"
Point2="130.61845776224,310.983022818256"
Point3="162.88543244413,310.983022818256" />
<BezierSegment Point1="175.529611215807,310.983022818256"
Point2="199.830296558437,321.199085063184"
Point3="210.72011929663,313.210893738067" />
<BezierSegment Point1="227.559119500079,300.858704121877"
Point2="235.030807105945,268.835780408701"
Point3="258.554806149129,263.083798042334" />
<BezierSegment Point1="284.493451730025,256.7413971727"
Point2="287.601038214373,277.002237518707"
Point3="307.528414117165,246.374766143756" />
<BezierSegment Point1="314.268832851141,236.015048796268"
Point2="307.619282928068,216.87919220265"
Point3="309.806256348236,204.04521866736" />
<BezierSegment Point1="311.72501976814,192.785201181809"
Point2="323.595997007497,199.389483896091"
Point3="326.890073081272,194.019799528213" />
<BezierSegment Point1="340.680409022045,171.540127028087"
Point2="336.606048858268,147.963981503399"
Point3="330.306677425274,117.158102507006" />
<BezierSegment Point1="327.732746960928,104.570784665346"
Point2="320.989920320051,75.7440646248508"
Point3="306.489309796732,79.2896886439032" />
<BezierSegment Point1="285.262376978775,84.4800027157924"
Point2="280.321724356253,103.927229621517"
Point3="273.488202342187,69.3952344326231" />
<BezierSegment Point1="268.71582583232,45.278873595694"
Point2="260.832035421898,53.6635602579779"
Point3="252.988270196224,23.7240249588558" />
<BezierSegment Point1="240.331476353815,10.2199895713512"
Point2="229.384485286995,24.130104946938"
Point3="220.075405418968,26.8615621188091" />
<BezierSegment Point1="213.003186387767,28.9366827180175"
Point2="186.884060518798,25.2166628313712"
Point3="183.62938796936,25.7472080865466" />
<BezierSegment Point1="169.110238901981,28.1139794068171"
Point2="173.876659701476,26.7198828131649"
Point3="159.468669097523,19.1319323231001" />
<BezierSegment Point1="150.528988250871,14.4238604256375"
Point2="143.456021227293,2.28064399600896"
Point3="133.273483440202,3.53683588442785" />
<BezierSegment Point1="116.322438561857,5.62804001463961"
Point2="121.156225506503,12.2392460986345"
Point3="112.014878347333,17.1823081484029" />
<BezierSegment Point1="85.5981200869475,31.4668192780164"
Point2="125.474212519802,52.3191671888455"
Point3="75.3622315480817,55.6614062043768" />
<BezierSegment Point1="65.4110253253219,56.3251059632847"
Point2="58.4007476089011,54.8551469694999"
Point3="48.2421669872349,54.8551469694999" />
</PathFigure>
</PathGeometry>
</Path.Data>
<Path.Fill>
<RadialGradientBrush>
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5"
CenterY="0.5"
ScaleX="0.806"
ScaleY="0.806" />
<SkewTransform AngleX="0" AngleY="0" CenterX="0.5" CenterY="0.5" />
<RotateTransform Angle="0" CenterX="0.5" CenterY="0.5" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="0.004" Color="#FFFF8A54" />
<GradientStop Offset="1" Color="#FFFBCF36" />
<GradientStop Offset="0.522" Color="#FFFCAD44" />
<GradientStop Offset="0.522" Color="#FFF1A11D" />
</RadialGradientBrush>
</Path.Fill>
</Path>

<!-- Core PART -->
<Ellipse x:Name="Core"
Canvas.Left="131.5"
Canvas.Top="59"
Width="200"
Height="200"
Stroke="{x:Null}">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Offset="0.004" Color="#FFFFD954" />
<GradientStop Offset="1" Color="#FFE9F515" />
<GradientStop Offset="0.911" Color="#FFF1F712" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>

<!-- Bottom Cloud -->
<Path x:Name="BottomCloud"
Canvas.Left="6.87"
Canvas.Top="167.041"
Width="252.308"
Height="170.216"
Data="M290.98194,186.52432 C286.3447,193.55139 280.11695,228.80665 301.59189,232.38581 296.6266,239.0062 288.54087,242.91825 285,250 280.34656,259.30688 268.05813,280.85927 287.52861,293.04937 295.56457,298.08053 336.25528,293.49338 337.75281,286.00574 351.81571,318.20517 360.7299,310.2986 377.9321,310.15575 390.21954,310.05372 411.41423,303.41627 415.09759,284.99951 434.5749,294.73816 460.3604,327.52778 493.55493,306.95823 504.6382,300.0903 496.21589,257.64739 &#10;498.15315,257.00973 520.41337,249.68267 534.42526,268.88598 525.42862,223.90279 522.14427,207.48103 499.88139,198.46355 479.38453,198.46355 482.41125,189.38338 479.2321,166.77665 457.32944,158.51384 455.91432,157.97998 422.49651,156.53304 410,179 403.95004,189.87696 401.00935,142.41531 369.4914,144.46102 343.46931,146.15002 342.50522,172.29956 332.73066,182.07411 328.74698,186.05779 309.31591,158.74185 290.98194,186.52432 z"
Opacity="0"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="#FFACB0B1">
<Path.Fill>
<RadialGradientBrush>
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5"
CenterY="0.5"
ScaleX="1.283"
ScaleY="1.322" />
<SkewTransform CenterX="0.5" CenterY="0.5" />
<RotateTransform CenterX="0.5" CenterY="0.5" />
<TranslateTransform X="-0.167" Y="-0.125" />
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Color="#FFFFFFFF" />
<GradientStop Offset="1" Color="#FFCBDBF9" />
<GradientStop Offset="0.254" Color="#FEFCFDFE" />
</RadialGradientBrush>
</Path.Fill>
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>

<!-- Middle Cloud -->
<Path x:Name="MiddleCloud"
Canvas.Left="211.87"
Canvas.Top="84.041"
Width="252.308"
Height="170.216"
Data="M290.98194,186.52432 C286.3447,193.55139 280.11695,228.80665 301.59189,232.38581 296.6266,239.0062 288.54087,242.91825 285,250 280.34656,259.30688 268.05813,280.85927 287.52861,293.04937 295.56457,298.08053 336.25528,293.49338 337.75281,286.00574 351.81571,318.20517 360.7299,310.2986 377.9321,310.15575 390.21954,310.05372 411.41423,303.41627 415.09759,284.99951 434.5749,294.73816 460.3604,327.52778 493.55493,306.95823 504.6382,300.0903 496.21589,257.64739&#10;498.15315,257.00973 520.41337,249.68267 534.42526,268.88598 525.42862,223.90279 522.14427,207.48103 499.88139,198.46355 479.38453,198.46355 482.41125,189.38338 479.2321,166.77665 457.32944,158.51384 455.91432,157.97998 422.49651,156.53304 410,179 403.95004,189.87696 401.00935,142.41531 369.4914,144.46102 343.46931,146.15002 342.50522,172.29956 332.73066,182.07411 328.74698,186.05779 309.31591,158.74185 290.98194,186.52432 z"
IsHitTestVisible="False"
Opacity="0"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="#FFACB0B1">
<Path.Fill>
<RadialGradientBrush>
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5"
CenterY="0.5"
ScaleX="1.283"
ScaleY="1.322" />
<SkewTransform CenterX="0.5" CenterY="0.5" />
<RotateTransform CenterX="0.5" CenterY="0.5" />
<TranslateTransform X="-0.167" Y="-0.125" />
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Color="#FFFFFFFF" />
<GradientStop Offset="1" Color="#FFCBDBF9" />
<GradientStop Offset="0.254" Color="#FEFCFDFE" />
</RadialGradientBrush>
</Path.Fill>
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>

<!-- Top Cloud -->
<Path x:Name="TopCloud"
Canvas.Left="47.87"
Canvas.Top="41.041"
Width="252.308"
Height="170.216"
Data="M290.98194,186.52432 C286.3447,193.55139 280.11695,228.80665 301.59189,232.38581 296.6266,239.0062 288.54087,242.91825 285,250 280.34656,259.30688 268.05813,280.85927 287.52861,293.04937 295.56457,298.08053 336.25528,293.49338 337.75281,286.00574 351.81571,318.20517 360.7299,310.2986 377.9321,310.15575 390.21954,310.05372 411.41423,303.41627 415.09759,284.99951 434.5749,294.73816 460.3604,327.52778 493.55493,306.95823 504.6382,300.0903 496.21589,257.64739&#10;498.15315,257.00973 520.41337,249.68267 534.42526,268.88598 525.42862,223.90279 522.14427,207.48103 499.88139,198.46355 479.38453,198.46355 482.41125,189.38338 479.2321,166.77665 457.32944,158.51384 455.91432,157.97998 422.49651,156.53304 410,179 403.95004,189.87696 401.00935,142.41531 369.4914,144.46102 343.46931,146.15002 342.50522,172.29956 332.73066,182.07411 328.74698,186.05779 309.31591,158.74185 290.98194,186.52432 z"
IsHitTestVisible="False"
Opacity="0"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="#FFACB0B1">
<Path.Fill>
<RadialGradientBrush>
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5"
CenterY="0.5"
ScaleX="1.283"
ScaleY="1.322" />
<SkewTransform CenterX="0.5" CenterY="0.5" />
<RotateTransform CenterX="0.5" CenterY="0.5" />
<TranslateTransform X="-0.167" Y="-0.125" />
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Color="#FFFFFFFF" />
<GradientStop Offset="1" Color="#FFCBDBF9" />
<GradientStop Offset="0.254" Color="#FEFCFDFE" />
</RadialGradientBrush>
</Path.Fill>
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="-0.686" />
<TranslateTransform X="0.029422772005858633" Y="-0.0073342317098052945" />
</TransformGroup>
</Path.RenderTransform>
</Path>

<!-- RainCanvas -->
<Canvas x:Name="RainCanvas" Opacity="0">
<!-- Rain -->
<Path x:Name="Rain1"
Canvas.Left="62"
Canvas.Top="203"
Width="5"
Height="34"
Data="M65,205 L64,235"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>

<Path x:Name="Rain2"
Canvas.Left="102"
Canvas.Top="226"
Width="4"
Height="46"
Data="M104,228 L104,270"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>

<Path x:Name="Rain3"
Canvas.Left="140"
Canvas.Top="228"
Width="4"
Height="23"
Data="M142,230 L142,249"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain4"
Canvas.Left="200"
Canvas.Top="265"
Width="7"
Height="56"
Data="M202,267 L205,319"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain5"
Canvas.Left="169"
Canvas.Top="210"
Width="5"
Height="28"
Data="M172,212 L171,236"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>

</Path>
<Path x:Name="Rain6"
Canvas.Left="157"
Canvas.Top="273"
Width="5"
Height="26"
Data="M160,275 L159,297"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain7"
Canvas.Left="246"
Canvas.Top="252"
Width="4"
Height="25"
Data="M248,254 L248,275"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain8"
Canvas.Left="335"
Canvas.Top="263"
Width="4"
Height="31"
Data="M337,265 L337,292"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain9"
Canvas.Left="372"
Canvas.Top="272"
Width="5"
Height="31"
Data="M374,274 L375,301"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain10"
Canvas.Left="428"
Canvas.Top="268"
Width="5"
Height="25"
Data="M431,270 L430,291"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain11"
Canvas.Left="296"
Canvas.Top="263"
Width="5"
Height="35"
Data="M299,265 L298,296"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain12"
Canvas.Left="264"
Canvas.Top="278"
Width="5"
Height="37"
Data="M267,280 L266,313"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain13"
Canvas.Left="234"
Canvas.Top="295"
Width="4"
Height="31"
Data="M236,297 L236,324"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain14"
Canvas.Left="318"
Canvas.Top="308"
Width="4"
Height="40"
Data="M320,310 L320,346"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain15"
Canvas.Left="403"
Canvas.Top="310"
Width="9"
Height="26"
Data="M410,312 L405,334"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain16"
Canvas.Left="109"
Canvas.Top="289"
Width="4"
Height="26"
Data="M111,291 L111,313"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain17"
Canvas.Left="66"
Canvas.Top="256"
Width="4"
Height="22"
Data="M68,258 L68,276"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain18"
Canvas.Left="141"
Canvas.Top="315"
Width="5"
Height="28"
Data="M143,317 L144,341"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Path x:Name="Rain19"
Canvas.Left="87"
Canvas.Top="295"
Width="6"
Height="45"
Data="M89,297 L91,338"
RenderTransformOrigin="0.5,0.5"
Stretch="Fill"
Stroke="{StaticResource RainColor}"
StrokeThickness="4">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="0" />
<TranslateTransform X="0" Y="0" />
</TransformGroup>
</Path.RenderTransform>
</Path>

</Canvas>
<!-- /RainCanvas -->

</Canvas>


<!-- Temperature -->
<StackPanel Width="200"
HorizontalAlignment="Right"
VerticalAlignment="Bottom">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{TemplateBinding Temperature}" />
<TextBlock Text=" degrees" />
</StackPanel>

<TextBlock Text="{TemplateBinding ConditionDescription}" TextWrapping="Wrap" />

</StackPanel>
</Grid>
</ControlTemplate>
</Setter.Value>

</Setter>

</Style>


Source (updated for WPF4): http://stevenhollidge.com/blog-source-code/WeatherStates.zip


Original page: http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-visual-state-manager-overview.aspx

Friday, 6 April 2012

Checker brush

image


<Window x:Class="CheckerBackground.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Checker Background"
Width="525"
Height="350">

<Window.Resources>
<SolidColorBrush x:Key="DarkSquareColor" Color="#18FFFFFF" />
<SolidColorBrush x:Key="LightSquareColor" Color="#34FFFFFF" />
<DrawingBrush x:Key="CheckerBackground"
Stretch="None"
TileMode="Tile"
Viewport="0,0,20,20"
ViewportUnits="Absolute">
<DrawingBrush.Drawing>
<DrawingGroup>
<GeometryDrawing Brush="{StaticResource DarkSquareColor}">
<GeometryDrawing.Geometry>
<GeometryGroup>
<RectangleGeometry Rect="0,0,10,10" />
<RectangleGeometry Rect="10,10,10,10" />
</GeometryGroup>
</GeometryDrawing.Geometry>
</GeometryDrawing>
<GeometryDrawing Brush="{StaticResource LightSquareColor}">
<GeometryDrawing.Geometry>
<GeometryGroup>
<RectangleGeometry Rect="10,0,10,10" />
<RectangleGeometry Rect="0,10,10,10" />
</GeometryGroup>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</Window.Resources>

<Grid>
<Rectangle Fill="#FF000000" />
<Rectangle Fill="{DynamicResource CheckerBackground}" />
</Grid>
</Window>

Copying Xaml Templates and Styles

Reflector is a quick win:

image

You can download the WPF control styles from my blog

Or download the cool little util Style Snooper:

image

Show Me The Template is a tool for exploring the templates, be their data, control or items panel, that comes with the controls built into WPF for all 6 themes.

image

Or use Expression Blend by selecting an object in Xaml then from the Object menu select Edit Style > Edit a Copy..:

image

Wrapping Listbox

Here’s a quick heads up on how to display multiple pieces of data horizontally so that it wraps around onto the next line.

image


<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>

Ermmm, yeah that’s it! Smile


The list will auto rearrange if the window/listbox is resized.


image


Here’s the full source with the ListBox.ItemTemplate DataTemplate binding to a list of int’s, supplied in the C# code behind file.



<Window x:Class="WrappingListbox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="Wrapping Listbox"
Width="525"
Height="350"
Icon="ICON.ico"
mc:Ignorable="d">
<Grid>
<ListBox x:Name="listbox1" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel ItemHeight="100"
ItemWidth="100"
Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="20" HorizontalAlignment="Center">
<Viewbox>
<Grid x:Name="backgroundGrid"
Width="48"
Height="48">
<Rectangle x:Name="Rect" Fill="Orange" />
<Label HorizontalContentAlignment="Center"
Content="{Binding}"
FontFamily="Segoe UI"
FontSize="24"
Foreground="White" />
</Grid>
</Viewbox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>


using System.Linq;

namespace WrappingListbox
{
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
listbox1.ItemsSource = Enumerable.Range(1, 100);
}
}
}

Source:  http://stevenhollidge.com/blog-source-code/WrappingListbox.zip


Selection


To override the default blue background when an item is selected as shown here:


image


We can make the colour red by setting the ItemsContainerStyle:


image



<Window.Resources>
<Style x:Key="CustomListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>
</Style.Resources>
</Style>
</Window.Resources>

<ListBox x:Name="listbox1"
ItemContainerStyle="{StaticResource CustomListBoxItemStyle}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">

.....

</ListBox>

Or maybe we’d prefer to have complete control over the the template. 


In that case we can use a tool such as StyleSnooper to retrieve the full style including templates and amend them as we see fit.


In this example I set the selected background to a grey colour and rounded the corners.


image



<Window x:Class="WrappingListbox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:System;assembly=mscorlib"
Title="Wrapping Listbox"
Width="525"
Height="350"
Icon="ICON.ico">

<Window.Resources>
<Style x:Key="CustomListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
<Style.Resources>
<ResourceDictionary />
</Style.Resources>
<Setter Property="Panel.Background">
<Setter.Value>
<SolidColorBrush>#00FFFFFF</SolidColorBrush>
</Setter.Value>
</Setter>
<Setter Property="Control.HorizontalContentAlignment">
<Setter.Value>
<Binding Path="HorizontalContentAlignment" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ItemsControl, AncestorLevel=1}" />
</Setter.Value>
</Setter>
<Setter Property="Control.VerticalContentAlignment">
<Setter.Value>
<Binding Path="VerticalContentAlignment" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ItemsControl, AncestorLevel=1}" />
</Setter.Value>
</Setter>
<Setter Property="Control.Padding">
<Setter.Value>
<Thickness>2,0,0,0</Thickness>
</Setter.Value>
</Setter>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border Name="Bd"
Background="{TemplateBinding Panel.Background}"
BorderBrush="{TemplateBinding Border.BorderBrush}"
BorderThickness="{TemplateBinding Border.BorderThickness}"
Padding="{TemplateBinding Control.Padding}"
SnapsToDevicePixels="True">
<ContentPresenter HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
Content="{TemplateBinding ContentControl.Content}"
ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}"
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Selector.IsSelected">
<Setter TargetName="Bd" Property="CornerRadius" Value="15" />
<Setter TargetName="Bd" Property="Panel.Background" Value="Gainsboro" />
<Setter Property="TextElement.Foreground">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.HighlightTextBrushKey}" />
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>True</s:Boolean>
</Trigger.Value>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelected">
<Condition.Value>
<s:Boolean>True</s:Boolean>
</Condition.Value>
</Condition>
<Condition Property="Selector.IsSelectionActive">
<Condition.Value>
<s:Boolean>False</s:Boolean>
</Condition.Value>
</Condition>
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Panel.Background">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.ControlBrushKey}" />
</Setter.Value>
</Setter>
<Setter Property="TextElement.Foreground">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.ControlTextBrushKey}" />
</Setter.Value>
</Setter>
</MultiTrigger>
<Trigger Property="UIElement.IsEnabled">
<Setter Property="TextElement.Foreground">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" />
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>False</s:Boolean>
</Trigger.Value>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>

<Grid>
<ListBox x:Name="listbox1"
ItemContainerStyle="{StaticResource CustomListBoxItemStyle}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel ItemHeight="100"
ItemWidth="100"
Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="20" HorizontalAlignment="Center">
<Viewbox>
<Grid x:Name="backgroundGrid"
Width="48"
Height="48">
<Rectangle x:Name="Rect" Fill="Orange" />
<Label HorizontalContentAlignment="Center"
Content="{Binding}"
FontFamily="Segoe UI"
FontSize="24"
Foreground="White" />
</Grid>
</Viewbox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>


MouseEnter


Using the VisualStateManager we have set the MouseEnter to animate to blue (the mouse is hovering over the number 6 although you can’t see the pointer in the image).


image



<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="CommonStates">
<VisualState Name="Normal" />
<VisualState Name="MouseOver">
<Storyboard>
<ColorAnimation Storyboard.TargetName="Bd"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
To="#FF6DBDD1" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>

This code is nested beneath a border control with the x:Name property set of “Bd”.

Thursday, 5 April 2012

SyncFusion Metro Studio

SyncFusion have come up with a nice little app that installs when you download their Metro Studio icon pack.

Metro Studio is written in WPF and shows off the Metro style very nicely.

The application lets you customise each of the icons, saving the results as PNG, JPG, BMP, GIF, ICO, TIFF or XAML.

icons

image

You can check it out here:  http://www.syncfusion.com/downloads/metrostudio

Wednesday, 4 April 2012

Continuous Testing

Various software vendors have produced some useful Visual Studio tooling to help TDD and BDD for developers.

They range from automatic build and running of affected tests on save to showing you the location of failing tests and code coverage figures within the coding IDE.

If you would like a demo project with tests to try out some of these tools you can download the following solution:

http://stevenhollidge.com/blog-source-code/LibrarySystem.zip

And, (for me) the winner is…

NCrunch for Visual Studio 2010

NCrunch is an automated parallel continuous testing tool for Visual Studio .NET. It intelligently takes responsibility for running automated tests so that you don't have to, and it gives you a huge amount of useful information about your tests (such as code coverage and performance metrics) inline in your IDE while you work.

ncrunch

Here are the rest:

Continuous Testing for Visual Studio 2010

  • MSTest for Visual Studio 2010
  • NUnit v2.5 or later
  • XUnit v1.5 or later

Continuous Testing for Visual Studio auto-detects your unit tests and runs them each time you build your solution. It adds an error to your error list for each test that fails, allowing you to navigate to the line of the test that failed, just like you would navigate from a compile error.

Continuous Testing removes a manual step for you, making your workflow far more efficient. 

There is a free version and a professional paid version with various enhancements such as auto ordering tests and aborting a test run on a first test failure.

Link: http://visualstudiogallery.msdn.microsoft.com/c074d3c6-71e2-4628-9e7c-7690e706aef4

vs-integration

Demon from RedGate

demon

Demon takes over the Visual Studio build to compile and run tests only for code that has changed.  See the nice green bar down the left side gutter (to the right of the collapse +/-)?  That’s what Demon adds to show your changes are all good.  If your changes result in tests breaking it changes to red.  It’s still in beta and doesn’t seem to be successful all the time but hopefully by the time it comes out of beta this may well become a must have tool.

Link:  http://www.red-gate.com/products/dotnet-development/dotnet-demon/

Mighty Moose from Continuous Tests

continuoustests

Again, this tool runs tests on build only for code that has changed.  You also get code coverage numbers in the left hand side gutter to give you a heads up on how many tests cover the overall method.

Link:  http://continuoustests.com/

And, here’s some old school tooling

Here is a few quick screenshot reminders for anyone that hasn’t already used ReShaper, TestDriven.NET and NCover tools:

ReSharper from JetBrains

You get a nice visual test runner with ReSharper, plus the nice icons next to each test in the coding IDE to allow individual running or debugging of tests or test cases.  Test cases are where you use the same test with multiple attributes above the method signature to pass in different test cases.

resharper

image

UnitTest-results

Coverage

coverage2

NCover

coverage1

Link: http://www.ncover.com

Performance

perf

Tuesday, 3 April 2012

WPF Metro Shell

Here is an example of a WPF application with pluggable components for core business functionality.

The solution features the following frameworks:

MVMMLight, MahApps.Metro, Ninject, ServiceLocator, Newtonsoft.Json, Rx Extensions

 

Projects

The main projects prefixed MetroWpf have a core shell window, login page and menu system.

MetroWpf-projects

Login

image

 

image

NOTE:

This is very much a work in progress but as I keep getting side tracked on other projects I thought I’d release what I have so far.

Source code:  http://stevenhollidge.com/blog-source-code/MetroWpf-CTP-v0.1.zip

HG repo:  http://hg.assembla.com/silverbladetech/file/4b8b38d17d24/MetroWpf

Sunday, 1 April 2012

Equality of Foo

image


#region Namespaces

using System;
using System.Collections;
using System.Collections.Generic;

#endregion

namespace Equality
{
public class Foo : IComparable,
IComparable<Foo>,
IEquatable<Foo>
{
#region Fields and Properties

private readonly string name;
public string Name { get { return name; } }

private readonly int value;
public int Value { get { return value; } }

#endregion

#region Constructor

public Foo(string name, int value)
{
this.name = name;
this.value = value;
}

#endregion

#region Object Overrides

public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof(Foo)) return false;
return Equals((Foo)obj);
}

public override int GetHashCode()
{
unchecked
{
return ((name != null ? name.GetHashCode() : 0) * 397) ^ value;
}
}

#endregion

#region Operators

public static bool operator ==(Foo left, Foo right)
{
return object.Equals(left, right);
}

public static bool operator !=(Foo left, Foo right)
{
return !(left == right);
}

#endregion

#region Implementation of IComparable

// internalizes the comparison, automatically used by Array.Sort and ArrayList.Sort

public int CompareTo(object obj)
{
return CompareTo(obj as Foo);
}

#endregion

#region Implementation of IComparable<in Foo>

// internalizes the comparison, automatically used by Array.Sort and ArrayList.Sort
public int CompareTo(Foo other)
{
if (other == null) return 1;

return String.CompareOrdinal(Name, other.Name);
}

#endregion

#region Implementation of IEquatable<Foo>

public bool Equals(Foo other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Equals(other.name, name) && other.value == value;
}

#endregion
}

public class FooNameInsensitiveComparer : IComparer,
IComparer<Foo>
{
#region Implementation of IComparer

public int Compare(object x, object y)
{
Foo foo1, foo2;

if (x is Foo)
foo1 = x as Foo;
else
throw new ArgumentException("Object x is not of type Foo.");

if (y is Foo)
foo2 = y as Foo;
else
throw new ArgumentException("Object y is not of type Foo.");

return Compare(foo1, foo2);
}

#endregion

#region Implementation of IComparer<in Foo>

public int Compare(Foo x, Foo y)
{
return ((new CaseInsensitiveComparer()).Compare(y.Name, x.Name));
}

#endregion
}

public class FooEqualityComparer : EqualityComparer<Foo>
{
#region Overrides of EqualityComparer<Foo>

public override bool Equals(Foo x, Foo y)
{
if (x == null || y == null)
return false;

return x.Name == y.Name && x.Value == y.Value;
}

public override int GetHashCode(Foo obj)
{
if (obj == null)
throw new ArgumentNullException();

int hash = 17;
hash = hash * 31 + (obj.Name == null ? 0 : obj.Name.GetHashCode());
hash = hash * 31 + obj.Value;
return hash;
}

#endregion
}
}