Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions MainDemo.Wpf/Domain/SmartHintViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ internal class SmartHintViewModel : ViewModelBase

private bool _floatHint = true;
private FloatingHintHorizontalAlignment _selectedAlignment = FloatingHintHorizontalAlignment.Inherit;
private FloatingHintHorizontalAlignment _selectedFloatingAlignment = FloatingHintHorizontalAlignment.Inherit;
private double _selectedFloatingScale = 0.75;
private bool _showClearButton = true;
private bool _showLeadingIcon = true;
Expand Down Expand Up @@ -55,6 +56,12 @@ public FloatingHintHorizontalAlignment SelectedAlignment
set => SetProperty(ref _selectedAlignment, value);
}

public FloatingHintHorizontalAlignment SelectedFloatingAlignment
{
get => _selectedFloatingAlignment;
set => SetProperty(ref _selectedFloatingAlignment, value);
}

public double SelectedFloatingScale
{
get => _selectedFloatingScale;
Expand Down
18 changes: 13 additions & 5 deletions MainDemo.Wpf/SmartHint.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
<Style TargetType="{x:Type local:InputElementContentControl}">
<Setter Property="Margin" Value="10,10,10,16" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="materialDesign:HintAssist.FloatingHintHorizontalAlignment" Value="{Binding SelectedAlignment}" />
<Setter Property="materialDesign:HintAssist.HintHorizontalAlignment" Value="{Binding SelectedAlignment}" />
<Setter Property="materialDesign:HintAssist.FloatingHintHorizontalAlignment" Value="{Binding SelectedFloatingAlignment}" />
<Setter Property="materialDesign:HintAssist.FloatingOffset" Value="{Binding SelectedFloatingOffset}" />
<Setter Property="materialDesign:HintAssist.FloatingScale" Value="{Binding SelectedFloatingScale}" />
<Setter Property="materialDesign:HintAssist.HelperText" Value="{Binding HelperText}" />
Expand Down Expand Up @@ -75,30 +76,37 @@
<StackPanel Orientation="Vertical">
<StackPanel Margin="10" Orientation="Horizontal">
<CheckBox Content="IsFloating" IsChecked="{Binding FloatHint}" />
<TextBlock Margin="20,0,0,0"
<TextBlock Margin="15,0,0,0"
VerticalAlignment="Center"
Text="Alignment:" />
<ComboBox Margin="5,0,0,0"
VerticalAlignment="Center"
ItemsSource="{Binding HorizontalAlignmentOptions}"
SelectedItem="{Binding SelectedAlignment, Mode=TwoWay}" />
<TextBlock Margin="20,0,0,0"
<TextBlock Margin="15,0,0,0"
VerticalAlignment="Center"
Text="FloatingAlignment:" />
<ComboBox Margin="5,0,0,0"
VerticalAlignment="Center"
ItemsSource="{Binding HorizontalAlignmentOptions}"
SelectedItem="{Binding SelectedFloatingAlignment, Mode=TwoWay}" />
<TextBlock Margin="15,0,0,0"
VerticalAlignment="Center"
Text="FloatingScale:" />
<ComboBox Margin="5,0,0,0"
VerticalAlignment="Center"
ItemStringFormat="F2"
ItemsSource="{Binding FloatingScaleOptions}"
SelectedItem="{Binding SelectedFloatingScale, Mode=TwoWay}" />
<TextBlock Margin="20,0,0,0"
<TextBlock Margin="15,0,0,0"
VerticalAlignment="Center"
Text="FloatingOffset:" />
<ComboBox Margin="5,0,0,0"
VerticalAlignment="Center"
ItemTemplate="{StaticResource FloatingOffsetTemplate}"
ItemsSource="{Binding FloatingOffsetOptions}"
SelectedItem="{Binding SelectedFloatingOffset, Mode=TwoWay}" />
<CheckBox Margin="20,0,0,0"
<CheckBox Margin="15,0,0,0"
Content="HasClearButton"
IsChecked="{Binding ShowClearButton}" />
<CheckBox Margin="20,0,0,0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,35 @@ internal class FloatingHintTextBlockMarginConverter : IMultiValueConverter
{
public object? Convert(object?[]? values, Type targetType, object? parameter, CultureInfo culture)
{
if (values?.Length != 7 || values.Any(v => v == null)
|| values[0] is not FloatingHintHorizontalAlignment floatingAlignment
|| values[1] is not HorizontalAlignment restingAlignment
|| !double.TryParse(values[2]!.ToString(), out double desiredWidth)
|| !double.TryParse(values[3]!.ToString(), out double availableWidth)
|| !double.TryParse(values[4]!.ToString(), out double scale)
|| !double.TryParse(values[5]!.ToString(), out double lower)
|| !double.TryParse(values[6]!.ToString(), out double upper))
if (values?.Length != 8 || values.Any(v => v == null)
|| values[0] is not FloatingHintHorizontalAlignment restingAlignmentOverride
|| values[1] is not FloatingHintHorizontalAlignment floatingAlignment
|| values[2] is not HorizontalAlignment restingAlignment
|| !double.TryParse(values[3]!.ToString(), out double desiredWidth)
|| !double.TryParse(values[4]!.ToString(), out double availableWidth)
|| !double.TryParse(values[5]!.ToString(), out double scale)
|| !double.TryParse(values[6]!.ToString(), out double lower)
|| !double.TryParse(values[7]!.ToString(), out double upper))
{
return Transform.Identity;
}

double scaleMultiplier = upper + (lower - upper) * scale;

HorizontalAlignment alignment = restingAlignment;
HorizontalAlignment restAlignment = restingAlignmentOverride switch
{
FloatingHintHorizontalAlignment.Inherit => restingAlignment,
FloatingHintHorizontalAlignment.Left => HorizontalAlignment.Left,
FloatingHintHorizontalAlignment.Center => HorizontalAlignment.Center,
FloatingHintHorizontalAlignment.Right => HorizontalAlignment.Right,
FloatingHintHorizontalAlignment.Stretch => HorizontalAlignment.Stretch,
_ => throw new ArgumentOutOfRangeException(),
};

HorizontalAlignment floatAlignment = restAlignment;
if (scale != 0)
{
alignment = floatingAlignment switch
floatAlignment = floatingAlignment switch
{
FloatingHintHorizontalAlignment.Inherit => restingAlignment,
FloatingHintHorizontalAlignment.Left => HorizontalAlignment.Left,
Expand All @@ -35,7 +46,7 @@ internal class FloatingHintTextBlockMarginConverter : IMultiValueConverter
_ => throw new ArgumentOutOfRangeException(),
};
}
double leftThickness = alignment switch
double leftThickness = floatAlignment switch
{
HorizontalAlignment.Right => FloatRight(),
HorizontalAlignment.Center => FloatCenter(),
Expand All @@ -46,13 +57,13 @@ internal class FloatingHintTextBlockMarginConverter : IMultiValueConverter

double FloatLeft()
{
if (restingAlignment == HorizontalAlignment.Center)
if (restAlignment == HorizontalAlignment.Center)
{
// Animate from center to left
double offset = Math.Max(0, (availableWidth - desiredWidth) / 2);
return offset - offset * scale;
}
if (restingAlignment == HorizontalAlignment.Right)
if (restAlignment == HorizontalAlignment.Right)
{
// Animate from right to left
double offset = Math.Max(0, availableWidth - desiredWidth);
Expand All @@ -63,13 +74,13 @@ double FloatLeft()

double FloatCenter()
{
if (restingAlignment == HorizontalAlignment.Left || restingAlignment == HorizontalAlignment.Stretch)
if (restAlignment == HorizontalAlignment.Left || restAlignment == HorizontalAlignment.Stretch)
{
// Animate from left to center
double offset = Math.Max(0, (availableWidth - desiredWidth * scaleMultiplier) / 2);
return offset * scale;
}
if (restingAlignment == HorizontalAlignment.Right)
if (restAlignment == HorizontalAlignment.Right)
{
// Animate from right to center
double startOffset = Math.Max(0, availableWidth - desiredWidth);
Expand All @@ -82,13 +93,13 @@ double FloatCenter()

double FloatRight()
{
if (restingAlignment == HorizontalAlignment.Left || restingAlignment == HorizontalAlignment.Stretch)
if (restAlignment == HorizontalAlignment.Left || restAlignment == HorizontalAlignment.Stretch)
{
// Animate from left to right
double offset = Math.Max(0, availableWidth - desiredWidth * scaleMultiplier);
return offset * scale;
}
if (restingAlignment == HorizontalAlignment.Center)
if (restAlignment == HorizontalAlignment.Center)
{
// Animate from center to right
double startOffset = Math.Max(0, (availableWidth - desiredWidth) / 2);
Expand Down
11 changes: 11 additions & 0 deletions MaterialDesignThemes.Wpf/HintAssist.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,17 @@ public static void SetHintOpacity(DependencyObject element, double value)
=> element.SetValue(HintOpacityProperty, value);
#endregion

#region AttachedProperty : HintHorizontalAlignment
public static readonly DependencyProperty HintHorizontalAlignmentProperty
= DependencyProperty.RegisterAttached("HintHorizontalAlignment", typeof(FloatingHintHorizontalAlignment), typeof(HintAssist),
new FrameworkPropertyMetadata(FloatingHintHorizontalAlignment.Inherit, FrameworkPropertyMetadataOptions.Inherits));

public static void SetHintHorizontalAlignment(DependencyObject element, FloatingHintHorizontalAlignment value)
=> element.SetValue(HintHorizontalAlignmentProperty, value);
public static FloatingHintHorizontalAlignment GetHintHorizontalAlignment(DependencyObject element)
=> (FloatingHintHorizontalAlignment)element.GetValue(HintHorizontalAlignmentProperty);
#endregion

#region AttachedProperty : FloatingHintHorizontalAlignment
public static readonly DependencyProperty FloatingHintHorizontalAlignmentProperty
= DependencyProperty.RegisterAttached("FloatingHintHorizontalAlignment", typeof(FloatingHintHorizontalAlignment), typeof(HintAssist),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@
Visibility="{TemplateBinding UseFloating, Converter={StaticResource BoolToVisConverter}}">
<ContentControl.Margin>
<MultiBinding Converter="{StaticResource FloatingHintTextBlockMarginConverter}">
<Binding Path="(wpf:HintAssist.HintHorizontalAlignment)" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="(wpf:HintAssist.FloatingHintHorizontalAlignment)" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="HorizontalContentAlignment" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}" />
Expand Down