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,6 +1,7 @@
using C4IT.FASD.Base;
using C4IT.MultiLanguage;
using FasdDesktopUi.Basics.Models;
using C4IT.MultiLanguage;
using FasdDesktopUi.Basics.Helper;
using FasdDesktopUi.Basics.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
@@ -124,12 +125,25 @@ namespace FasdDesktopUi.Basics.UserControls
}
public static readonly DependencyProperty SearchDataChangedProperty =
DependencyProperty.Register("SearchDataChanged", typeof(EventHandler<cF4sdHealthSelectionDataRequest>), typeof(ComboBoxPageable), new PropertyMetadata(null));
#endregion
#region ItemData
public static readonly DependencyProperty SearchDataChangedProperty =
DependencyProperty.Register("SearchDataChanged", typeof(EventHandler<cF4sdHealthSelectionDataRequest>), typeof(ComboBoxPageable), new PropertyMetadata(null));
#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
public ObservableCollection<KeyValuePair<string, object>> ItemData
{
@@ -302,11 +316,33 @@ namespace FasdDesktopUi.Basics.UserControls
}
}
private void ComboBoxControl_DropDownClosed(object sender, EventArgs e)
{
timer.Stop();
cFocusInvoker.InvokeLostFocus(this, e);
}
private void ComboBoxControl_DropDownClosed(object sender, EventArgs e)
{
timer.Stop();
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)
{

View File

@@ -271,14 +271,15 @@
SelectedInternIcon="status_bad"
VerticalAlignment="Bottom" />
</StackPanel>
<local:ComboBoxPageable x:Name="ServiceSelectionControl"
Margin="0 5 0 0"
ResetFilterLabel="{Binding Converter={StaticResource LanguageConverter}, ConverterParameter=Dialog.CloseCase.ResetFilter.Services}"
SelectedItem="{Binding SelectedService, ElementName=CloseCaseDialogUc, Mode=TwoWay}"
IsEnabled="{Binding SetOrUpdateServiceInTicket, ElementName=CloseCaseDialogUc}"
ComboBoxBackground="{DynamicResource BackgroundColor.DetailsPage.DataHistory.ValueColumn}"
BorderBrush="{DynamicResource BackgroundColor.Menu.SubCategory.Hover}"
PreviewKeyDown="Combobox_PreviewKeyDown" />
<local:ComboBoxPageable x:Name="ServiceSelectionControl"
Margin="0 5 0 0"
ResetFilterLabel="{Binding Converter={StaticResource LanguageConverter}, ConverterParameter=Dialog.CloseCase.ResetFilter.Services}"
SelectedItem="{Binding SelectedService, ElementName=CloseCaseDialogUc, Mode=TwoWay}"
IsEnabled="{Binding SetOrUpdateServiceInTicket, ElementName=CloseCaseDialogUc}"
RestoreParentScrollFocusOnDropDownClose="True"
ComboBoxBackground="{DynamicResource BackgroundColor.DetailsPage.DataHistory.ValueColumn}"
BorderBrush="{DynamicResource BackgroundColor.Menu.SubCategory.Hover}"
PreviewKeyDown="Combobox_PreviewKeyDown" />
</StackPanel>
<StackPanel>

View File

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

View File

@@ -176,20 +176,39 @@ namespace FasdDesktopUi.Basics.UserControls
}
}
private void DropDownClosed(object sender, EventArgs e)
{
try
{
if (!(sender is FrameworkElement senderElement))
return;
ErrorTypeValueChanged?.Invoke(this, EventArgs.Empty);
var parentBorder = cUiElementHelper.GetFirstParentOfType<Border>(senderElement);
cFocusInvoker.InvokeLostFocus(parentBorder, e);
}
catch (Exception E)
{
LogException(E);
}
private void DropDownClosed(object sender, EventArgs e)
{
try
{
if (!(sender is FrameworkElement senderElement))
return;
ErrorTypeValueChanged?.Invoke(this, EventArgs.Empty);
var parentBorder = cUiElementHelper.GetFirstParentOfType<Border>(senderElement);
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)
{
LogException(E);
}
}

View File

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

View File

@@ -252,20 +252,39 @@ namespace FasdDesktopUi.Basics.UserControls
}
}
private void DropDownClosed(object sender, EventArgs e)
{
try
{
if (!(sender is FrameworkElement senderElement))
return;
var parentBorder = cUiElementHelper.GetFirstParentOfType<Border>(senderElement);
cFocusInvoker.InvokeLostFocus(parentBorder, e);
}
catch (Exception E)
{
LogException(E);
}
private void DropDownClosed(object sender, EventArgs e)
{
try
{
if (!(sender is FrameworkElement senderElement))
return;
var parentBorder = cUiElementHelper.GetFirstParentOfType<Border>(senderElement);
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)
{
LogException(E);
}
}
public event PropertyChangedEventHandler PropertyChanged;