Skip to content

Commit dd24f9d

Browse files
committed
Fix issue: DatePicker adds the ButtonPosition setting to determine the left and right position of the icon (#223 ) 💯
1 parent 821349a commit dd24f9d

4 files changed

Lines changed: 106 additions & 131 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Windows;
4+
using System.Windows.Data;
5+
using WPFDevelopers.Controls;
6+
7+
namespace WPFDevelopers.Converts
8+
{
9+
10+
public class ButtonPositionToHorizontalAlignmentConverter : IValueConverter
11+
{
12+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
13+
{
14+
var position = (Position)value;
15+
return position == Position.Left ? HorizontalAlignment.Left : HorizontalAlignment.Right;
16+
}
17+
18+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
19+
=> throw new NotImplementedException();
20+
}
21+
22+
public class ButtonPositionToBooleanConverter : IValueConverter
23+
{
24+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
25+
{
26+
if (value == null || parameter == null)
27+
return false;
28+
29+
var position = (Position)value;
30+
var targetPosition = (Position)parameter;
31+
32+
return position == targetPosition;
33+
}
34+
35+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
36+
=> throw new NotImplementedException();
37+
}
38+
39+
}

src/WPFDevelopers.Shared/Core/Helpers/DatePickerHelper.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,29 @@ public class DatePickerHelper
5858
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
5959
OnSelectedDateTimeChanged));
6060

61+
public static readonly DependencyProperty ButtonPositionProperty =
62+
DependencyProperty.RegisterAttached(
63+
"ButtonPosition",
64+
typeof(Position),
65+
typeof(DatePickerHelper),
66+
new PropertyMetadata(Position.Right, OnButtonPositionChanged));
67+
68+
private static void OnButtonPositionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
69+
{
70+
if (d is DatePicker datePicker)
71+
{
72+
datePicker.Loaded += (s, args) =>
73+
{
74+
if (datePicker.Template.FindName("PART_TextBoxContainer", datePicker) is FrameworkElement container)
75+
{
76+
var position = (Position)e.NewValue;
77+
container.Margin = position == Position.Left
78+
? new Thickness(24, 0, 0, 0)
79+
: new Thickness(1, 0, 0, 0);
80+
}
81+
};
82+
}
83+
}
6184

6285
public static object GetWatermark(DependencyObject obj)
6386
{
@@ -125,6 +148,16 @@ public static void SetSelectedDateTime(DependencyObject obj, DateTime? value)
125148
obj.SetValue(SelectedDateTimeProperty, value);
126149
}
127150

151+
public static void SetButtonPosition(UIElement element, Position value)
152+
{
153+
element.SetValue(ButtonPositionProperty, value);
154+
}
155+
156+
public static Position GetButtonPosition(UIElement element)
157+
{
158+
return (Position)element.GetValue(ButtonPositionProperty);
159+
}
160+
128161
private static void OnWatermarkChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
129162
{
130163
if (d is DatePicker datePicker)
@@ -169,7 +202,10 @@ private static void SetDatePickerTextBoxWatermark(DatePickerTextBox d, object va
169202
{
170203
var watermarkControl = d.Template.FindName("PART_Watermark", d) as ContentControl;
171204
if (watermarkControl != null)
205+
{
206+
watermarkControl.Margin = new Thickness(1, 0, 0, 0);
172207
watermarkControl.Content = value;
208+
}
173209
}
174210
}
175211

@@ -180,7 +216,10 @@ private static void SetWatermarkInternal(DatePicker d, object value)
180216
{
181217
var watermarkControl = textBox.Template.FindName("PART_Watermark", textBox) as ContentControl;
182218
if (watermarkControl != null)
219+
{
220+
watermarkControl.Margin = new Thickness(1, 0, 0, 0);
183221
watermarkControl.Content = value;
222+
}
184223
}
185224
}
186225

src/WPFDevelopers.Shared/Styles/Styles.DatePicker.xaml

Lines changed: 27 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
33
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
44
xmlns:controls="clr-namespace:WPFDevelopers.Controls"
5+
xmlns:converts="clr-namespace:WPFDevelopers.Converts"
56
xmlns:helpers="clr-namespace:WPFDevelopers.Helpers">
67
<ResourceDictionary.MergedDictionaries>
78
<ResourceDictionary Source="../Themes/Basic/ControlBasic.xaml" />
89
<ResourceDictionary Source="../Themes/Basic/Animations.xaml" />
910
</ResourceDictionary.MergedDictionaries>
11+
<converts:ButtonPositionToBooleanConverter x:Key="WD.ButtonPositionToBooleanConverter" />
12+
<converts:ButtonPositionToHorizontalAlignmentConverter x:Key="WD.ButtonPositionToHorizontalAlignmentConverter" />
1013
<Style
1114
x:Key="WD.CalendarDayButtonStyle"
1215
BasedOn="{StaticResource WD.ControlBasicStyle}"
@@ -487,112 +490,20 @@
487490
</Style>
488491

