diff --git a/MainDemo.Wpf/Domain/SmartHintViewModel.cs b/MainDemo.Wpf/Domain/SmartHintViewModel.cs index 13927bf41e..6dd9a8cdac 100644 --- a/MainDemo.Wpf/Domain/SmartHintViewModel.cs +++ b/MainDemo.Wpf/Domain/SmartHintViewModel.cs @@ -27,6 +27,8 @@ internal class SmartHintViewModel : ViewModelBase private string? _suffixText; private double _selectedFontSize = double.NaN; private FontFamily? _selectedFontFamily = DefaultFontFamily; + private bool? controlsEnabled = true; + private int _maxLength = 50; public IEnumerable HorizontalAlignmentOptions { get; } = Enum.GetValues(typeof(FloatingHintHorizontalAlignment)).OfType(); public IEnumerable FloatingScaleOptions { get; } = new[] {0.25, 0.5, 0.75, 1.0}; @@ -228,4 +230,22 @@ public FontFamily? SelectedFontFamily OnPropertyChanged(); } } + + public bool? ControlsEnabled + { + get => controlsEnabled; + set => SetProperty(ref controlsEnabled, value); + } + + public bool? ShowCharacterCounter + { + get => MaxLength > 0; + set => MaxLength = value == true ? 50 : 0; + } + + public int MaxLength + { + get => _maxLength; + set => SetProperty(ref _maxLength, value); + } } diff --git a/MainDemo.Wpf/Properties/launchSettings.json b/MainDemo.Wpf/Properties/launchSettings.json index 3b8cbc0041..04d2d71911 100644 --- a/MainDemo.Wpf/Properties/launchSettings.json +++ b/MainDemo.Wpf/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Demo App": { "commandName": "Project", - "commandLineArgs": "-p Home -t Inherit -f LeftToRight" + "commandLineArgs": "-p \"Smart Hint\" -t Inherit -f LeftToRight" } } } diff --git a/MainDemo.Wpf/SmartHint.xaml b/MainDemo.Wpf/SmartHint.xaml index 8a024a4002..fbfb0f9e5c 100644 --- a/MainDemo.Wpf/SmartHint.xaml +++ b/MainDemo.Wpf/SmartHint.xaml @@ -155,6 +155,10 @@ IsEnabled="{Binding ElementName=CheckBoxTrailingIcon, Path=IsChecked}" ItemsSource="{Binding IconSizeOptions}" SelectedItem="{Binding SelectedTrailingIconSize, Mode=TwoWay}" /> + @@ -164,7 +168,11 @@ Header="Control Settings" Style="{StaticResource MaterialDesignCardGroupBox}"> + + + + @@ -281,10 +292,189 @@ + VerticalAlignment="Top" + IsEnabled="{Binding ControlsEnabled}"> + + + + + + + + + + + + + + + + + + + MaterialDesignFloatingHintTextBoxNew + + + + + + + + + + + + + + + + + + MaterialDesignFilledTextBoxNew + + + + + + + + + + + + + + + + + + MaterialDesignOutlinedTextBoxNew + + + + + - + @@ -360,9 +553,12 @@ + + + @@ -411,9 +607,12 @@ + + + diff --git a/MaterialDesignThemes.Wpf/BottomDashedLineAdorner.cs b/MaterialDesignThemes.Wpf/BottomDashedLineAdorner.cs index 9652b540c4..30fd9b63b2 100644 --- a/MaterialDesignThemes.Wpf/BottomDashedLineAdorner.cs +++ b/MaterialDesignThemes.Wpf/BottomDashedLineAdorner.cs @@ -59,6 +59,16 @@ public static void SetBrushOpacity(DependencyObject element, double value) => element.SetValue(BrushOpacityProperty, value); #endregion + #region AttachedProperty : DashStyleProperty + public static readonly DependencyProperty DashStyleProperty + = DependencyProperty.RegisterAttached("DashStyle", typeof(DashStyle), typeof(BottomDashedLineAdorner), new PropertyMetadata(default(DashStyle))); + + public static void SetDashStyle(DependencyObject element, DashStyle? value) + => element.SetValue(DashStyleProperty, value); + public static DashStyle? GetDashStyle(DependencyObject element) + => (DashStyle?) element.GetValue(DashStyleProperty); + #endregion + public BottomDashedLineAdorner(UIElement adornedElement) : base(adornedElement) { } @@ -72,7 +82,7 @@ protected override void OnRender(DrawingContext drawingContext) var pen = new Pen(lineBrush, lineThickness) { - DashStyle = DashStyles.Dash, + DashStyle = GetDashStyle(AdornedElement) ?? DashStyles.Dash, DashCap = PenLineCap.Round }; diff --git a/MaterialDesignThemes.Wpf/Constants.cs b/MaterialDesignThemes.Wpf/Constants.cs index 73d5e409d4..19ae7f5213 100644 --- a/MaterialDesignThemes.Wpf/Constants.cs +++ b/MaterialDesignThemes.Wpf/Constants.cs @@ -3,7 +3,9 @@ namespace MaterialDesignThemes.Wpf; public static class Constants { public static readonly Thickness TextBoxDefaultPadding = new Thickness(0, 4, 0, 4); + public static readonly Thickness TextBoxDefaultPaddingNew = new Thickness(0, 8, 0, 4); public static readonly Thickness FilledTextBoxDefaultPadding = new Thickness(16, 8, 12, 8); + public static readonly Thickness FilledTextBoxDefaultPaddingNew = new Thickness(16, 12, 12, 8); public static readonly Thickness OutlinedTextBoxDefaultPadding = new Thickness(16, 16, 12, 16); public static readonly Thickness DefaultTextBoxViewMargin = new Thickness(1, 0, 1, 0); public static readonly Thickness DefaultTextBoxViewMarginEmbedded = new Thickness(0); diff --git a/MaterialDesignThemes.Wpf/Converters/BooleanToDashStyleConverter.cs b/MaterialDesignThemes.Wpf/Converters/BooleanToDashStyleConverter.cs new file mode 100644 index 0000000000..a5824b59dc --- /dev/null +++ b/MaterialDesignThemes.Wpf/Converters/BooleanToDashStyleConverter.cs @@ -0,0 +1,17 @@ +using System.Globalization; +using System.Windows.Data; +using System.Windows.Media; + +namespace MaterialDesignThemes.Wpf.Converters; + +public class BooleanToDashStyleConverter : IValueConverter +{ + public DashStyle? TrueValue { get; set; } + public DashStyle? FalseValue { get; set; } + + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + => value is true ? TrueValue : FalseValue; + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + => throw new NotImplementedException(); +} diff --git a/MaterialDesignThemes.Wpf/Converters/TextFieldClearButtonVisibilityConverter.cs b/MaterialDesignThemes.Wpf/Converters/TextFieldClearButtonVisibilityConverter.cs index 8f2c4c3b16..99f2b9f481 100644 --- a/MaterialDesignThemes.Wpf/Converters/TextFieldClearButtonVisibilityConverter.cs +++ b/MaterialDesignThemes.Wpf/Converters/TextFieldClearButtonVisibilityConverter.cs @@ -5,13 +5,15 @@ namespace MaterialDesignThemes.Wpf.Converters; internal class TextFieldClearButtonVisibilityConverter : IMultiValueConverter { + public Visibility ContentEmptyVisibility { get; set; } = Visibility.Hidden; + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (!(bool)values[0]) // TextFieldAssist.HasClearButton return Visibility.Collapsed; return (bool)values[1] // Hint.IsContentNullOrEmpty - ? Visibility.Hidden + ? ContentEmptyVisibility : Visibility.Visible; } diff --git a/MaterialDesignThemes.Wpf/Converters/TextFieldPrefixTextVisibilityConverter.cs b/MaterialDesignThemes.Wpf/Converters/TextFieldPrefixTextVisibilityConverter.cs index c8ab5d134c..f49555b8cd 100644 --- a/MaterialDesignThemes.Wpf/Converters/TextFieldPrefixTextVisibilityConverter.cs +++ b/MaterialDesignThemes.Wpf/Converters/TextFieldPrefixTextVisibilityConverter.cs @@ -5,6 +5,8 @@ namespace MaterialDesignThemes.Wpf.Converters; public class TextFieldPrefixTextVisibilityConverter : IMultiValueConverter { + public Visibility HiddenState { get; set; } = Visibility.Hidden; + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { string prefixText = (string)values[1]; @@ -14,7 +16,7 @@ public object Convert(object[] values, Type targetType, object parameter, Cultur } bool isHintInFloatingPosition = (bool)values[0]; - return isHintInFloatingPosition ? Visibility.Visible : Visibility.Hidden; + return isHintInFloatingPosition ? Visibility.Visible : HiddenState; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotImplementedException(); diff --git a/MaterialDesignThemes.Wpf/Converters/VerticalAlignmentConverter.cs b/MaterialDesignThemes.Wpf/Converters/VerticalAlignmentConverter.cs new file mode 100644 index 0000000000..37e6291320 --- /dev/null +++ b/MaterialDesignThemes.Wpf/Converters/VerticalAlignmentConverter.cs @@ -0,0 +1,14 @@ +using System.Globalization; +using System.Windows.Data; + +namespace MaterialDesignThemes.Wpf.Converters; + +public class VerticalAlignmentConverter : IValueConverter +{ + public VerticalAlignment StretchReplacement { get; set; } = VerticalAlignment.Top; + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + => value is VerticalAlignment.Stretch ? StretchReplacement : value; + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + => throw new NotImplementedException(); +} diff --git a/MaterialDesignThemes.Wpf/SmartHint.cs b/MaterialDesignThemes.Wpf/SmartHint.cs index 7645cf048d..de82f3c916 100644 --- a/MaterialDesignThemes.Wpf/SmartHint.cs +++ b/MaterialDesignThemes.Wpf/SmartHint.cs @@ -1,6 +1,4 @@ using System.ComponentModel; -using System.Globalization; -using System.Windows.Data; using MaterialDesignThemes.Wpf.Converters; namespace MaterialDesignThemes.Wpf; @@ -237,13 +235,3 @@ private void RefreshState(bool useTransitions) } } } - -public class VerticalAlignmentConverter : IValueConverter -{ - public VerticalAlignment StretchReplacement { get; set; } = VerticalAlignment.Top; - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - => value is VerticalAlignment.Stretch ? StretchReplacement : value; - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - => throw new NotImplementedException(); -} diff --git a/MaterialDesignThemes.Wpf/SmartHintNew.cs b/MaterialDesignThemes.Wpf/SmartHintNew.cs new file mode 100644 index 0000000000..958721a10a --- /dev/null +++ b/MaterialDesignThemes.Wpf/SmartHintNew.cs @@ -0,0 +1,18 @@ +using MaterialDesignThemes.Wpf.Converters; + +namespace MaterialDesignThemes.Wpf; + +/// +/// A control that implement placeholder behavior. Can work as a simple placeholder either as a floating hint, see property. +/// +/// To set a target control you should set the HintProxy property. Use the converter which converts a control into the IHintProxy interface. +/// +[TemplateVisualState(GroupName = ContentStatesGroupName, Name = HintRestingPositionName)] +[TemplateVisualState(GroupName = ContentStatesGroupName, Name = HintFloatingPositionName)] +public class SmartHintNew : SmartHint +{ + static SmartHintNew() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(SmartHintNew), new FrameworkPropertyMetadata(typeof(SmartHintNew))); + } +} diff --git a/MaterialDesignThemes.Wpf/Themes/Generic.xaml b/MaterialDesignThemes.Wpf/Themes/Generic.xaml index f60fbed55a..e62aee50f0 100644 --- a/MaterialDesignThemes.Wpf/Themes/Generic.xaml +++ b/MaterialDesignThemes.Wpf/Themes/Generic.xaml @@ -28,6 +28,7 @@ + diff --git a/MaterialDesignThemes.Wpf/Themes/MaterialDesign2.Defaults.xaml b/MaterialDesignThemes.Wpf/Themes/MaterialDesign2.Defaults.xaml index 89d01c398b..5ee51ef3ef 100644 --- a/MaterialDesignThemes.Wpf/Themes/MaterialDesign2.Defaults.xaml +++ b/MaterialDesignThemes.Wpf/Themes/MaterialDesign2.Defaults.xaml @@ -33,6 +33,7 @@ + diff --git a/MaterialDesignThemes.Wpf/Themes/MaterialDesign3.Defaults.xaml b/MaterialDesignThemes.Wpf/Themes/MaterialDesign3.Defaults.xaml index 36c4ba1c05..e06327c184 100644 --- a/MaterialDesignThemes.Wpf/Themes/MaterialDesign3.Defaults.xaml +++ b/MaterialDesignThemes.Wpf/Themes/MaterialDesign3.Defaults.xaml @@ -40,6 +40,7 @@ + diff --git a/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ComboBox.xaml b/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ComboBox.xaml index 8a23d2908c..988cd69169 100644 --- a/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ComboBox.xaml +++ b/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ComboBox.xaml @@ -35,7 +35,7 @@ - + 4 diff --git a/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DatePicker.xaml b/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DatePicker.xaml index 4de202b3e5..2aa41799f2 100644 --- a/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DatePicker.xaml +++ b/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.DatePicker.xaml @@ -28,7 +28,7 @@ AdditionalOffsetTop="12" CloneEdges="Top,Right,Bottom" FixedLeft="0" /> - + + + diff --git a/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TextBox.xaml b/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TextBox.xaml index 9728528298..ade2c0ef94 100644 --- a/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TextBox.xaml +++ b/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TextBox.xaml @@ -31,7 +31,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TimePicker.xaml b/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TimePicker.xaml index dac1aa8889..e3325ce057 100644 --- a/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TimePicker.xaml +++ b/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TimePicker.xaml @@ -26,7 +26,7 @@ AdditionalOffsetTop="12" CloneEdges="Top,Right,Bottom" FixedLeft="0" /> - +