@@ -511,23 +511,7 @@ private static void OnFocusVisualIsVisibleChanged(object sender, DependencyPrope
511511 {
512512 var focusVisualMargin = GetFocusVisualMargin ( focusedElement ) ;
513513
514- var cornerRadius = focusedElement . GetValue ( ControlHelper . CornerRadiusProperty ) ;
515- if ( cornerRadius != DependencyProperty . UnsetValue && cornerRadius is CornerRadius focusedCornerRadius && focusedCornerRadius != default )
516- {
517- var focusVisualCornerRadius = new CornerRadius (
518- GetSumIfSourceIsNonZero ( focusedCornerRadius . TopLeft , - ( focusVisualMargin . Left + focusVisualMargin . Top ) / 2 ) ,
519- GetSumIfSourceIsNonZero ( focusedCornerRadius . TopRight , - ( focusVisualMargin . Right + focusVisualMargin . Top ) / 2 ) ,
520- GetSumIfSourceIsNonZero ( focusedCornerRadius . BottomLeft , - ( focusVisualMargin . Left + focusVisualMargin . Bottom ) / 2 ) ,
521- GetSumIfSourceIsNonZero ( focusedCornerRadius . BottomRight , - ( focusVisualMargin . Right + focusVisualMargin . Bottom ) / 2 ) ) ;
522-
523- ControlHelper . SetCornerRadius ( focusVisual , focusVisualCornerRadius ) ;
524- var topLeftRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . TopLeft , GetFocusVisualSecondaryThickness ( focusedElement ) . Left ) ;
525- var topRightRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . TopRight , GetFocusVisualSecondaryThickness ( focusedElement ) . Right ) ;
526- var bottomRightRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . BottomLeft , GetFocusVisualSecondaryThickness ( focusedElement ) . Left ) ;
527- var bottomLeftRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . BottomRight , GetFocusVisualSecondaryThickness ( focusedElement ) . Right ) ;
528-
529- SetFocusVisualPrimaryCornerRadius ( focusVisual , new CornerRadius ( topLeftRadius , topRightRadius , bottomRightRadius , bottomLeftRadius ) ) ;
530- }
514+ ApplyCornerRadiusToFocusVisual ( focusVisual , focusedElement , focusVisualMargin ) ;
531515
532516 TransferValue ( focusedElement , focusVisual , FocusVisualPrimaryBrushProperty ) ;
533517 TransferValue ( focusedElement , focusVisual , FocusVisualPrimaryThicknessProperty ) ;
@@ -556,6 +540,39 @@ private static void OnFocusVisualIsVisibleChanged(object sender, DependencyPrope
556540 }
557541 }
558542
543+ private static void ApplyCornerRadiusToFocusVisual ( Control focusVisual , FrameworkElement focusedElement , Thickness focusVisualMargin )
544+ {
545+ var cornerRadius = GetCornerRadiusForFocusedElement ( focusedElement ) ;
546+ if ( cornerRadius is CornerRadius focusedCornerRadius )
547+ {
548+ var focusVisualCornerRadius = new CornerRadius (
549+ GetSumIfSourceIsNonZero ( focusedCornerRadius . TopLeft , - ( focusVisualMargin . Left + focusVisualMargin . Top ) / 2 ) ,
550+ GetSumIfSourceIsNonZero ( focusedCornerRadius . TopRight , - ( focusVisualMargin . Right + focusVisualMargin . Top ) / 2 ) ,
551+ GetSumIfSourceIsNonZero ( focusedCornerRadius . BottomLeft , - ( focusVisualMargin . Left + focusVisualMargin . Bottom ) / 2 ) ,
552+ GetSumIfSourceIsNonZero ( focusedCornerRadius . BottomRight , - ( focusVisualMargin . Right + focusVisualMargin . Bottom ) / 2 ) ) ;
553+
554+ ControlHelper . SetCornerRadius ( focusVisual , focusVisualCornerRadius ) ;
555+ var topLeftRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . TopLeft , GetFocusVisualSecondaryThickness ( focusedElement ) . Left ) ;
556+ var topRightRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . TopRight , GetFocusVisualSecondaryThickness ( focusedElement ) . Right ) ;
557+ var bottomRightRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . BottomLeft , GetFocusVisualSecondaryThickness ( focusedElement ) . Left ) ;
558+ var bottomLeftRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . BottomRight , GetFocusVisualSecondaryThickness ( focusedElement ) . Right ) ;
559+
560+ SetFocusVisualPrimaryCornerRadius ( focusVisual , new CornerRadius ( topLeftRadius , topRightRadius , bottomRightRadius , bottomLeftRadius ) ) ;
561+ }
562+ }
563+
564+ private static CornerRadius ? GetCornerRadiusForFocusedElement ( FrameworkElement focusedElement )
565+ {
566+ var cornerRadiusTarget = focusedElement . GetValue ( TemplateFocusTargetProperty ) as FrameworkElement ;
567+ cornerRadiusTarget ??= focusedElement ;
568+ return cornerRadiusTarget switch
569+ {
570+ var _ when cornerRadiusTarget . GetValue ( Border . CornerRadiusProperty ) is CornerRadius borderResult => borderResult ,
571+ var _ when cornerRadiusTarget . GetValue ( ControlHelper . CornerRadiusProperty ) is CornerRadius controlResult => controlResult ,
572+ _ => null
573+ } ;
574+ }
575+
559576 private static void TransferValue ( DependencyObject source , DependencyObject target , DependencyProperty dp )
560577 {
561578 if ( ! source . HasDefaultValue ( dp ) )
@@ -587,26 +604,7 @@ public FocusVisualAdorner(Control focusedElement, UIElement adornedElement, Styl
587604 var focusVisualMargin = GetFocusVisualMargin ( focusedElement ) ;
588605 control . Margin = focusVisualMargin ;
589606
590- var cornerRadius = focusedElement . GetValue ( ControlHelper . CornerRadiusProperty ) ;
591- if ( cornerRadius != DependencyProperty . UnsetValue && cornerRadius is CornerRadius focusedCornerRadius &&
592- focusedCornerRadius != default )
593- {
594- var focusVisualCornerRadius = new CornerRadius (
595- GetSumIfSourceIsNonZero ( focusedCornerRadius . TopLeft , - ( focusVisualMargin . Left + focusVisualMargin . Top ) / 2 ) ,
596- GetSumIfSourceIsNonZero ( focusedCornerRadius . TopRight , - ( focusVisualMargin . Right + focusVisualMargin . Top ) / 2 ) ,
597- GetSumIfSourceIsNonZero ( focusedCornerRadius . BottomLeft , - ( focusVisualMargin . Left + focusVisualMargin . Bottom ) / 2 ) ,
598- GetSumIfSourceIsNonZero ( focusedCornerRadius . BottomRight , - ( focusVisualMargin . Right + focusVisualMargin . Bottom ) / 2 ) ) ;
599-
600- ControlHelper . SetCornerRadius ( control , focusVisualCornerRadius ) ;
601-
602- var topLeftRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . TopLeft , GetFocusVisualSecondaryThickness ( focusedElement ) . Left ) ;
603- var topRightRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . TopRight , GetFocusVisualSecondaryThickness ( focusedElement ) . Right ) ;
604- var bottomRightRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . BottomLeft , GetFocusVisualSecondaryThickness ( focusedElement ) . Left ) ;
605- var bottomLeftRadius = GetSumIfSourceIsNonZero ( focusVisualCornerRadius . BottomRight , GetFocusVisualSecondaryThickness ( focusedElement ) . Right ) ;
606-
607- SetFocusVisualPrimaryCornerRadius ( control ,
608- new CornerRadius ( topLeftRadius , topRightRadius , bottomRightRadius , bottomLeftRadius ) ) ;
609- }
607+ ApplyCornerRadiusToFocusVisual ( control , focusedElement , focusVisualMargin ) ;
610608
611609 TransferValue ( focusedElement , control , FocusVisualPrimaryBrushProperty ) ;
612610 TransferValue ( focusedElement , control , FocusVisualPrimaryThicknessProperty ) ;
0 commit comments