fix dropdown scroll fokus

This commit is contained in:
Meik
2026-02-09 19:55:29 +01:00
parent 820a6ad3f3
commit ca584d3929
6 changed files with 127 additions and 56 deletions

View File

@@ -1,5 +1,6 @@
using C4IT.FASD.Base; using C4IT.FASD.Base;
using C4IT.MultiLanguage; using C4IT.MultiLanguage;
using FasdDesktopUi.Basics.Helper;
using FasdDesktopUi.Basics.Models; using FasdDesktopUi.Basics.Models;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -129,6 +130,19 @@ namespace FasdDesktopUi.Basics.UserControls
#endregion #endregion
#region RestoreParentScrollFocusOnDropDownClose
public bool RestoreParentScrollFocusOnDropDownClose
{
get { return (bool)GetValue(RestoreParentScrollFocusOnDropDownCloseProperty); }
set { SetValue(RestoreParentScrollFocusOnDropDownCloseProperty, value); }
}
public static readonly DependencyProperty RestoreParentScrollFocusOnDropDownCloseProperty =
DependencyProperty.Register("RestoreParentScrollFocusOnDropDownClose", typeof(bool), typeof(ComboBoxPageable), new PropertyMetadata(false));
#endregion
#region ItemData #region ItemData
public ObservableCollection<KeyValuePair<string, object>> ItemData public ObservableCollection<KeyValuePair<string, object>> ItemData
@@ -306,6 +320,28 @@ namespace FasdDesktopUi.Basics.UserControls
{ {
timer.Stop(); timer.Stop();
cFocusInvoker.InvokeLostFocus(this, e); cFocusInvoker.InvokeLostFocus(this, e);
if (RestoreParentScrollFocusOnDropDownClose)
{
_ = Dispatcher.BeginInvoke((Action)(() =>
{
try
{
var parentScrollViewer = cUiElementHelper.GetFirstParentOfType<ScrollViewer>(this);
Keyboard.ClearFocus();
if (parentScrollViewer != null)
{
parentScrollViewer.Focus();
Keyboard.Focus(parentScrollViewer);
}
}
catch (Exception exception)
{
LogException(exception);
}
}), System.Windows.Threading.DispatcherPriority.Input);
}
} }
private void ComboBoxControl_DropDownOpened(object sender, EventArgs e) private void ComboBoxControl_DropDownOpened(object sender, EventArgs e)

View File

@@ -276,6 +276,7 @@
ResetFilterLabel="{Binding Converter={StaticResource LanguageConverter}, ConverterParameter=Dialog.CloseCase.ResetFilter.Services}" ResetFilterLabel="{Binding Converter={StaticResource LanguageConverter}, ConverterParameter=Dialog.CloseCase.ResetFilter.Services}"
SelectedItem="{Binding SelectedService, ElementName=CloseCaseDialogUc, Mode=TwoWay}" SelectedItem="{Binding SelectedService, ElementName=CloseCaseDialogUc, Mode=TwoWay}"
IsEnabled="{Binding SetOrUpdateServiceInTicket, ElementName=CloseCaseDialogUc}" IsEnabled="{Binding SetOrUpdateServiceInTicket, ElementName=CloseCaseDialogUc}"
RestoreParentScrollFocusOnDropDownClose="True"
ComboBoxBackground="{DynamicResource BackgroundColor.DetailsPage.DataHistory.ValueColumn}" ComboBoxBackground="{DynamicResource BackgroundColor.DetailsPage.DataHistory.ValueColumn}"
BorderBrush="{DynamicResource BackgroundColor.Menu.SubCategory.Hover}" BorderBrush="{DynamicResource BackgroundColor.Menu.SubCategory.Hover}"
PreviewKeyDown="Combobox_PreviewKeyDown" /> PreviewKeyDown="Combobox_PreviewKeyDown" />

View File

@@ -2745,13 +2745,7 @@ namespace FasdDesktopUi.Basics.UserControls
if (parentBorder != null) if (parentBorder != null)
cFocusInvoker.InvokeLostFocus(parentBorder, e); cFocusInvoker.InvokeLostFocus(parentBorder, e);
if (ReferenceEquals(sender, TicketStatusCombobox)) _ = Dispatcher.BeginInvoke(new Action(RestoreDialogFocusAfterTicketActionSelection), System.Windows.Threading.DispatcherPriority.Input);
{
_ = Dispatcher.BeginInvoke(new Action(RestoreDialogFocusAfterTicketActionSelection), System.Windows.Threading.DispatcherPriority.Input);
return;
}
DynamicStatusAdditionBorder?.Focus();
} }
#endregion #endregion

