Skip to content

Commit 6d3fd16

Browse files
committed
extended-smarthint
Spike for scaling and translating floating hint
1 parent 4c2ce28 commit 6d3fd16

File tree

7 files changed

+169
-12
lines changed

7 files changed

+169
-12
lines changed

MainDemo.Wpf/TextFields.xaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,15 @@
202202
materialDesign:HintAssist.Hint="Floating Password"
203203
Style="{StaticResource MaterialDesignFloatingHintPasswordBox}" />
204204

205+
<TextBox Grid.Row="6" Grid.Column="3"
206+
materialDesign:HintAssist.Hint="Large Font Size"
207+
materialDesign:HintAssist.FloatingScale="0.54"
208+
materialDesign:HintAssist.FloatingOffset="1,-54"
209+
Text="Some Text"
210+
Style="{StaticResource MaterialDesignFloatingHintTextBox}"
211+
FontSize="24"/>
212+
213+
205214
<TextBlock Grid.Row="7" Grid.Column="1" Style="{StaticResource MaterialDesignSubheadingTextBlock}"
206215
Margin="0 48 0 0">DataTemplate Test</TextBlock>
207216
<ContentControl Grid.Row="8" Grid.Column="1" Grid.ColumnSpan="4"
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Globalization;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using System.Windows.Data;
8+
9+
namespace MaterialDesignThemes.Wpf.Converters
10+
{
11+
public class DoubleRangeMultiConverter : IMultiValueConverter
12+
{
13+
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
14+
{
15+
if(values.Length != 3)
16+
{
17+
throw new ArgumentException("Expected three arguments", nameof(values));
18+
}
19+
20+
var percentage = (double)values[0];
21+
var from = (double)values[1];
22+
var to = (double)values[2];
23+
24+
var result = from + (to - from) * percentage;
25+
26+
return result;
27+
}
28+
29+
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
30+
{
31+
throw new NotImplementedException();
32+
}
33+
}
34+
}

MaterialDesignThemes.Wpf/HintAssist.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,41 @@ public static void SetIsFloating(DependencyObject element, bool value)
2424

2525
#endregion
2626

27+
#region FloatingScale & FloatingOffset
28+
29+
public static readonly DependencyProperty FloatingScaleProperty = DependencyProperty.RegisterAttached(
30+
"FloatingScale",
31+
typeof(double),
32+
typeof(HintAssist),
33+
new FrameworkPropertyMetadata(0.74d, FrameworkPropertyMetadataOptions.Inherits));
34+
35+
public static double GetFloatingScale(DependencyObject element)
36+
{
37+
return (double)element.GetValue(FloatingScaleProperty);
38+
}
39+
40+
public static void SetFloatingScale(DependencyObject element, double value)
41+
{
42+
element.SetValue(FloatingScaleProperty, value);
43+
}
44+
45+
public static readonly DependencyProperty FloatingOffsetProperty = DependencyProperty.RegisterAttached(
46+
"FloatingOffset",
47+
typeof(Point),
48+
typeof(HintAssist),
49+
new FrameworkPropertyMetadata(new Point(1, -27), FrameworkPropertyMetadataOptions.Inherits));
50+
51+
public static Point GetFloatingOffset(DependencyObject element)
52+
{
53+
return (Point)element.GetValue(FloatingOffsetProperty);
54+
}
55+
56+
public static void SetFloatingOffset(DependencyObject element, Point value)
57+
{
58+
element.SetValue(FloatingOffsetProperty, value);
59+
}
60+
#endregion
61+
2762
#region Hint
2863

2964
/// <summary>

MaterialDesignThemes.Wpf/MaterialDesignThemes.Wpf.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@
254254
<Compile Include="Converters\CircularProgressBar\StartPointConverter.cs" />
255255
<Compile Include="Converters\ClockItemIsCheckedConverter.cs" />
256256
<Compile Include="Converters\ClockLineConverter.cs" />
257+
<Compile Include="Converters\DoubleRangeMultiConverter.cs" />
257258
<Compile Include="Converters\DrawerOffsetConverter.cs" />
258259
<Compile Include="Converters\EqualityToVisibilityConverter.cs" />
259260
<Compile Include="Converters\HintProxyFabricConverter.cs" />

MaterialDesignThemes.Wpf/SmartHint.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,28 @@ public bool UseFloating
7676

7777
#endregion
7878

