Skip to content

Commit 6b40aa2

Browse files
Place custom scrollbar correctly using converters
1 parent 9c3ca06 commit 6b40aa2

File tree

3 files changed

+130
-68
lines changed

3 files changed

+130
-68
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.Globalization;
2+
using System.Windows.Data;
3+
4+
namespace MaterialDesignThemes.Wpf.Converters;
5+
6+
public class TextBoxHorizontalScrollBarMarginConverter : IMultiValueConverter
7+
{
8+
public object? Convert(object?[]? values, Type targetType, object? parameter, CultureInfo culture)
9+
{
10+
if (values is [
11+
double leadingIconWidth,
12+
Thickness leadingIconMargin,
13+
double prefixTextWidth,
14+
Thickness prefixTextMargin])
15+
{
16+
double offset = leadingIconWidth + leadingIconMargin.Left + leadingIconMargin.Right + prefixTextWidth + prefixTextMargin.Left + prefixTextMargin.Right;
17+
return new Thickness(offset, 1, 0, 0);
18+
}
19+
return new Thickness(0);
20+
}
21+
22+
public object?[]? ConvertBack(object? value, Type[] targetTypes, object? parameter, CultureInfo culture)
23+
=> throw new NotImplementedException();
24+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Globalization;
2+
using System.Windows.Data;
3+
4+
namespace MaterialDesignThemes.Wpf.Converters;
5+
6+
public class TextBoxHorizontalScrollBarWidthConverter : IMultiValueConverter
7+
{
8+
public object? Convert(object?[]? values, Type targetType, object? parameter, CultureInfo culture)
9+
{
10+
if (values is [double contentHostWidth, Visibility verticalScrollBarVisibility])
11+
{
12+
return contentHostWidth - (verticalScrollBarVisibility == Visibility.Visible ? SystemParameters.VerticalScrollBarWidth + 1 : 0);
13+
}
14+
return double.NaN;
15+
}
16+
17+
public object?[]? ConvertBack(object? value, Type[] targetTypes, object? parameter, CultureInfo culture)
18+
=> throw new NotImplementedException();
19+
}

src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TextBox.xaml

Lines changed: 87 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
<converters:ThicknessCloneConverter x:Key="HelperTextMarginConverter" CloneEdges="Left,Right" />
4949
<converters:MathConverter x:Key="DivisionConverter" Operation="Divide" Offset="1.5" />
5050
<converters:ThicknessCloneConverter x:Key="ThicknessCloneConverter" CloneEdges="All" AdditionalOffsetBottom="-1" />
51+
<converters:TextBoxHorizontalScrollBarMarginConverter x:Key="TextBoxHorizontalScrollBarMarginConverter" />
52+
<converters:TextBoxHorizontalScrollBarWidthConverter x:Key="TextBoxHorizontalScrollBarWidthConverter" />
5153
</Style.Resources>
5254

5355
<Setter Property="AutomationProperties.Name" Value="{Binding Path=(wpf:HintAssist.Hint), RelativeSource={RelativeSource Self}}" />
@@ -232,78 +234,95 @@
232234
</wpf:SmartHint.Hint>
233235
</wpf:SmartHint>
234236

235-
<TextBlock x:Name="PrefixTextBlock"
236-
Grid.Column="1"
237-
Margin="0,0,2,0"
238-
VerticalAlignment="Center"
239-
FontSize="{TemplateBinding FontSize}"
240-
Opacity="{TemplateBinding wpf:HintAssist.HintOpacity}"
241-
Text="{TemplateBinding wpf:TextFieldAssist.PrefixText}">
242-
<TextBlock.Visibility>
243-
<MultiBinding Converter="{StaticResource PrefixSuffixTextVisibilityConverter}">
244-
<Binding ElementName="Hint" Path="IsHintInFloatingPosition" />
245-
<Binding Path="(wpf:TextFieldAssist.PrefixText)" RelativeSource="{RelativeSource TemplatedParent}" />
246-
<Binding Path="(wpf:TextFieldAssist.PrefixTextVisibility)" RelativeSource="{RelativeSource TemplatedParent}" />
247-
<Binding Path="IsKeyboardFocusWithin" RelativeSource="{RelativeSource TemplatedParent}" />
248-
<Binding Path="IsReadOnly" RelativeSource="{RelativeSource TemplatedParent}" Converter="{x:Static converters:InvertBooleanConverter.Instance}" />
249-
</MultiBinding>
250-
</TextBlock.Visibility>
251-
</TextBlock>
237+
<TextBlock x:Name="PrefixTextBlock"
238+
Grid.Column="1"
239+
Margin="0,0,2,0"
240+
VerticalAlignment="Center"
241+
FontSize="{TemplateBinding FontSize}"
242+
Opacity="{TemplateBinding wpf:HintAssist.HintOpacity}"
243+
Text="{TemplateBinding wpf:TextFieldAssist.PrefixText}">
244+
<TextBlock.Visibility>
245+
<MultiBinding Converter="{StaticResource PrefixSuffixTextVisibilityConverter}">
246+
<Binding ElementName="Hint" Path="IsHintInFloatingPosition" />
247+
<Binding Path="(wpf:TextFieldAssist.PrefixText)" RelativeSource="{RelativeSource TemplatedParent}" />
248+
<Binding Path="(wpf:TextFieldAssist.PrefixTextVisibility)" RelativeSource="{RelativeSource TemplatedParent}" />
249+
<Binding Path="IsKeyboardFocusWithin" RelativeSource="{RelativeSource TemplatedParent}" />
250+
<Binding Path="IsReadOnly" RelativeSource="{RelativeSource TemplatedParent}" Converter="{x:Static converters:InvertBooleanConverter.Instance}" />
251+
</MultiBinding>
252+
</TextBlock.Visibility>
253+
</TextBlock>
252254

253-
<TextBlock x:Name="SuffixTextBlock"
254-
Grid.Column="3"
255-
Margin="2,0,0,0"
256-
VerticalAlignment="Center"
257-
FontSize="{TemplateBinding FontSize}"
258-
Opacity="{TemplateBinding wpf:HintAssist.HintOpacity}"
259-
Text="{TemplateBinding wpf:TextFieldAssist.SuffixText}">
260-
<TextBlock.Visibility>
261-
<MultiBinding Converter="{StaticResource PrefixSuffixTextVisibilityConverter}">
262-
<Binding ElementName="Hint" Path="IsHintInFloatingPosition" />
263-
<Binding Path="(wpf:TextFieldAssist.SuffixText)" RelativeSource="{RelativeSource TemplatedParent}" />
264-
<Binding Path="(wpf:TextFieldAssist.SuffixTextVisibility)" RelativeSource="{RelativeSource TemplatedParent}" />
265-
<Binding Path="IsKeyboardFocusWithin" RelativeSource="{RelativeSource TemplatedParent}" />
266-
<Binding Path="IsReadOnly" RelativeSource="{RelativeSource TemplatedParent}" Converter="{x:Static converters:InvertBooleanConverter.Instance}" />
267-
</MultiBinding>
268-
</TextBlock.Visibility>
269-
</TextBlock>
255+
<TextBlock x:Name="SuffixTextBlock"
256+
Grid.Column="3"
257+
Margin="2,0,0,0"
258+
VerticalAlignment="Center"
259+
FontSize="{TemplateBinding FontSize}"
260+
Opacity="{TemplateBinding wpf:HintAssist.HintOpacity}"
261+
Text="{TemplateBinding wpf:TextFieldAssist.SuffixText}">
262+
<TextBlock.Visibility>
263+
<MultiBinding Converter="{StaticResource PrefixSuffixTextVisibilityConverter}">
264+
<Binding ElementName="Hint" Path="IsHintInFloatingPosition" />
265+
<Binding Path="(wpf:TextFieldAssist.SuffixText)" RelativeSource="{RelativeSource TemplatedParent}" />
266+
<Binding Path="(wpf:TextFieldAssist.SuffixTextVisibility)" RelativeSource="{RelativeSource TemplatedParent}" />
267+
<Binding Path="IsKeyboardFocusWithin" RelativeSource="{RelativeSource TemplatedParent}" />
268+
<Binding Path="IsReadOnly" RelativeSource="{RelativeSource TemplatedParent}" Converter="{x:Static converters:InvertBooleanConverter.Instance}" />
269+
</MultiBinding>
270+
</TextBlock.Visibility>
271+
</TextBlock>
270272

271-
<wpf:PackIcon x:Name="TrailingPackIcon"
272-
Grid.Column="4"
273-
Width="{TemplateBinding wpf:TextFieldAssist.TrailingIconSize}"
274-
Height="{TemplateBinding wpf:TextFieldAssist.TrailingIconSize}"
275-
Margin="4,0,0,0"
276-
VerticalAlignment="{TemplateBinding wpf:TextFieldAssist.IconVerticalAlignment}"
277-
Kind="{TemplateBinding wpf:TextFieldAssist.TrailingIcon}"
278-
Opacity="{TemplateBinding wpf:HintAssist.HintOpacity}"
279-
Visibility="{TemplateBinding wpf:TextFieldAssist.HasTrailingIcon, Converter={x:Static converters:BooleanToVisibilityConverter.CollapsedInstance}}" />
273+
<wpf:PackIcon x:Name="TrailingPackIcon"
274+
Grid.Column="4"
275+
Width="{TemplateBinding wpf:TextFieldAssist.TrailingIconSize}"
276+
Height="{TemplateBinding wpf:TextFieldAssist.TrailingIconSize}"
277+
Margin="4,0,0,0"
278+
VerticalAlignment="{TemplateBinding wpf:TextFieldAssist.IconVerticalAlignment}"
279+
Kind="{TemplateBinding wpf:TextFieldAssist.TrailingIcon}"
280+
Opacity="{TemplateBinding wpf:HintAssist.HintOpacity}"
281+
Visibility="{TemplateBinding wpf:TextFieldAssist.HasTrailingIcon, Converter={x:Static converters:BooleanToVisibilityConverter.CollapsedInstance}}" />
280282

281-
<Button x:Name="PART_ClearButton"
282-
Grid.Column="5"
283-
Height="{TemplateBinding wpf:TextFieldAssist.ClearButtonSize}"
284-
Width="{TemplateBinding wpf:TextFieldAssist.ClearButtonSize}"
285-
Opacity="{TemplateBinding wpf:HintAssist.HintOpacity}"
286-
Padding="2,0,0,0"
287-
Command="{x:Static internal:ClearText.ClearCommand}"
288-
Focusable="False"
289-
Foreground="{TemplateBinding Foreground}"
290-
VerticalAlignment="{TemplateBinding wpf:TextFieldAssist.IconVerticalAlignment}"
291-
Style="{StaticResource MaterialDesignToolButton}">
292-
<Button.Visibility>
293-
<MultiBinding Converter="{StaticResource ClearButtonVisibilityConverter}">
294-
<Binding Path="(wpf:TextFieldAssist.HasClearButton)" RelativeSource="{RelativeSource TemplatedParent}" />
295-
<Binding ElementName="Hint" Path="IsContentNullOrEmpty" />
283+
<Button x:Name="PART_ClearButton"
284+
Grid.Column="5"
285+
Height="{TemplateBinding wpf:TextFieldAssist.ClearButtonSize}"
286+
Width="{TemplateBinding wpf:TextFieldAssist.ClearButtonSize}"
287+
Opacity="{TemplateBinding wpf:HintAssist.HintOpacity}"
288+
Padding="2,0,0,0"
289+
Command="{x:Static internal:ClearText.ClearCommand}"
290+
Focusable="False"
291+
Foreground="{TemplateBinding Foreground}"
292+
VerticalAlignment="{TemplateBinding wpf:TextFieldAssist.IconVerticalAlignment}"
293+
Style="{StaticResource MaterialDesignToolButton}">
294+
<Button.Visibility>
295+
<MultiBinding Converter="{StaticResource ClearButtonVisibilityConverter}">
296+
<Binding Path="(wpf:TextFieldAssist.HasClearButton)" RelativeSource="{RelativeSource TemplatedParent}" />
297+
<Binding ElementName="Hint" Path="IsContentNullOrEmpty" />
298+
</MultiBinding>
299+
</Button.Visibility>
300+
<wpf:PackIcon x:Name="ClearButtonIcon"
301+
Margin="0"
302+
Kind="CloseCircle"
303+
Height="auto"
304+
Width="auto" />
305+
</Button>
306+
</Grid>
307+
<ScrollBar x:Name="CustomScrollBar"
308+
Grid.Row="1"
309+
HorizontalAlignment="Left"
310+
Orientation="Horizontal">
311+
<ScrollBar.Margin>
312+
<MultiBinding Converter="{StaticResource TextBoxHorizontalScrollBarMarginConverter}">
313+
<Binding ElementName="LeadingPackIcon" Path="ActualWidth" />
314+
<Binding ElementName="LeadingPackIcon" Path="Margin" />
315+
<Binding ElementName="PrefixTextBlock" Path="ActualWidth" />
316+
<Binding ElementName="PrefixTextBlock" Path="Margin" />
296317
</MultiBinding>
297-
</Button.Visibility>
298-
<wpf:PackIcon x:Name="ClearButtonIcon"
299-
Margin="0"
300-
Kind="CloseCircle"
301-
Height="auto"
302-
Width="auto" />
303-
</Button>
304-
</Grid>
305-
<ScrollBar x:Name="CustomScrollBar" Grid.Row="1" Orientation="Horizontal" />
306-
318+
</ScrollBar.Margin>
319+
<ScrollBar.Width>
320+
<MultiBinding Converter="{StaticResource TextBoxHorizontalScrollBarWidthConverter}">
321+
<Binding ElementName="PART_ContentHost" Path="ActualWidth" />
322+
<Binding ElementName="PART_ContentHost" Path="ComputedVerticalScrollBarVisibility" />
323+
</MultiBinding>
324+
</ScrollBar.Width>
325+
</ScrollBar>
307326
</Grid>
308327
</Border>
309328
</AdornerDecorator>

0 commit comments

Comments
 (0)