View File

@@ -185,6 +185,25 @@ namespace FasdDesktopUi.Basics.UserControls
ErrorTypeValueChanged?.Invoke(this, EventArgs.Empty); ErrorTypeValueChanged?.Invoke(this, EventArgs.Empty);
var parentBorder = cUiElementHelper.GetFirstParentOfType<Border>(senderElement); var parentBorder = cUiElementHelper.GetFirstParentOfType<Border>(senderElement);
cFocusInvoker.InvokeLostFocus(parentBorder, e); cFocusInvoker.InvokeLostFocus(parentBorder, e);
_ = Dispatcher.BeginInvoke((Action)(() =>
{
try
{
var parentScrollViewer = cUiElementHelper.GetFirstParentOfType<ScrollViewer>(this);
Keyboard.ClearFocus();
if (parentScrollViewer != null)
{
parentScrollViewer.Focus();
Keyboard.Focus(parentScrollViewer);
}
}
catch (Exception exception)
{
LogException(exception);
}
}), System.Windows.Threading.DispatcherPriority.Input);
} }
catch (Exception E) catch (Exception E)
{ {

View File

@@ -24,6 +24,7 @@
Style="{StaticResource MandatoryFieldBorderStyle}"> Style="{StaticResource MandatoryFieldBorderStyle}">
<local:ComboBoxPageable x:Name="RoleSelectionControl" <local:ComboBoxPageable x:Name="RoleSelectionControl"
SelectedItem="{Binding ElementName=ForwardTicketDialogUc, Path=SelectedRole, Mode=TwoWay}" SelectedItem="{Binding ElementName=ForwardTicketDialogUc, Path=SelectedRole, Mode=TwoWay}"
RestoreParentScrollFocusOnDropDownClose="True"
ComboBoxBackground="{Binding Background, RelativeSource={RelativeSource AncestorType=Border}}" ComboBoxBackground="{Binding Background, RelativeSource={RelativeSource AncestorType=Border}}"
BorderBrush="Transparent" BorderBrush="Transparent"
BorderThickness="0" /> BorderThickness="0" />
@@ -38,6 +39,7 @@
Style="{StaticResource MandatoryFieldBorderStyle}"> Style="{StaticResource MandatoryFieldBorderStyle}">
<local:ComboBoxPageable x:Name="PersonSelectionControl" <local:ComboBoxPageable x:Name="PersonSelectionControl"
SelectedItem="{Binding ElementName=ForwardTicketDialogUc, Path=SelectedPerson, Mode=TwoWay}" SelectedItem="{Binding ElementName=ForwardTicketDialogUc, Path=SelectedPerson, Mode=TwoWay}"
RestoreParentScrollFocusOnDropDownClose="True"
ComboBoxBackground="{Binding Background, RelativeSource={RelativeSource AncestorType=Border}}" ComboBoxBackground="{Binding Background, RelativeSource={RelativeSource AncestorType=Border}}"
BorderBrush="Transparent" BorderBrush="Transparent"
BorderThickness="0" /> BorderThickness="0" />

View File

@@ -261,6 +261,25 @@ namespace FasdDesktopUi.Basics.UserControls
var parentBorder = cUiElementHelper.GetFirstParentOfType<Border>(senderElement); var parentBorder = cUiElementHelper.GetFirstParentOfType<Border>(senderElement);
cFocusInvoker.InvokeLostFocus(parentBorder, e); cFocusInvoker.InvokeLostFocus(parentBorder, e);
_ = Dispatcher.BeginInvoke((Action)(() =>
{
try
{
var parentScrollViewer = cUiElementHelper.GetFirstParentOfType<ScrollViewer>(this);
Keyboard.ClearFocus();
if (parentScrollViewer != null)
{
parentScrollViewer.Focus();
Keyboard.Focus(parentScrollViewer);
}
}
catch (Exception exception)
{
LogException(exception);
}
}), System.Windows.Threading.DispatcherPriority.Input);
} }
catch (Exception E) catch (Exception E)
{ {