79+
#region FloatingScale & FloatingOffset
80+
81+
public static readonly DependencyProperty FloatingScaleProperty = DependencyProperty.Register(
82+
nameof(FloatingScale), typeof(double), typeof(SmartHint), new PropertyMetadata(.74));
83+
84+
public double FloatingScale
85+
{
86+
get { return (double)GetValue(FloatingScaleProperty); }
87+
set { SetValue(FloatingScaleProperty, value); }
88+
}
89+
90+
public static readonly DependencyProperty FloatingOffsetProperty = DependencyProperty.Register(
91+
nameof(FloatingOffset), typeof(Point), typeof(SmartHint), new PropertyMetadata(new Point(1, -27)));
92+
93+
public Point FloatingOffset
94+
{
95+
get { return (Point)GetValue(FloatingOffsetProperty); }
96+
set { SetValue(FloatingOffsetProperty, value); }
97+
}
98+
99+
#endregion
100+
79101
#region HintOpacity
80102

81103
public static readonly DependencyProperty HintOpacityProperty = DependencyProperty.Register(

MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.SmartHint.xaml

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
22
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3+
xmlns:system="clr-namespace:System;assembly=mscorlib"
34
xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf"
45
xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters">
56

67
<converters:BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
78
<converters:BooleanToVisibilityConverter x:Key="InverseBoolToVisConverter" TrueValue="Collapsed" FalseValue="Visible"/>
8-
9+
<converters:DoubleRangeMultiConverter x:Key="ScaleConverter"/>
10+
<converters:MathMultipleConverter x:Key="TranslateConverter" Operation="Multiply"/>
11+
<system:Double x:Key="NoContentFloatingScale">1.0</system:Double>
12+
913
<Style TargetType="{x:Type wpf:SmartHint}">
1014
<Setter Property="HorizontalAlignment" Value="Left"/>
1115
<Setter Property="VerticalAlignment" Value="Bottom"/>
@@ -31,18 +35,24 @@
3135
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="Opacity"
3236
Duration="0:0:0.3" To="{TemplateBinding HintOpacity}"
3337
EasingFunction="{StaticResource AnimationEasingFunction}"/>
38+
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="Tag"
39+
Duration="0:0:0.3" To="1"
40+
EasingFunction="{StaticResource AnimationEasingFunction}"/>
41+
42+
<!--
3443
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)"
35-
Duration="0:0:0.3" To=".74"
44+
Duration="0:0:0.3" To="{TemplateBinding FloatingScale}"
3645
EasingFunction="{StaticResource AnimationEasingFunction}"/>
3746
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleY)"
38-
Duration="0:0:0.3" To=".74"
47+
Duration="0:0:0.3" To="{TemplateBinding FloatingScale}"
3948
EasingFunction="{StaticResource AnimationEasingFunction}"/>
4049
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.X)"
41-
Duration="0:0:0.3" To="1"
50+
Duration="0:0:0.3" To="{TemplateBinding FloatingOffsetX}"
4251
EasingFunction="{StaticResource AnimationEasingFunction}"/>
4352
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.Y)"
44-
Duration="0:0:0.3" To="-27"
53+
Duration="0:0:0.3" To="{TemplateBinding FloatingOffsetY}"
4554
EasingFunction="{StaticResource AnimationEasingFunction}"/>
55+
-->
4656
</Storyboard>
4757
</VisualTransition>
4858
<VisualTransition From="*" To="ContentEmpty">
@@ -53,6 +63,10 @@
5363
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="Opacity"
5464
Duration="0:0:0.3"
5565
EasingFunction="{StaticResource AnimationEasingFunction}"/>
66+
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="Tag"
67+
Duration="0:0:0.3"
68+
EasingFunction="{StaticResource AnimationEasingFunction}"/>
69+
<!--
5670
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)"
5771
Duration="0:0:0.3"
5872
EasingFunction="{StaticResource AnimationEasingFunction}"/>
@@ -65,6 +79,7 @@
6579
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.Y)"
6680
Duration="0:0:0.3"
6781
EasingFunction="{StaticResource AnimationEasingFunction}"/>
82+
-->
6883
</Storyboard>
6984
</VisualTransition>
7085
</VisualStateGroup.Transitions>
@@ -74,14 +89,18 @@
7489
Duration="0" To="0" />
7590
<DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FloatingHintTextBlock"
7691
Duration="0" To="{TemplateBinding HintOpacity}" />
92+
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="Tag"
93+
Duration="0" To="1"/>
94+
<!--
7795
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)"
78-
Duration="0" To=".74" />
96+
Duration="0" To="{TemplateBinding FloatingScale}" />
7997
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleY)"
80-
Duration="0" To=".74" />
98+
Duration="0" To="{TemplateBinding FloatingScale}" />
8199
<DoubleAnimation Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.X)" Storyboard.TargetName="FloatingHintTextBlock"
82-
Duration="0" To="1" />
100+
Duration="0" To="{TemplateBinding FloatingOffsetX}" />
83101
<DoubleAnimation Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.Y)" Storyboard.TargetName="FloatingHintTextBlock"
84-
Duration="0" To="-27" />
102+
Duration="0" To="{TemplateBinding FloatingOffsetY}" />
103+
-->
85104
</Storyboard>
86105
</VisualState>
87106
<VisualState x:Name="ContentEmpty">
@@ -90,6 +109,9 @@
90109
Duration="0" />
91110
<DoubleAnimation Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FloatingHintTextBlock"
92111
Duration="0" />
112+
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="Tag"
113+
Duration="0" />
114+
<!--
93115
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)"
94116
Duration="0" />
95117
<DoubleAnimation Storyboard.TargetName="FloatingHintTextBlock" Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleY)"
@@ -98,6 +120,7 @@
98120
Duration="0" />
99121
<DoubleAnimation Storyboard.TargetProperty="(Control.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.Y)" Storyboard.TargetName="FloatingHintTextBlock"
100122
Duration="0" />
123+
-->
101124
</Storyboard>
102125
</VisualState>
103126
</VisualStateGroup>
@@ -111,12 +134,43 @@
111134
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
112135
Opacity="{TemplateBinding HintOpacity}"
113136
IsHitTestVisible="False"
114-
IsTabStop="False"
137+
IsTabStop="False"
115138
RenderTransformOrigin="0,1">
139+
<ContentControl.Tag>
140+
<system:Double>0.0</system:Double>
141+
</ContentControl.Tag>
116142
<ContentControl.RenderTransform>
117143
<TransformGroup>
118-
<TranslateTransform X="0" Y="0"/>
119-
<ScaleTransform ScaleX="1" ScaleY="1" />
144+
<TranslateTransform>
145+
<TranslateTransform.X>
146+
<MultiBinding Converter="{StaticResource TranslateConverter}">
147+
<Binding Path="Tag" ElementName="FloatingHintTextBlock"/>
148+
<Binding Path="FloatingOffset.X" RelativeSource="{RelativeSource TemplatedParent}"/>
149+
</MultiBinding>
150+
</TranslateTransform.X>
151+
<TranslateTransform.Y>
152+
<MultiBinding Converter="{StaticResource TranslateConverter}">
153+
<Binding Path="Tag" ElementName="FloatingHintTextBlock"/>
154+
<Binding Path="FloatingOffset.Y" RelativeSource="{RelativeSource TemplatedParent}"/>
155+
</MultiBinding>
156+
</TranslateTransform.Y>
157+
</TranslateTransform>
158+
<ScaleTransform>
159+
<ScaleTransform.ScaleX>
160+
<MultiBinding Converter="{StaticResource ScaleConverter}">
161+
<Binding Path="Tag" ElementName="FloatingHintTextBlock"/>
162+
<Binding Source="{StaticResource NoContentFloatingScale}"/>
163+
<Binding Path="FloatingScale" RelativeSource="{RelativeSource TemplatedParent}"/>
164+
</MultiBinding>
165+
</ScaleTransform.ScaleX>
166+
<ScaleTransform.ScaleY>
167+
<MultiBinding Converter="{StaticResource ScaleConverter}">
168+
<Binding Path="Tag" ElementName="FloatingHintTextBlock"/>
169+
<Binding Source="{StaticResource NoContentFloatingScale}"/>
170+
<Binding Path="FloatingScale" RelativeSource="{RelativeSource TemplatedParent}"/>
171+
</MultiBinding>
172+
</ScaleTransform.ScaleY>
173+
</ScaleTransform>
120174
</TransformGroup>
121175
</ContentControl.RenderTransform>
122176
</ContentControl>

MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TextBox.xaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@
8282
FontSize="{TemplateBinding FontSize}"
8383
HintOpacity="{Binding Path=(wpf:HintAssist.HintOpacity), RelativeSource={RelativeSource TemplatedParent}}"
8484
UseFloating="{Binding Path=(wpf:HintAssist.IsFloating), RelativeSource={RelativeSource TemplatedParent}}"
85+
FloatingScale="{Binding Path=(wpf:HintAssist.FloatingScale), RelativeSource={RelativeSource TemplatedParent}}"
86+
FloatingOffset="{Binding Path=(wpf:HintAssist.FloatingOffset), RelativeSource={RelativeSource TemplatedParent}}"
8587
/>
8688
</Grid>
8789
</Border>

0 commit comments

Comments
 (0)