489492
<Style
490-
x:Key="WD.DropDownButtonStyle"
493+
x:Key="WD.DatePickerDropDownButtonStyle"
491494
BasedOn="{StaticResource WD.ControlBasicStyle}"
492495
TargetType="Button">
493496
<Setter Property="Template">
494497
<Setter.Value>
495498
<ControlTemplate TargetType="{x:Type Button}">
496-
<Grid>
497-
<Grid.ColumnDefinitions>
498-
<ColumnDefinition Width="30" />
499-
<ColumnDefinition />
500-
</Grid.ColumnDefinitions>
501-
<Border
502-
x:Name="Border"
503-
Grid.ColumnSpan="2"
504-
Background="{DynamicResource WD.BackgroundBrush}" />
505-
<Grid
506-
Width="19"
507-
Height="18"
508-
HorizontalAlignment="Center"
509-
VerticalAlignment="Center"
510-
FlowDirection="LeftToRight">
511-
<Grid.ColumnDefinitions>
512-
<ColumnDefinition Width="20*" />
513-
<ColumnDefinition Width="20*" />
514-
<ColumnDefinition Width="20*" />
515-
<ColumnDefinition Width="20*" />
516-
</Grid.ColumnDefinitions>
517-
<Grid.RowDefinitions>
518-
<RowDefinition Height="23*" />
519-
<RowDefinition Height="19*" />
520-
<RowDefinition Height="19*" />
521-
<RowDefinition Height="19*" />
522-
</Grid.RowDefinitions>
523-
<Border
524-
x:Name="Highlight"
525-
Grid.Row="0"
526-
Grid.RowSpan="4"
527-
Grid.ColumnSpan="4"
528-
Margin="-1"
529-
BorderBrush="{DynamicResource WD.RegularTextBrush}"
530-
BorderThickness="1"
531-
CornerRadius="0,0,1,1"
532-
Opacity="1" />
533-
<Border
534-
x:Name="Background"
535-
Grid.Row="1"
536-
Grid.RowSpan="3"
537-
Grid.ColumnSpan="4"
538-
Margin="0,-1,0,0"
539-
Background="{DynamicResource WD.BackgroundBrush}"
540-
BorderBrush="{DynamicResource WD.RegularTextBrush}"
541-
BorderThickness="1"
542-
CornerRadius=".5"
543-
Opacity="1" />
544-
<Border
545-
x:Name="BackgroundGradient"
546-
Grid.Row="1"
547-
Grid.RowSpan="3"
548-
Grid.ColumnSpan="4"
549-
Margin="0,-1,0,0"
550-
Background="{DynamicResource WD.BackgroundBrush}"
551-
BorderBrush="{DynamicResource WD.RegularTextBrush}"
552-
BorderThickness="1"
553-
CornerRadius=".5"
554-
Opacity="1" />
555-
<Rectangle
556-
Grid.RowSpan="1"
557-
Grid.ColumnSpan="4"
558-
Fill="{DynamicResource WD.RegularTextBrush}"
559-
Stroke="{DynamicResource WD.RegularTextBrush}"
560-
StrokeThickness="1" />
561-
<Path
562-
Grid.Row="1"
563-
Grid.RowSpan="3"
564-
Grid.Column="0"
565-
Grid.ColumnSpan="4"
566-
Margin="4,3,4,3"
567-
HorizontalAlignment="Center"
568-
VerticalAlignment="Center"
569-
Data="{StaticResource WD.DatePickerGeometry}"
570-
Fill="{DynamicResource WD.RegularTextBrush}"
571-
RenderTransformOrigin="0.5,0.5"
572-
Stretch="Fill" />
573-
<Ellipse
574-
Grid.ColumnSpan="4"
575-
Width="3"
576-
Height="3"
577-
HorizontalAlignment="Center"
578-
VerticalAlignment="Center"
579-
Fill="{DynamicResource WD.BackgroundBrush}"
580-
StrokeThickness="0" />
581-
<Border
582-
x:Name="DisabledVisual"
583-
Grid.Row="0"
584-
Grid.RowSpan="4"
585-
Grid.ColumnSpan="4"
586-
BorderBrush="{DynamicResource WD.BackgroundBrush}"
587-
BorderThickness="1"
588-
CornerRadius="0,0,.5,.5"
589-
Opacity="0" />
590-
</Grid>
591-
</Grid>
499+
<Border Background="{DynamicResource WD.BackgroundBrush}">
500+
<ContentPresenter />
501+
</Border>
592502
</ControlTemplate>
593503
</Setter.Value>
594504
</Setter>
595505
</Style>
506+
596507
<Style
597508
x:Key="WD.DefaultDatePickerTextBox"
598509
BasedOn="{StaticResource WD.ControlBasicStyle}"
@@ -677,19 +588,28 @@
677588
VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
678589
<Button
679590
x:Name="PART_Button"
591+
Content=""
680592
Focusable="False"
681593
Foreground="{TemplateBinding Foreground}"
682-
Style="{StaticResource WD.DropDownButtonStyle}" />
683-
<DatePickerTextBox
684-
x:Name="PART_TextBox"
685-
Width="Auto"
686-
Margin="28,0,0,0"
687-
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
688-
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
689-
Background="Transparent"
690-
Focusable="True"
594+
Style="{StaticResource WD.DatePickerDropDownButtonStyle}" />
595+
596+
<controls:PathIcon
597+
Width="19"
598+
Height="18"
599+
HorizontalAlignment="{Binding Path=(helpers:DatePickerHelper.ButtonPosition), RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource WD.ButtonPositionToHorizontalAlignmentConverter}}"
691600
Foreground="{TemplateBinding Foreground}"
692-
SelectionBrush="{DynamicResource WD.WindowBorderBrush}" />
601+
Kind="DatePicker" />
602+
<Border x:Name="PART_TextBoxContainer" Margin="1,0">
603+
<DatePickerTextBox
604+
x:Name="PART_TextBox"
605+
Width="Auto"
606+
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
607+
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
608+
Background="Transparent"
609+
Focusable="True"
610+
Foreground="{TemplateBinding Foreground}"
611+
SelectionBrush="{DynamicResource WD.WindowBorderBrush}" />
612+
</Border>
693613
<Popup
694614
x:Name="PART_Popup"
695615
AllowsTransparency="True"

