Skip to content

Commit 6231690

Browse files
cquirosjChristian
andauthored
Fix hostname field input blocking in SCMU (#5238)
# Fix hostname field input blocking in ServiceControl Management Utility **Fixes #5190** ## Problem The hostname fields in the ServiceControl Management Utility (SCMU) were blocking valid dash (`-`) characters from being typed, while allowing invalid characters like `/[]|`. This was caused by CheckBox controls intercepting keystrokes for nested TextBox controls in the add instance views. Users reported that typing `-` would not work but typing any of `/[]|` does work. The only workaround was to paste the dash character from the clipboard. ## Root Cause The issue occurred because: 1. TextBox controls for hostname input were nested inside CheckBox controls in the XAML layout 2. WPF CheckBox controls intercept certain keystrokes (including dashes) for their nested content 3. This prevented users from typing dashes directly into hostname fields, requiring copy/paste workarounds ## Solution Restructured the UI layout in the add instance views to separate CheckBox and Expander controls using a Grid-based horizontal layout. ### Before: ```xaml <CheckBox IsChecked="{Binding InstallErrorInstance}"> <Expander Header="ServiceControl"> <!-- TextBox controls nested inside CheckBox --> <controls:FormTextBox Header="HOST NAME" Text="{Binding ErrorHostName}" /> </Expander> </CheckBox> ``` ### After: ```xaml <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <CheckBox Grid.Column="0" IsChecked="{Binding InstallErrorInstance}" VerticalAlignment="Top" Margin="0,8,8,5"/> <Expander Grid.Column="1" Header="ServiceControl" IsEnabled="{Binding InstallErrorInstance}" Margin="0,5,0,5"> <!-- TextBox controls no longer nested in CheckBox --> <StackPanel Visibility="{Binding InstallErrorInstance, Converter={StaticResource boolToVis}}"> <controls:FormTextBox Header="HOST NAME" Text="{Binding ErrorHostName}" /> </StackPanel> </Expander> </Grid> ``` Co-authored-by: Christian <[email protected]>
1 parent 1a75511 commit 6231690

File tree

1 file changed

+119
-78
lines changed

1 file changed

+119
-78
lines changed

src/ServiceControl.Config/UI/InstanceAdd/ServiceControlAddView.xaml

Lines changed: 119 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,29 @@
7878
Foreground="{StaticResource ErrorBrush}"
7979
Text="Must select either an audit or an error instance." />
8080

81-
<CheckBox Padding="0, -10, 0, 0" IsChecked="{Binding InstallErrorInstance}">
82-
<StackPanel>
83-
<Expander Header="ServiceControl" IsExpanded="{Binding IsServiceControlExpanded}" Margin="0,5,0,5" MouseDown="Button_MouseDown" PreviewMouseDown="Button_MouseDown" PreviewMouseLeftButtonDown="Button_MouseDown">
84-
<StackPanel Margin="60,0,60,0">
81+
<StackPanel>
82+
<!-- Horizontal layout: CheckBox + Expander side by side -->
83+
<Grid>
84+
<Grid.ColumnDefinitions>
85+
<ColumnDefinition Width="Auto"/>
86+
<ColumnDefinition Width="*"/>
87+
</Grid.ColumnDefinitions>
88+
89+
<CheckBox Grid.Column="0"
90+
Padding="0, 0, 0, 0"
91+
IsChecked="{Binding InstallErrorInstance}"
92+
VerticalAlignment="Top"
93+
Margin="0,8,8,5"/>
94+
95+
<Expander Grid.Column="1"
96+
Header="ServiceControl"
97+
IsExpanded="{Binding IsServiceControlExpanded}"
98+
IsEnabled="{Binding InstallErrorInstance}"
99+
Margin="0,5,0,5"
100+
MouseDown="Button_MouseDown"
101+
PreviewMouseDown="Button_MouseDown"
102+
PreviewMouseLeftButtonDown="Button_MouseDown">
103+
<StackPanel Margin="60,0,60,0" Visibility="{Binding InstallErrorInstance, Converter={StaticResource boolToVis}}">
85104
<Border Margin="0,40,0,20"
86105
BorderBrush="{StaticResource Gray70Brush}"
87106
BorderThickness="0,0,0,1">
@@ -120,7 +139,7 @@
120139
Text="{Binding ErrorPassword}"
121140
Visibility="{Binding ErrorPasswordEnabled,
122141
Converter={StaticResource boolToVis}}" />
123-
<TextBlock Grid.Row="2"
142+
<TextBlock Grid.Row="2"
124143
Text="No password is required for an AD Group Managed Service Account"
125144
Visibility="{Binding ErrorManagedAccount,
126145
Converter={StaticResource boolToVis}}" />
@@ -237,93 +256,114 @@
237256
SelectedValue="{Binding ErrorEnableFullTextSearchOnBodies}" />
238257
</StackPanel>
239258
</Expander>
240-
</StackPanel>
241-
</CheckBox>
259+
</Grid>
260+
</StackPanel>
242261

