· 3 months ago · Jun 13, 2025, 06:15 AM
1<ResourceDictionary xmlns="https://github.com/avaloniaui"
2 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3 xmlns:converters="clr-namespace:Avalonia.Controls.Converters;assembly=Avalonia.Controls"
4 xmlns:suki="https://github.com/kikipoulet/SukiUI"
5 xmlns:system="clr-namespace:System;assembly=netstandard">
6 <!-- Add Resources Here -->
7 <Design.PreviewWith>
8 <Border Width="800"
9 Height="580"
10 Padding="20"
11 Background="{DynamicResource SukiBackground}">
12 <Grid ColumnDefinitions="Auto,*,Auto"
13 ColumnSpacing="10"
14 RowDefinitions="*"
15 RowSpacing="10">
16 <StackPanel Grid.Row="0"
17 Grid.Column="0"
18 Width="250"
19 Spacing="5">
20
21 <TextBox IsEnabled="False"
22 Text="Disabled text"
23 Watermark="TextBox" />
24
25 <TextBox suki:TextBoxExtensions.AddDeleteButton="True"
26 BorderBrush="Red"
27 BorderThickness="10"
28 Text="Thick border"
29 UseFloatingWatermark="True" />
30
31 <TextBox suki:TextBoxExtensions.AddDeleteButton="True" Text="Error validation">
32 <DataValidationErrors.Error>
33 <system:Exception>
34 <x:Arguments>
35 <x:String>Validation error</x:String>
36 </x:Arguments>
37 </system:Exception>
38 </DataValidationErrors.Error>
39 </TextBox>
40
41 <TextBox suki:TextBoxExtensions.Prefix="https://"
42 Text="test.com"
43 UseFloatingWatermark="True"
44 Watermark="Url" />
45
46 <TextBox InnerLeftContent="[L]"
47 InnerRightContent="[R]"
48 Text="InnerContent" />
49
50 <TextBox Classes="NoShadow" Watermark="NoShadow" />
51
52 <NumericUpDown Value="1">
53 <DataValidationErrors.Error>
54 <system:Exception>
55 <x:Arguments>
56 <x:String>Validation error</x:String>
57 </x:Arguments>
58 </system:Exception>
59 </DataValidationErrors.Error>
60 </NumericUpDown>
61
62 <Panel>
63 <Border Margin="0,0,0,25" Classes="Card">
64 <StackPanel>
65 <TextBlock Margin="6,0,0,3"
66 FontSize="13"
67 FontWeight="{DynamicResource DefaultDemiBold}"
68 Text="Username" />
69 <TextBox BorderBrush="Red"
70 BorderThickness="1"
71 Classes="clearButton"
72 Text="Admin" />
73
74 <TextBlock Margin="6,18,0,3"
75 FontSize="13"
76 FontWeight="{DynamicResource DefaultDemiBold}"
77 Text="Password" />
78 <TextBox Margin="0,0,0,20"
79 suki:TextBoxExtensions.AddDeleteButton="True"
80 Classes="revealPasswordButton"
81 PasswordChar="*"
82 Text="password" />
83 </StackPanel>
84 </Border>
85 <Button Width="160"
86 HorizontalAlignment="Center"
87 VerticalAlignment="Bottom"
88 Classes="Rounded Flat">
89 <StackPanel HorizontalAlignment="Center"
90 VerticalAlignment="Center"
91 Orientation="Horizontal">
92 <PathIcon Data="{x:Static suki:Icons.Login}" Foreground="White" />
93 <TextBlock Margin="10,0,0,0"
94 FontSize="13"
95 FontWeight="{DynamicResource DefaultDemiBold}"
96 Foreground="White"
97 Text="Sign In" />
98 </StackPanel>
99 </Button>
100 </Panel>
101 </StackPanel>
102
103 <TextBox Grid.Row="0"
104 Grid.Column="1"
105 VerticalAlignment="Top"
106 AcceptsReturn="True"
107 Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis laoreet nibh tortor, at vulputate sem porttitor in. Praesent tempus suscipit eros, in molestie nibh semper sed. Pellentesque pellentesque elit bibendum, rhoncus nisi ac, posuere justo. Mauris a rhoncus est. Sed id mi dictum, vestibulum nibh sit amet, aliquet elit. Nunc sit amet ante cursus, tincidunt sapien sed, egestas nibh. Praesent a erat justo. Sed ultrices varius metus ac tristique. 
Morbi aliquam justo ac blandit pretium. Mauris eleifend nunc at lobortis auctor. Cras sagittis nulla eu sem molestie, vitae varius eros vestibulum. Curabitur mollis dapibus tellus, vitae ornare nisi. Maecenas vehicula ipsum quis sapien maximus scelerisque. Fusce quis vestibulum nibh. Phasellus at vulputate nisi, vitae blandit ligula. Phasellus sem erat, eleifend vel efficitur eget, vehicula posuere felis. Sed auctor, ipsum vel semper lacinia, leo mauris ornare nulla, rutrum aliquam odio est ac mi. 
Cras id lacus vel ante ultricies efficitur eu sit amet libero. Proin laoreet felis at risus lobortis, vel aliquet quam sodales. Pellentesque laoreet metus erat, ac ultrices orci suscipit vitae. Nam congue, eros ut tempus venenatis, elit massa finibus lacus, eu gravida turpis lectus sed odio. Suspendisse potenti. Vivamus aliquam ipsum nec justo egestas efficitur nec eget orci. Aenean vitae ullamcorper libero, sit amet luctus diam. Proin in augue aliquam, maximus tortor quis, lobortis mi. 
Quisque ex massa, volutpat a urna nec, ultricies condimentum tellus. Aliquam erat volutpat. Sed consequat odio risus, imperdiet venenatis nisi semper in. Duis elit mi, sollicitudin at quam quis, imperdiet cursus erat. Morbi varius, neque ut cursus feugiat, orci metus tempor erat, in gravida sapien massa sed nisl. Nullam mattis mi neque, vel consequat odio dictum ut. Nam sed massa velit. Integer eget odio massa. Suspendisse quis sapien euismod, pharetra mauris id, sodales justo. Maecenas elementum urna est, sit amet luctus felis sagittis sed. 
Curabitur sit amet metus vitae augue malesuada interdum. Nulla id felis eu magna interdum finibus. Nam rutrum magna dolor, nec consequat metus interdum eget. In laoreet venenatis maximus. Suspendisse convallis laoreet ipsum nec tempus. Donec convallis ex a scelerisque hendrerit. Quisque luctus odio et nulla ullamcorper, a mollis nunc finibus. Morbi dictum lorem quis mi ornare, vitae mattis erat ullamcorper. Duis lacus enim, dictum non lorem nec, vehicula aliquet dolor. Phasellus egestas viverra elementum."
108 TextWrapping="Wrap" />
109
110 <Border Grid.Row="0"
111 Grid.Column="2"
112 Width="200"
113 MaxHeight="300"
114 VerticalAlignment="Top">
115 <TextBox AcceptsReturn="True"
116 Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis laoreet nibh tortor, at vulputate sem porttitor in. Praesent tempus suscipit eros, in molestie nibh semper sed. Pellentesque pellentesque elit bibendum, rhoncus nisi ac, posuere justo. Mauris a rhoncus est. Sed id mi dictum, vestibulum nibh sit amet, aliquet elit. Nunc sit amet ante cursus, tincidunt sapien sed, egestas nibh. Praesent a erat justo. Sed ultrices varius metus ac tristique. 
Morbi aliquam justo ac blandit pretium. Mauris eleifend nunc at lobortis auctor. Cras sagittis nulla eu sem molestie, vitae varius eros vestibulum. Curabitur mollis dapibus tellus, vitae ornare nisi. Maecenas vehicula ipsum quis sapien maximus scelerisque. Fusce quis vestibulum nibh. Phasellus at vulputate nisi, vitae blandit ligula. Phasellus sem erat, eleifend vel efficitur eget, vehicula posuere felis. Sed auctor, ipsum vel semper lacinia, leo mauris ornare nulla, rutrum aliquam odio est ac mi. 
Cras id lacus vel ante ultricies efficitur eu sit amet libero. Proin laoreet felis at risus lobortis, vel aliquet quam sodales. Pellentesque laoreet metus erat, ac ultrices orci suscipit vitae. Nam congue, eros ut tempus venenatis, elit massa finibus lacus, eu gravida turpis lectus sed odio. Suspendisse potenti. Vivamus aliquam ipsum nec justo egestas efficitur nec eget orci. Aenean vitae ullamcorper libero, sit amet luctus diam. Proin in augue aliquam, maximus tortor quis, lobortis mi. 
Quisque ex massa, volutpat a urna nec, ultricies condimentum tellus. Aliquam erat volutpat. Sed consequat odio risus, imperdiet venenatis nisi semper in. Duis elit mi, sollicitudin at quam quis, imperdiet cursus erat. Morbi varius, neque ut cursus feugiat, orci metus tempor erat, in gravida sapien massa sed nisl. Nullam mattis mi neque, vel consequat odio dictum ut. Nam sed massa velit. Integer eget odio massa. Suspendisse quis sapien euismod, pharetra mauris id, sodales justo. Maecenas elementum urna est, sit amet luctus felis sagittis sed. 
Curabitur sit amet metus vitae augue malesuada interdum. Nulla id felis eu magna interdum finibus. Nam rutrum magna dolor, nec consequat metus interdum eget. In laoreet venenatis maximus. Suspendisse convallis laoreet ipsum nec tempus. Donec convallis ex a scelerisque hendrerit. Quisque luctus odio et nulla ullamcorper, a mollis nunc finibus. Morbi dictum lorem quis mi ornare, vitae mattis erat ullamcorper. Duis lacus enim, dictum non lorem nec, vehicula aliquet dolor. Phasellus egestas viverra elementum."
117 TextWrapping="Wrap" />
118 </Border>
119
120
121
122 </Grid>
123 </Border>
124 </Design.PreviewWith>
125
126 <StreamGeometry x:Key="TextBoxClearButtonData">M 11.416016,10 20,1.4160156 18.583984,0 10,8.5839846 1.4160156,0 0,1.4160156 8.5839844,10 0,18.583985 1.4160156,20 10,11.416015 18.583984,20 20,18.583985 Z</StreamGeometry>
127 <StreamGeometry x:Key="PasswordBoxRevealButtonData">m10.051 7.0032c2.215 0 4.0105 1.7901 4.0105 3.9984s-1.7956 3.9984-4.0105 3.9984c-2.215 0-4.0105-1.7901-4.0105-3.9984s1.7956-3.9984 4.0105-3.9984zm0 1.4994c-1.3844 0-2.5066 1.1188-2.5066 2.499s1.1222 2.499 2.5066 2.499 2.5066-1.1188 2.5066-2.499-1.1222-2.499-2.5066-2.499zm0-5.0026c4.6257 0 8.6188 3.1487 9.7267 7.5613 0.10085 0.40165-0.14399 0.80877-0.54686 0.90931-0.40288 0.10054-0.81122-0.14355-0.91208-0.54521-0.94136-3.7492-4.3361-6.4261-8.2678-6.4261-3.9334 0-7.3292 2.6792-8.2689 6.4306-0.10063 0.40171-0.50884 0.64603-0.91177 0.54571s-0.648-0.5073-0.54737-0.90901c1.106-4.4152 5.1003-7.5667 9.728-7.5667z</StreamGeometry>
128 <StreamGeometry x:Key="PasswordBoxHideButtonData">m0.21967 0.21965c-0.26627 0.26627-0.29047 0.68293-0.07262 0.97654l0.07262 0.08412 4.0346 4.0346c-1.922 1.3495-3.3585 3.365-3.9554 5.7495-0.10058 0.4018 0.14362 0.8091 0.54543 0.9097 0.40182 0.1005 0.80909-0.1436 0.90968-0.5455 0.52947-2.1151 1.8371-3.8891 3.5802-5.0341l1.8096 1.8098c-0.70751 0.7215-1.1438 1.71-1.1438 2.8003 0 2.2092 1.7909 4 4 4 1.0904 0 2.0788-0.4363 2.8004-1.1438l5.9193 5.9195c0.2929 0.2929 0.7677 0.2929 1.0606 0 0.2663-0.2662 0.2905-0.6829 0.0726-0.9765l-0.0726-0.0841-6.1135-6.1142 0.0012-0.0015-1.2001-1.1979-2.8699-2.8693 2e-3 -8e-4 -2.8812-2.8782 0.0012-0.0018-1.1333-1.1305-4.3064-4.3058c-0.29289-0.29289-0.76777-0.29289-1.0607 0zm7.9844 9.0458 3.5351 3.5351c-0.45 0.4358-1.0633 0.704-1.7392 0.704-1.3807 0-2.5-1.1193-2.5-2.5 0-0.6759 0.26824-1.2892 0.7041-1.7391zm1.7959-5.7655c-1.0003 0-1.9709 0.14807-2.8889 0.425l1.237 1.2362c0.5358-0.10587 1.0883-0.16119 1.6519-0.16119 3.9231 0 7.3099 2.6803 8.2471 6.4332 0.1004 0.4018 0.5075 0.6462 0.9094 0.5459 0.4019-0.1004 0.6463-0.5075 0.5459-0.9094-1.103-4.417-5.0869-7.5697-9.7024-7.5697zm0.1947 3.5093 3.8013 3.8007c-0.1018-2.0569-1.7488-3.7024-3.8013-3.8007z</StreamGeometry>
129
130 <MenuFlyout x:Key="DefaultTextBoxContextFlyout" Placement="Bottom">
131 <MenuItem x:Name="TextBoxContextFlyoutCutItem"
132 Margin="10,0,0,0"
133 Command="{Binding $parent[TextBox].Cut}"
134 Header="{DynamicResource STRING_MENU_CUT}"
135 InputGesture="{x:Static TextBox.CutGesture}"
136 IsEnabled="{Binding $parent[TextBox].CanCut}" />
137 <MenuItem x:Name="TextBoxContextFlyoutCopyItem"
138 Margin="10,0,0,0"
139 Command="{Binding $parent[TextBox].Copy}"
140 Header="{DynamicResource STRING_MENU_COPY}"
141 InputGesture="{x:Static TextBox.CopyGesture}"
142 IsEnabled="{Binding $parent[TextBox].CanCopy}" />
143 <MenuItem x:Name="TextBoxContextFlyoutPasteItem"
144 Margin="10,0,0,0"
145 Command="{Binding $parent[TextBox].Paste}"
146 Header="{DynamicResource STRING_MENU_PASTE}"
147 InputGesture="{x:Static TextBox.PasteGesture}"
148 IsEnabled="{Binding $parent[TextBox].CanPaste}" />
149 </MenuFlyout>
150
151 <ContextMenu x:Key="DefaultTextBoxContextMenu" x:Name="TextBoxContextMenu">
152 <MenuItem x:Name="TextBoxContextMenuCutItem"
153 Margin="10,0,0,0"
154 Command="{Binding $parent[TextBox].Cut}"
155 Header="Cut"
156 InputGesture="{x:Static TextBox.CutGesture}"
157 IsEnabled="{Binding $parent[TextBox].CanCut}" />
158 <MenuItem x:Name="TextBoxContextMenuCopyItem"
159 Margin="10,0,0,0"
160 Command="{Binding $parent[TextBox].Copy}"
161 Header="Copy"
162 InputGesture="{x:Static TextBox.CopyGesture}"
163 IsEnabled="{Binding $parent[TextBox].CanCopy}" />
164 <MenuItem x:Name="TextBoxContextMenuPasteItem"
165 Margin="10,0,0,0"
166 Command="{Binding $parent[TextBox].Paste}"
167 Header="Paste"
168 InputGesture="{x:Static TextBox.PasteGesture}"
169 IsEnabled="{Binding $parent[TextBox].CanPaste}" />
170 </ContextMenu>
171
172 <system:Double x:Key="SukiTextBoxElementSpacing">5</system:Double>
173 <suki:StringToDoubleConverter x:Key="StringToDoubleC" />
174 <converters:MarginMultiplierConverter x:Key="FloatingWatermarkPaddingMultiplier"
175 Bottom="True"
176 Indent="1"
177 Left="False"
178 Right="False"
179 Top="False" />
180
181 <ControlTheme x:Key="SukiBaseInputControl" TargetType="TemplatedControl">
182 <Setter Property="BorderThickness" Value="1" />
183 <Setter Property="FontSize" Value="14" />
184 <Setter Property="BorderBrush" Value="{DynamicResource SukiControlBorderBrush}" />
185 <Setter Property="CornerRadius" Value="{DynamicResource SmallCornerRadius}" />
186 <Setter Property="Background" Value="Red" />
187 <Setter Property="Foreground" Value="{DynamicResource SukiText}" />
188
189 <Style Selector="^:disabled">
190 <Setter Property="Opacity" Value="{DynamicResource ThemeDisabledOpacity}" />
191 </Style>
192
193 <Style Selector="^:pointerover, ^:focus">
194 <Setter Property="BorderBrush" Value="{DynamicResource SukiPrimaryColor}" />
195 </Style>
196
197 <Style Selector="^:error">
198 <Setter Property="BorderBrush" Value="{DynamicResource ErrorBrush}" />
199 </Style>
200
201 <Style Selector="^.NoShadow">
202 <Setter Property="Background" Value="Transparent" />
203 <Setter Property="BorderThickness" Value="0" />
204
205 <Style Selector="^:pointerover, ^:focus">
206 <Setter Property="Background" Value="Transparent" />
207 <Setter Property="BorderBrush" Value="Transparent" />
208 <Setter Property="BorderThickness" Value="0" />
209 </Style>
210 </Style>
211
212
213 </ControlTheme>
214
215 <ControlTheme x:Key="SukiTextBoxButton" TargetType="Button">
216 <Setter Property="Cursor" Value="Hand" />
217 <Setter Property="Focusable" Value="False" />
218 <Setter Property="Template">
219 <ControlTemplate TargetType="Button">
220 <Border Name="PART_ButtonLayoutBorder" Background="Transparent">
221 <Path x:Name="PART_GlyphElement"
222 Height="10"
223 HorizontalAlignment="Center"
224 VerticalAlignment="Center"
225 Data="{StaticResource TextBoxClearButtonData}"
226 Fill="{DynamicResource SukiLowText}"
227 Stretch="Uniform" />
228 </Border>
229 </ControlTemplate>
230 </Setter>
231 </ControlTheme>
232
233 <ControlTheme x:Key="SukiTextBoxToggleButton"
234 BasedOn="{StaticResource SukiTextBoxButton}"
235 TargetType="ToggleButton">
236 <Setter Property="Cursor" Value="Hand" />
237 <Setter Property="Focusable" Value="False" />
238 <Setter Property="Template">
239 <ControlTemplate TargetType="ToggleButton">
240 <Border Name="PART_ButtonLayoutBorder"
241 Height="16"
242 Background="Transparent">
243 <Path x:Name="PART_GlyphElement"
244 Height="10"
245 HorizontalAlignment="Center"
246 VerticalAlignment="Center"
247 Data="{DynamicResource PasswordBoxRevealButtonData}"
248 Fill="{DynamicResource SukiLowText}"
249 Stretch="Uniform" />
250 </Border>
251 </ControlTemplate>
252 </Setter>
253
254 <Style Selector="^:checked /template/ Path">
255 <Setter Property="Data" Value="{DynamicResource PasswordBoxHideButtonData}" />
256 <Setter Property="Height" Value="16" />
257 </Style>
258 </ControlTheme>
259
260 <ControlTheme x:Key="SukiTextBox"
261 BasedOn="{StaticResource SukiBaseInputControl}"
262 TargetType="TextBox">
263 <Setter Property="VerticalContentAlignment" Value="Center" />
264 <Setter Property="BorderThickness" Value="1" />
265 <Setter Property="FontSize" Value="14" />
266 <Setter Property="BorderBrush" Value="{DynamicResource SukiControlBorderBrush}" />
267 <Setter Property="CornerRadius" Value="{DynamicResource SmallCornerRadius}" />
268 <Setter Property="Foreground" Value="{DynamicResource SukiText}" />
269 <Setter Property="SelectionBrush" Value="{DynamicResource SukiPrimaryColor75}" />
270 <Setter Property="MinHeight" Value="36" />
271 <Setter Property="Padding" Value="10,8" />
272 <Setter Property="ContextFlyout" Value="{StaticResource DefaultTextBoxContextFlyout}" />
273 <Setter Property="Template">
274 <ControlTemplate>
275 <suki:GlassCard Name="PART_GlassBorder"
276 Padding="{TemplateBinding Padding}"
277 Background="{TemplateBinding Background}"
278 BorderBrush="{TemplateBinding BorderBrush}"
279 BorderThickness="{TemplateBinding BorderThickness}"
280 CornerRadius="{TemplateBinding CornerRadius}">
281 <suki:GlassCard.Transitions>
282 <Transitions>
283 <BrushTransition Property="BorderBrush" Duration="0:0:0.15" />
284 </Transitions>
285 </suki:GlassCard.Transitions>
286 <DockPanel x:Name="PART_InnerDockPanel"
287 LastChildFill="True"
288 VerticalSpacing="3">
289
290 <TextBlock Name="PART_FloatingWatermark"
291 DockPanel.Dock="Top"
292 Foreground="{DynamicResource SukiPrimaryColor}"
293 Text="{TemplateBinding Watermark}">
294 <TextBox.IsVisible>
295 <MultiBinding Converter="{x:Static BoolConverters.And}">
296 <TemplateBinding Converter="{x:Static StringConverters.IsNotNullOrEmpty}" Property="Watermark" />
297 <TemplateBinding Property="UseFloatingWatermark" />
298 </MultiBinding>
299 </TextBox.IsVisible>
300 </TextBlock>
301
302
303 <Grid HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
304 VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
305 ColumnDefinitions="Auto,*,Auto"
306 ColumnSpacing="{StaticResource SukiTextBoxElementSpacing}">
307 <StackPanel Grid.Column="0"
308 Orientation="Horizontal"
309 Spacing="{StaticResource SukiTextBoxElementSpacing}">
310 <StackPanel.IsVisible>
311 <MultiBinding Converter="{x:Static BoolConverters.Or}">
312 <TemplateBinding Converter="{x:Static ObjectConverters.IsNotNull}" Property="InnerLeftContent" />
313 <TemplateBinding Converter="{x:Static ObjectConverters.IsNotNull}" Property="suki:TextBoxExtensions.Prefix" />
314 </MultiBinding>
315 </StackPanel.IsVisible>
316 <ContentPresenter VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
317 Content="{TemplateBinding InnerLeftContent}"
318 IsVisible="{TemplateBinding InnerLeftContent, Converter={x:Static ObjectConverters.IsNotNull}}" />
319 <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
320 Content="{TemplateBinding suki:TextBoxExtensions.Prefix}"
321 FontSize="{TemplateBinding FontSize}"
322 Foreground="{DynamicResource SukiLowText}"
323 IsVisible="{TemplateBinding suki:TextBoxExtensions.Prefix, Converter={x:Static ObjectConverters.IsNotNull}}" />
324 </StackPanel>
325
326
327 <ScrollViewer Grid.Column="1"
328 HorizontalScrollBarVisibility="{TemplateBinding (ScrollViewer.HorizontalScrollBarVisibility)}"
329 VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}">
330 <ScrollViewer.Styles>
331 <Style Selector="ScrollContentPresenter#PART_ContentPresenter">
332 <Setter Property="Cursor" Value="IBeam" />
333 </Style>
334 </ScrollViewer.Styles>
335 <Panel>
336 <TextBlock Name="PART_Watermark"
337 HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
338 VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
339 Opacity="0.5"
340 Text="{TemplateBinding Watermark}"
341 TextAlignment="{TemplateBinding TextAlignment}"
342 TextWrapping="{TemplateBinding TextWrapping}">
343 <TextBlock.IsVisible>
344 <MultiBinding Converter="{x:Static BoolConverters.And}">
345 <Binding Converter="{x:Static StringConverters.IsNullOrEmpty}"
346 ElementName="PART_TextPresenter"
347 Path="PreeditText" />
348 <TemplateBinding Converter="{x:Static StringConverters.IsNullOrEmpty}" Property="Text" />
349 <TemplateBinding Converter="{x:Static BoolConverters.Not}" Property="UseFloatingWatermark" />
350 </MultiBinding>
351 </TextBlock.IsVisible>
352 </TextBlock>
353 <TextPresenter Name="PART_TextPresenter"
354 HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
355 VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
356 CaretBlinkInterval="{TemplateBinding CaretBlinkInterval}"
357 CaretBrush="{DynamicResource SukiLowText}"
358 CaretIndex="{TemplateBinding CaretIndex}"
359 LetterSpacing="{TemplateBinding LetterSpacing}"
360 LineHeight="{TemplateBinding LineHeight}"
361 PasswordChar="{TemplateBinding PasswordChar}"
362 RevealPassword="{TemplateBinding RevealPassword}"
363 SelectionBrush="{TemplateBinding SelectionBrush}"
364 SelectionEnd="{TemplateBinding SelectionEnd}"
365 SelectionForegroundBrush="{TemplateBinding SelectionForegroundBrush}"
366 SelectionStart="{TemplateBinding SelectionStart}"
367 Text="{TemplateBinding Text, Mode=TwoWay}"
368 TextAlignment="{TemplateBinding TextAlignment}"
369 TextWrapping="{TemplateBinding TextWrapping}" />
370 </Panel>
371 </ScrollViewer>
372
373 <StackPanel Grid.Column="2"
374 Orientation="Horizontal"
375 Spacing="{StaticResource SukiTextBoxElementSpacing}">
376 <StackPanel.IsVisible>
377 <MultiBinding Converter="{x:Static BoolConverters.Or}">
378 <TemplateBinding Property="suki:TextBoxExtensions.AddDeleteButton" />
379 <TemplateBinding Converter="{x:Static ObjectConverters.IsNotNull}" Property="InnerRightContent" />
380 <TemplateBinding Property="DataValidationErrors.HasErrors" />
381 </MultiBinding>
382 </StackPanel.IsVisible>
383 <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
384 Content="{TemplateBinding InnerRightContent}"
385 IsVisible="{TemplateBinding InnerRightContent, Converter={x:Static ObjectConverters.IsNotNull}}" />
386
387 <suki:TextEraserButton VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
388 Cursor="Hand"
389 IsVisible="{TemplateBinding suki:TextBoxExtensions.AddDeleteButton}"
390 Opacity="{TemplateBinding Text, Converter={StaticResource StringToDoubleC}}"
391 Text="{TemplateBinding Text, Mode=TwoWay}">
392 <suki:TextEraserButton.Transitions>
393 <Transitions>
394 <DoubleTransition Property="Opacity" Duration="0:0:0.35" />
395 </Transitions>
396 </suki:TextEraserButton.Transitions>
397 </suki:TextEraserButton>
398
399 <DataValidationErrors/>
400 </StackPanel>
401 </Grid>
402 </DockPanel>
403 </suki:GlassCard>
404 </ControlTemplate>
405 </Setter>
406
407 <Style Selector="^.FlatTextBox">
408 <Setter Property="Background" Value="{DynamicResource SukiLightBorderBrush}" />
409 <Setter Property="BorderBrush" Value="{DynamicResource SukiLightBorderBrush}" />
410 <Style Selector="^ /template/ suki|GlassCard#border">
411 <Setter Property="BorderThickness" Value="0" />
412 </Style>
413 <Style Selector="^ /template/ Panel#PART_GlassBorder">
414 <Setter Property="ClipToBounds" Value="True" />
415 </Style>
416 </Style>
417
418 <Style Selector="^.BottomBar">
419 <Setter Property="BorderThickness" Value="0,0,0,1.5" />
420 </Style>
421
422 <Style Selector="^:disabled">
423 <Setter Property="Opacity" Value="{DynamicResource ThemeDisabledOpacity}" />
424 </Style>
425
426 <Style Selector="^:pointerover, ^:focus">
427 <Setter Property="BorderBrush" Value="{DynamicResource SukiPrimaryColor}" />
428 </Style>
429
430 <Style Selector="^:error">
431 <Setter Property="BorderBrush" Value="{DynamicResource ErrorBrush}" />
432 </Style>
433
434 <Style Selector="^.NoShadow">
435 <Setter Property="Background" Value="Transparent" />
436 <Setter Property="BorderThickness" Value="0" />
437
438 <Style Selector="^:pointerover, ^:focus">
439 <Setter Property="Background" Value="Transparent" />
440 <Setter Property="BorderBrush" Value="Transparent" />
441 <Setter Property="BorderThickness" Value="0" />
442 </Style>
443 </Style>
444
445 <Style Selector="^.clearButton[AcceptsReturn=False][IsReadOnly=False]:focus:not(TextBox:empty)">
446 <Setter Property="InnerRightContent">
447 <Template>
448 <Button Command="{Binding $parent[TextBox].Clear}" Theme="{StaticResource SukiTextBoxButton}" />
449 </Template>
450 </Setter>
451 </Style>
452
453 <Style Selector="^.revealPasswordButton[AcceptsReturn=False][IsReadOnly=False]:not(TextBox:empty)">
454 <Setter Property="InnerRightContent">
455 <Template>
456 <Border>
457 <Border.Styles>
458 <Style Selector="ToggleButton[IsChecked=True]">
459 <Setter Property="(ToolTip.Tip)" Value="Hide Password" />
460 </Style>
461 <Style Selector="ToggleButton[IsChecked=False]">
462 <Setter Property="(ToolTip.Tip)" Value="Show Password" />
463 </Style>
464 </Border.Styles>
465 <ToggleButton IsChecked="{Binding $parent[TextBox].RevealPassword, Mode=TwoWay}" Theme="{StaticResource SukiTextBoxToggleButton}" />
466 </Border>
467 </Template>
468 </Setter>
469 </Style>
470 </ControlTheme>
471
472 <ControlTheme x:Key="{x:Type TextBox}"
473 BasedOn="{StaticResource SukiTextBox}"
474 TargetType="TextBox" />
475
476</ResourceDictionary>
477