I wanted a spinner control, and a nice one. Google searches did not help, although heaps of recommendations and a few free controls could be found, non of them was satisfying enough for what I wanted to do. And of-course I didn’t want some C# code-behind. So I opened XamlPadX and started building one for myself.
Result is something like this and I am happy with it:
It is nothing more than a template for ProgressBar. By the way, setting the IsInditerminate to True makes the number in the middle to disappear, resulting a generic wait spinner.
Below is the xaml to achieve the spinner progress bar, you can put it some where in your resources and use it:
<Grid.Resources> <Style TargetType="ProgressBar" x:Key="SpinnerProgress"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ProgressBar"> <Grid> <ProgressBar x:Name="pgBar" Value="{TemplateBinding Value}" Visibility="Collapsed" IsIndeterminate="{TemplateBinding IsIndeterminate}"/> <TextBox Background="Red" Text="{Binding ElementName=pgBar, Path=Value}"> <TextBox.Style> <Style TargetType="{x:Type TextBox}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TextBox"> <Grid> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal"> <TextBlock Text="{TemplateBinding Text}"> <TextBlock.Style> <Style TargetType="TextBlock"> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=pgBar, Path=IsIndeterminate}" Value="True"> <Setter Property="Visibility" Value="Collapsed"/> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> <TextBlock Text="%"/> </TextBlock> </StackPanel> <Grid Width="50" Height="50" x:Name="mainGrid"> <Grid.RenderTransform> <RotateTransform Angle="0" CenterX="25" CenterY="25" /> </Grid.RenderTransform> <Grid.Triggers> <EventTrigger RoutedEvent="Grid.Loaded"> <BeginStoryboard> <Storyboard RepeatBehavior="Forever"> <DoubleAnimation From="0" To="360" Duration="00:00:00.750" Storyboard.TargetName="mainGrid" Storyboard.TargetProperty="(Grid.RenderTransform).(RotateTransform.Angle)" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Grid.Triggers> <Border x:Name="spinnerMask" BorderThickness="6" CornerRadius="25" BorderBrush="White"/> <Rectangle> <Rectangle.OpacityMask> <VisualBrush Visual="{Binding ElementName=spinnerMask}"/> </Rectangle.OpacityMask> <Rectangle.Fill> <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5"> <GradientStop Color="#FF068206" Offset="0" /> <GradientStop Color="#FF72CE72" Offset="0.198" /> <GradientStop Color="#FFC2FFC2" Offset="0.48" /> <GradientStop Color="#FFC2FFC2" Offset="0.52" /> <GradientStop Color="#FF72CE72" Offset="0.891" /> <GradientStop Color="#FF068206" Offset="1" /> </LinearGradientBrush> </Rectangle.Fill> </Rectangle> <Rectangle Fill="#FF068206"> <Rectangle.OpacityMask> <VisualBrush Visual="{Binding ElementName=spinnerMask}"/> </Rectangle.OpacityMask> <Rectangle.Clip> <RectangleGeometry Rect="0,0,50,25"/> </Rectangle.Clip> </Rectangle> </Grid> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </TextBox.Style> </TextBox> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </Grid.Resources>
And here is how to use it:
<ProgressBar Style="{StaticResource ResourceKey=SpinnerProgress}" IsIndeterminate="False" Value="12"/>