src/WPFDevelopers.Shared/Themes/Basic/Geometrys.xaml

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,7 @@
1818
<Geometry x:Key="WD.PreviousGeometry" po:Freeze="True">M658 316l-196 196 196 196-60 60-256-256 256-256z</Geometry>
1919
<Geometry x:Key="WD.NextGeometry" po:Freeze="True">M426 256l256 256-256 256-60-60 196-196-196-196z</Geometry>
2020
<Geometry x:Key="WD.DatePickerGeometry" po:Freeze="True">
21-
M11.426758,8.4305077 L11.749023,8.4305077
22-
L11.749023,16.331387 L10.674805,16.331387
23-
L10.674805,10.299648 L9.0742188,11.298672
24-
L9.0742188,10.294277 C9.4788408,10.090176
25-
9.9094238,9.8090878 10.365967,9.4510155
26-
C10.82251,9.0929432 11.176106,8.7527733
27-
11.426758,8.4305077 z M14.65086,8.4305077
28-
L18.566387,8.4305077 L18.566387,9.3435936
29-
L15.671368,9.3435936 L15.671368,11.255703
30-
C15.936341,11.058764 16.27293,10.960293
31-
16.681133,10.960293 C17.411602,10.960293
32-
17.969301,11.178717 18.354229,11.615566
33-
C18.739157,12.052416 18.931622,12.673672
34-
18.931622,13.479336 C18.931622,15.452317
35-
18.052553,16.438808 16.294415,16.438808
36-
C15.560365,16.438808 14.951641,16.234707
37-
14.468243,15.826504 L14.881817,14.929531
38-
C15.368796,15.326992 15.837872,15.525723
39-
16.289043,15.525723 C17.298809,15.525723
40-
17.803692,14.895514 17.803692,13.635098
41-
C17.803692,12.460618 17.305971,11.873379
42-
16.310528,11.873379 C15.83071,11.873379
43-
15.399232,12.079271 15.016094,12.491055
44-
L14.65086,12.238613 z
21+
M12,19a1,1,0,1,0-1-1A1,1,0,0,0,12,19Zm5,0a1,1,0,1,0-1-1A1,1,0,0,0,17,19Zm0-4a1,1,0,1,0-1-1A1,1,0,0,0,17,15Zm-5,0a1,1,0,1,0-1-1A1,1,0,0,0,12,15ZM19,3H18V2a1,1,0,0,0-2,0V3H8V2A1,1,0,0,0,6,2V3H5A3,3,0,0,0,2,6V20a3,3,0,0,0,3,3H19a3,3,0,0,0,3-3V6A3,3,0,0,0,19,3Zm1,17a1,1,0,0,1-1,1H5a1,1,0,0,1-1-1V11H20ZM20,9H4V6A1,1,0,0,1,5,5H6V6A1,1,0,0,0,8,6V5h8V6a1,1,0,0,0,2,0V5h1a1,1,0,0,1,1,1ZM7,15a1,1,0,1,0-1-1A1,1,0,0,0,7,15Zm0,4a1,1,0,1,0-1-1A1,1,0,0,0,7,19Z
4522
</Geometry>
4623

4724
<Geometry x:Key="WD.ChevronRightGeometry" po:Freeze="True">M678.4 512l-365.619-379.904c-13.722-13.824-13.722-36.198 0-50.125 13.722-13.824 35.891-13.824 49.613 0l400.896 404.89c13.722 13.875 13.722 36.301 0 50.125l-400.896 404.89c-13.722 13.875-35.891 13.824-49.613 0-13.722-13.773-13.722-36.198 0-50.125l365.619-379.75z</Geometry>

0 commit comments

Comments
 (0)