243-
<CheckBox Padding="0, -10, 0, 0" IsChecked="{Binding InstallAuditInstance}" IsThreeState="False">
244-
<Expander Header="ServiceControl Audit" IsExpanded="{Binding IsServiceControlAuditExpanded}" Margin="0,5,0,5" MouseDown="Button_MouseDown" PreviewMouseDown="Button_MouseDown" PreviewMouseLeftButtonDown="Button_MouseDown">
245-
<StackPanel Margin="60,0,60,0">
246-
<Border Margin="0,40,0,20"
262+
<StackPanel>
263+
<!-- Horizontal layout: CheckBox + Expander side by side -->
264+
<Grid>
265+
<Grid.ColumnDefinitions>
266+
<ColumnDefinition Width="Auto"/>
267+
<ColumnDefinition Width="*"/>
268+
</Grid.ColumnDefinitions>
269+
270+
<CheckBox Grid.Column="0"
271+
Padding="0, 0, 0, 0"
272+
IsChecked="{Binding InstallAuditInstance}"
273+
IsThreeState="False"
274+
VerticalAlignment="Top"
275+
Margin="0,8,8,5"/>
276+
277+
<Expander Grid.Column="1"
278+
Header="ServiceControl Audit"
279+
IsExpanded="{Binding IsServiceControlAuditExpanded}"
280+
IsEnabled="{Binding InstallAuditInstance}"
281+
Margin="0,5,0,5"
282+
MouseDown="Button_MouseDown"
283+
PreviewMouseDown="Button_MouseDown"
284+
PreviewMouseLeftButtonDown="Button_MouseDown">
285+
<StackPanel Margin="60,0,60,0" Visibility="{Binding InstallAuditInstance, Converter={StaticResource boolToVis}}">
286+
<Border Margin="0,40,0,20"
247287
BorderBrush="{StaticResource Gray70Brush}"
248288
BorderThickness="0,0,0,1">
249-
<TextBlock FontSize="13px"
289+
<TextBlock FontSize="13px"
250290
FontWeight="Bold"
251291
Text="GENERAL" />
252-
</Border>
253-
254-
<controls:FormTextBox Header="NAME / WINDOWS SERVICE NAME" Text="{Binding AuditInstanceName}" />
255-
256-
<GroupBox Header="USER ACCOUNT">
257-
<StackPanel>
258-
<RadioButton IsChecked="{Binding AuditUseSystemAccount}">
259-
<TextBlock Text="LOCAL SYSTEM" />
260-
</RadioButton>
261-
<RadioButton IsChecked="{Binding AuditUseServiceAccount}">
262-
<TextBlock Text="LOCAL SERVICE" />
263-
</RadioButton>
264-
<RadioButton HorizontalContentAlignment="Stretch" IsChecked="{Binding AuditUseProvidedAccount}">
265-
<TextBlock Text="USER" />
266-
</RadioButton>
267-
<Grid Margin="15,0,0,0">
268-
<Grid.RowDefinitions>
269-
<RowDefinition Height="*" />
270-
<RowDefinition Height="auto" />
271-
<RowDefinition Height="auto" />
272-
</Grid.RowDefinitions>
273-
<controls:FormTextBox Grid.Row="1"
292+
</Border>
293+
294+
<controls:FormTextBox Header="NAME / WINDOWS SERVICE NAME" Text="{Binding AuditInstanceName}" />
295+
296+
<GroupBox Header="USER ACCOUNT">
297+
<StackPanel>
298+
<RadioButton IsChecked="{Binding AuditUseSystemAccount}">
299+
<TextBlock Text="LOCAL SYSTEM" />
300+
</RadioButton>
301+
<RadioButton IsChecked="{Binding AuditUseServiceAccount}">
302+
<TextBlock Text="LOCAL SERVICE" />
303+
</RadioButton>
304+
<RadioButton HorizontalContentAlignment="Stretch" IsChecked="{Binding AuditUseProvidedAccount}">
305+
<TextBlock Text="USER" />
306+
</RadioButton>
307+
<Grid Margin="15,0,0,0">
308+
<Grid.RowDefinitions>
309+
<RowDefinition Height="*" />
310+
<RowDefinition Height="auto" />
311+
<RowDefinition Height="auto" />
312+
</Grid.RowDefinitions>
313+
<controls:FormTextBox Grid.Row="1"
274314
Header="SERVICE ACCOUNT"
275315
Text="{Binding AuditServiceAccount}"
276316
Visibility="{Binding AuditUseProvidedAccount,
277317
Converter={StaticResource boolToVis}}" />
278318

