Add StatusBar control

This commit is contained in:
2019-04-11 15:11:21 +02:00
parent 684393f85d
commit bc4615761c
3 changed files with 168 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="PlantBox.Client.Forms.Controls.StatusBar.StatusBar">
<ContentView.Content>
<StackLayout HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<Label x:Name="label"
HorizontalOptions="CenterAndExpand"
VerticalOptions="Start"
FontSize="Medium" />
<AbsoluteLayout FlexLayout.Grow="1"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<BoxView x:Name="BackgroundBar"
AbsoluteLayout.LayoutBounds="0, 1, 1, 1"
AbsoluteLayout.LayoutFlags="All" />
<BoxView x:Name="ForegroundBar"
AbsoluteLayout.LayoutBounds="0, 1, 1, .5"
AbsoluteLayout.LayoutFlags="All" />
<BoxView x:Name="UpperBoundBar"
AbsoluteLayout.LayoutBounds="0, 0.2, 1, 5" />
<BoxView x:Name="LowerBoundBar"
AbsoluteLayout.LayoutBounds="0, 0.8, 1, 5" />
</AbsoluteLayout>
<Image x:Name="image"
HorizontalOptions="CenterAndExpand"
VerticalOptions="End"
Margin="2"/>
</StackLayout>
</ContentView.Content>
</ContentView>

View File

@@ -0,0 +1,133 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace PlantBox.Client.Forms.Controls.StatusBar
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class StatusBar : ContentView
{
// Progress
public static readonly BindableProperty ProgressProperty = BindableProperty.Create(nameof(Progress), typeof(double), typeof(StatusBar));
public double Progress
{
get => (double)GetValue(ProgressProperty);
set => SetValue(ProgressProperty, value);
}
// HintColor
public static readonly BindableProperty HintColorProperty = BindableProperty.Create(nameof(HintColor), typeof(Color), typeof(StatusBar));
public Color HintColor
{
get => (Color)GetValue(HintColorProperty);
set => SetValue(HintColorProperty, value);
}
// ForegroundColor
public static readonly BindableProperty ForegroundColorProperty = BindableProperty.Create(nameof(ForegroundColor), typeof(Color), typeof(StatusBar));
public Color ForegroundColor
{
get => (Color)GetValue(ForegroundColorProperty);
set => SetValue(ForegroundColorProperty, value);
}
// Image
public static readonly BindableProperty ImageProperty = BindableProperty.Create(nameof(Image), typeof(ImageSource), typeof(StatusBar));
public ImageSource Image
{
get => (ImageSource)GetValue(ImageProperty);
set => SetValue(ImageProperty, value);
}
// Label
public static readonly BindableProperty LabelProperty = BindableProperty.Create(nameof(Label), typeof(string), typeof(StatusBar));
public string Label
{
get => (string)GetValue(LabelProperty);
set => SetValue(LabelProperty, value);
}
// BoundHeight
public static readonly BindableProperty BoundHeightProperty = BindableProperty.Create(nameof(BoundHeight), typeof(double), typeof(StatusBar));
public double BoundHeight
{
get => (double)GetValue(BoundHeightProperty);
set => SetValue(BoundHeightProperty, value);
}
// BoundColor
public static readonly BindableProperty BoundColorProperty = BindableProperty.Create(nameof(BoundColor), typeof(Color), typeof(StatusBar));
public Color BoundColor
{
get => (Color)GetValue(BoundColorProperty);
set => SetValue(BoundColorProperty, value);
}
// LowerBound
public static readonly BindableProperty LowerBoundProperty = BindableProperty.Create(nameof(LowerBound), typeof(double), typeof(StatusBar), 0.2);
public double LowerBound
{
get => (double)GetValue(LowerBoundProperty);
set => SetValue(LowerBoundProperty, value);
}
// UpperBound
public static readonly BindableProperty UpperBoundProperty = BindableProperty.Create(nameof(UpperBound), typeof(double), typeof(StatusBar), 0.8);
public double UpperBound
{
get => (double)GetValue(UpperBoundProperty);
set => SetValue(UpperBoundProperty, value);
}
public StatusBar()
{
InitializeComponent();
AbsoluteLayout.SetLayoutFlags(UpperBoundBar, AbsoluteLayoutFlags.PositionProportional | AbsoluteLayoutFlags.WidthProportional);
AbsoluteLayout.SetLayoutFlags(LowerBoundBar, AbsoluteLayoutFlags.PositionProportional | AbsoluteLayoutFlags.WidthProportional);
}
protected override void OnPropertyChanged([CallerMemberName]string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (propertyName == ProgressProperty.PropertyName)
{
new Animation
(
x => AbsoluteLayout.SetLayoutBounds(ForegroundBar, new Rectangle(0, 1, 1, x)),
AbsoluteLayout.GetLayoutBounds(ForegroundBar).Height,
Progress,
Easing.CubicInOut
).Commit(this, "Scale", 16, 1000);
}
if (propertyName == HintColorProperty.PropertyName)
{
BackgroundBar.BackgroundColor = HintColor;
}
if (propertyName == ForegroundColorProperty.PropertyName)
{
ForegroundBar.BackgroundColor = ForegroundColor;
label.TextColor = ForegroundColor;
}
if (propertyName == ImageProperty.PropertyName)
{
image.Source = Image;
}
if (propertyName == LabelProperty.PropertyName)
{
label.Text = Label;
}
if (propertyName == BoundHeightProperty.PropertyName || propertyName == LowerBoundProperty.PropertyName || propertyName == UpperBoundProperty.PropertyName)
{
// Y axis is reversed
double realBoundHeight = BoundHeight / BackgroundBar.Height;
AbsoluteLayout.SetLayoutBounds(LowerBoundBar, new Rectangle(0, 1 - LowerBound, 1, BoundHeight));
AbsoluteLayout.SetLayoutBounds(UpperBoundBar, new Rectangle(0, 1 - UpperBound, 1, BoundHeight));
}
if (propertyName == BoundColorProperty.PropertyName)
{
LowerBoundBar.BackgroundColor = BoundColor;
UpperBoundBar.BackgroundColor = BoundColor;
}
}
}
}

View File

@@ -43,6 +43,9 @@
<EmbeddedResource Update="Forms\AboutPage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Update="Forms\Controls\StatusBar.xaml">
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
<EmbeddedResource Update="Forms\HomePage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>