Skip to content

Commit 44f66b7

Browse files
committed
first progress-button. lacking a demo.
1 parent b9962ed commit 44f66b7

File tree

6 files changed

+118
-11
lines changed

6 files changed

+118
-11
lines changed

MainDemo.Wpf/Buttons.xaml.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using System.Windows.Navigation;
1414
using System.Windows.Shapes;
1515
using MaterialDesignColors.WpfExample.Domain;
16+
using System.ComponentModel;
1617

1718
namespace MaterialDesignColors.WpfExample
1819
{
@@ -61,4 +62,11 @@ private void CountingButton_OnClick(object sender, RoutedEventArgs e)
6162

6263
}
6364
}
65+
66+
public class ButtonsViewModel : INotifyPropertyChanged
67+
{
68+
69+
70+
public event PropertyChangedEventHandler PropertyChanged;
71+
}
6472
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using System.Windows;
7+
using System.Windows.Controls;
8+
9+
namespace MaterialDesignThemes.Wpf
10+
{
11+
public static class ButtonAssist
12+
{
13+
public static readonly DependencyProperty MinimumProperty = DependencyProperty.RegisterAttached(
14+
"Minimum", typeof(double), typeof(ButtonAssist), new FrameworkPropertyMetadata(default(double)));
15+
16+
public static void SetMinimum(DependencyObject element, double value)
17+
{
18+
element.SetValue(MinimumProperty, value);
19+
}
20+
21+
public static double GetMinimum(DependencyObject element)
22+
{
23+
return (double)element.GetValue(MinimumProperty);
24+
}
25+
26+
public static readonly DependencyProperty MaximumProperty = DependencyProperty.RegisterAttached(
27+
"Maximum", typeof(double), typeof(ButtonAssist), new FrameworkPropertyMetadata(100.0));
28+
29+
public static void SetMaximum(DependencyObject element, double value)
30+
{
31+
element.SetValue(MaximumProperty, value);
32+
}
33+
34+
public static double GetMaximum(DependencyObject element)
35+
{
36+
return (double)element.GetValue(MaximumProperty);
37+
}
38+
39+
public static readonly DependencyProperty ValueProperty = DependencyProperty.RegisterAttached(
40+
"Value", typeof(double), typeof(ButtonAssist), new FrameworkPropertyMetadata(default(double)));
41+
42+
public static void SetValue(DependencyObject element, double value)
43+
{
44+
element.SetValue(ValueProperty, value);
45+
}
46+
47+
public static double GetValue(DependencyObject element)
48+
{
49+
return (double)element.GetValue(ValueProperty);
50+
}
51+
}
52+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Linq;
4+
using System.Windows.Data;
5+
6+
namespace MaterialDesignThemes.Wpf.Converters
7+
{
8+
public class RangeLengthConverter : IMultiValueConverter
9+
{
10+
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
11+
{
12+
if (values == null || values.Length != 4 || values.Any(v => v == null))
13+
return Binding.DoNothing;
14+
15+
if (!double.TryParse(values[0].ToString(), out double min)
16+
|| !double.TryParse(values[1].ToString(), out double max)
17+
|| !double.TryParse(values[2].ToString(), out double value)
18+
|| !double.TryParse(values[3].ToString(), out double containerLength))
19+
20+
return Binding.DoNothing;
21+
22+
var percent = (value - min) / (max - min);
23+
var length = percent * containerLength;
24+
25+
return length;
26+
}
27+
28+
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
29+
{
30+
throw new NotImplementedException();
31+
}
32+
}
33+
}

MaterialDesignThemes.Wpf/Converters/RangePositionConverterConverter.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,12 @@ public class RangePositionConverter : IMultiValueConverter
1212
{
1313
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
1414
{
15-
if(values == null || values.Length != 3 || values[0] == null || values[1] == null || values[2] == null)
15+
if(values == null || values.Length != 3 || values.Any(v => v == null))
1616
return Binding.DoNothing;
1717

18-
double positionAsScaleFactor, lower, upper;
19-
if (!double.TryParse(values[0].ToString(), out positionAsScaleFactor)
20-
|| !double.TryParse(values[1].ToString(), out lower)
21-
|| !double.TryParse(values[2].ToString(), out upper))
18+
if (!double.TryParse(values[0].ToString(), out double positionAsScaleFactor)
19+
|| !double.TryParse(values[1].ToString(), out double lower)
20+
|| !double.TryParse(values[2].ToString(), out double upper))
2221

2322
return Binding.DoNothing;
2423

MaterialDesignThemes.Wpf/MaterialDesignThemes.Wpf.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@
257257
</ItemGroup>
258258
<ItemGroup>
259259
<Compile Include="Badged.cs" />
260+
<Compile Include="ButtonAssist.cs" />
260261
<Compile Include="Card.cs" />
261262
<Compile Include="Chip.cs" />
262263
<Compile Include="Clock.cs" />
@@ -280,6 +281,7 @@
280281
<Compile Include="Converters\ClockItemIsCheckedConverter.cs" />
281282
<Compile Include="Converters\ClockLineConverter.cs" />
282283
<Compile Include="Converters\ListViewItemContainerStyleConverter.cs" />
284+
<Compile Include="Converters\RangeLengthConverter.cs" />
283285
<Compile Include="Converters\RangePositionConverterConverter.cs" />
284286
<Compile Include="Converters\DrawerOffsetConverter.cs" />
285287
<Compile Include="Converters\EqualityToVisibilityConverter.cs" />

MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.Button.xaml

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
</Setter>
1919
</Style>
2020

21+
<converters:RangeLengthConverter x:Key="RangeLengthConverter" />
22+
2123
<SolidColorBrush x:Key="AttentionToActionBrush" Color="{StaticResource MaterialDesignShadow}" Opacity=".23" po:Freeze="True" />
2224

2325
<Style x:Key="MaterialDesignRaisedButton" TargetType="{x:Type ButtonBase}">
@@ -40,12 +42,23 @@
4042
<ControlTemplate TargetType="{x:Type ButtonBase}">
4143
<Grid>
4244
<AdornerDecorator CacheMode="{Binding RelativeSource={RelativeSource Self}, Path=(wpf:ShadowAssist.CacheMode)}">
43-
<Border Background="{TemplateBinding Background}" CornerRadius="2"
44-
BorderThickness="{TemplateBinding BorderThickness}"
45-
BorderBrush="{TemplateBinding BorderBrush}"
46-
x:Name="border"
47-
Effect="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(wpf:ShadowAssist.ShadowDepth), Converter={x:Static converters:ShadowConverter.Instance}}">
48-
</Border>
45+
<Grid>
46+
<Border Background="{TemplateBinding Background}" CornerRadius="2"
47+
BorderThickness="{TemplateBinding BorderThickness}"
48+
BorderBrush="{TemplateBinding BorderBrush}"
49+
x:Name="border"
50+
Effect="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(wpf:ShadowAssist.ShadowDepth), Converter={x:Static converters:ShadowConverter.Instance}}" />
51+
<Border HorizontalAlignment="Left" Background="{DynamicResource MaterialDesignBackground}" Opacity=".4">
52+
<Border.Width>
53+
<MultiBinding Converter="{StaticResource RangeLengthConverter}">
54+
<Binding Path="wpf:ButtonAssist.Minumum" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ButtonBase}}" />
55+
<Binding Path="wpf:ButtonAssist.Maximum" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ButtonBase}}" />
56+
<Binding Path="wpf:ButtonAssist.Value" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ButtonBase}}" />
57+
<Binding Path="ActualWidth" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ButtonBase}}" />
58+
</MultiBinding>
59+
</Border.Width>
60+
</Border>
61+
</Grid>
4962
</AdornerDecorator>
5063
<wpf:Ripple Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" Focusable="False"
5164
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"

0 commit comments

Comments
 (0)