279-
<controls:FormPasswordBox Grid.Row="2"
319+
<controls:FormPasswordBox Grid.Row="2"
280320
Header="PASSWORD"
281321
Text="{Binding AuditPassword}"
282322
Visibility="{Binding AuditPasswordEnabled,
283323
Converter={StaticResource boolToVis}}" />
284-
<TextBlock Grid.Row="2"
324+
<TextBlock Grid.Row="2"
285325
Text="No password is required for an AD Group Managed Service Account"
286326
Visibility="{Binding AuditManagedAccount,
287327
Converter={StaticResource boolToVis}}" />
288-
</Grid>
289-
</StackPanel>
290-
</GroupBox>
328+
</Grid>
329+
</StackPanel>
330+
</GroupBox>
291331

292-
<controls:FormTextBox Header="HOST NAME"
332+
<controls:FormTextBox Header="HOST NAME"
293333
Text="{Binding AuditHostName}"
294334
Warning="{Binding AuditHostNameWarning}" />
295-
<controls:FormTextBox Header="PORT NUMBER (1 - 49151)" Text="{Binding AuditPortNumber}" />
296-
<controls:FormTextBox Header="DATABASE MAINTENANCE PORT NUMBER (1 - 49151)" Text="{Binding AuditDatabaseMaintenancePortNumber}" />
335+
<controls:FormTextBox Header="PORT NUMBER (1 - 49151)" Text="{Binding AuditPortNumber}" />
336+
<controls:FormTextBox Header="DATABASE MAINTENANCE PORT NUMBER (1 - 49151)" Text="{Binding AuditDatabaseMaintenancePortNumber}" />
297337

298-
<Border Margin="0,40,0,20"
338+
<Border Margin="0,40,0,20"
299339
BorderBrush="{StaticResource Gray90Brush}"
300340
BorderThickness="0,0,0,1">
301-
<TextBlock FontSize="13px"
341+
<TextBlock FontSize="13px"
302342
FontWeight="Bold"
303343
Text="PATHS" />
304-
</Border>
344+
</Border>
305345

306-
<controls:FormPathTextBox Header="DESTINATION PATH"
346+
<controls:FormPathTextBox Header="DESTINATION PATH"
307347
SelectCommand="{Binding AuditSelectDestinationPath}"
308348
Text="{Binding AuditDestinationPath}" />
309349

310-
<controls:FormPathTextBox Header="LOG PATH"
350+
<controls:FormPathTextBox Header="LOG PATH"
311351
SelectCommand="{Binding AuditSelectLogPath}"
312352
Text="{Binding AuditLogPath}" />
313353

314-
<controls:FormPathTextBox Header="DATABASE PATH"
354+
<controls:FormPathTextBox Header="DATABASE PATH"
315355
SelectCommand="{Binding AuditSelectDatabasePath}"
316356
Text="{Binding AuditDatabasePath}" />
317357

318-
<Border Margin="0,40,0,20"
358+
<Border Margin="0,40,0,20"
319359
BorderBrush="{StaticResource Gray90Brush}"
320360
BorderThickness="0,0,0,1">
321-
<TextBlock FontSize="13px"
361+
<TextBlock FontSize="13px"
322362
FontWeight="Bold"
323363
Text="DATABASE RETENTION CONFIGURATION" />
324-
</Border>
364+
</Border>
325365

326-
<controls:FormSlider Explanation="Audit Messages will be removed after this period"
366+
<controls:FormSlider Explanation="Audit Messages will be removed after this period"
327367
Header="AUDIT RETENTION PERIOD"
328368
LargeChange="24"
329369
Maximum="{Binding MaximumAuditRetentionPeriod}"
@@ -332,31 +372,31 @@
332372
Units="{Binding AuditRetentionUnits}"
333373
Value="{Binding AuditRetention}" />
334374

335-
<Border Margin="0,40,0,20"
375+
<Border Margin="0,40,0,20"
336376
BorderBrush="{StaticResource Gray90Brush}"
337377
BorderThickness="0,0,0,1">
338-
<TextBlock FontSize="13px"
378+
<TextBlock FontSize="13px"
339379
FontWeight="Bold"
340380
Text="QUEUES CONFIGURATION" />
341-
</Border>
342-
343-
<Grid>
344-
<Grid.ColumnDefinitions>
345-
<ColumnDefinition Width="auto" />
346-
<ColumnDefinition Width="*" />
347-
</Grid.ColumnDefinitions>
348-
<Grid.RowDefinitions>
349-
<RowDefinition />
350-
<RowDefinition />
351-
<RowDefinition />
352-
</Grid.RowDefinitions>
353-
<controls:FormTextBox Grid.Column="0"
381+
</Border>
382+
383+
<Grid>
384+
<Grid.ColumnDefinitions>
385+
<ColumnDefinition Width="auto" />
386+
<ColumnDefinition Width="*" />
387+
</Grid.ColumnDefinitions>
388+
<Grid.RowDefinitions>
389+
<RowDefinition />
390+
<RowDefinition />
391+
<RowDefinition />
392+
</Grid.RowDefinitions>
393+
<controls:FormTextBox Grid.Column="0"
354394
Grid.ColumnSpan="2"
355395
Grid.Row="0"
356396
Header="AUDIT QUEUE NAME"
357397
Text="{Binding AuditQueueName}" />
358398

359-
<controls:FormComboBox Grid.Column="0"
399+
<controls:FormComboBox Grid.Column="0"
360400
Grid.Row="1"
361401
HorizontalAlignment="Stretch"
362402
VerticalAlignment="Top"
@@ -366,36 +406,37 @@
366406
SelectedValue="{Binding AuditForwarding}"
367407
/>
368408

369-
<controls:FormTextBox Grid.Column="1"
409+
<controls:FormTextBox Grid.Column="1"
370410
Grid.Row="1"
371411
Header="AUDIT FORWARDING QUEUE NAME"
372412
Text="{Binding AuditForwardingQueueName}"
373413
Visibility="{Binding ShowAuditForwardingQueue, Converter={StaticResource boolToVis}}" />
374414

375-
<controls:FormWarningTextBlock Grid.Column="0"
415+
<controls:FormWarningTextBlock Grid.Column="0"
376416
Grid.ColumnSpan="2"
377417
Grid.Row="2"
378418
Text="{Binding AuditForwardingWarning}"
379419
Visibility="{Binding Path=(cm:IDataErrorInfo.Error), Converter={StaticResource nullOrEmptyToVisInverted}}" />
380420

381-
</Grid>
421+
</Grid>
382422

383-
<Border Margin="0,40,0,20"
423+
<Border Margin="0,40,0,20"
384424
BorderBrush="{StaticResource Gray90Brush}"
385425
BorderThickness="0,0,0,1">
386-
<TextBlock FontSize="13px"
426+
<TextBlock FontSize="13px"
387427
FontWeight="Bold"
388428
Text="ADVANCED CONFIGURATION" />
389-
</Border>
390-
<controls:FormComboBox HorizontalAlignment="Stretch"
429+
</Border>
430+
<controls:FormComboBox HorizontalAlignment="Stretch"
391431
VerticalAlignment="Top"
392432
DisplayMemberPath="Name"
393433
Header="FULL TEXT SEARCH ON MESSAGE BODIES"
394434
ItemsSource="{Binding AuditEnableFullTextSearchOnBodiesOptions}"
395435
SelectedValue="{Binding AuditEnableFullTextSearchOnBodies}" />
396-
</StackPanel>
397-
</Expander>
398-
</CheckBox>
436+
</StackPanel>
437+
</Expander>
438+
</Grid>
439+
</StackPanel>
399440
</StackPanel>
400441
</sie:SharedServiceControlEditorView.SharedContent>
401442
</sie:SharedServiceControlEditorView>

0 commit comments

Comments
 (0)