@@ -511,26 +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- GetIfSourceIsNonZero ( focusedCornerRadius . TopLeft ,
519- ( focusVisualMargin . Left + focusVisualMargin . Top ) / 2 ) ,
520- GetIfSourceIsNonZero ( focusedCornerRadius . TopRight ,
521- ( focusVisualMargin . Right + focusVisualMargin . Top ) / 2 ) ,
522- GetIfSourceIsNonZero ( focusedCornerRadius . BottomLeft ,
523- ( focusVisualMargin . Left + focusVisualMargin . Bottom ) / 2 ) ,
524- GetIfSourceIsNonZero ( focusedCornerRadius . BottomRight ,
525- ( focusVisualMargin . Right + focusVisualMargin . Bottom ) / 2 ) ) ;
526-
527- ControlHelper . SetCornerRadius ( focusVisual , focusVisualCornerRadius ) ;
528- SetFocusVisualPrimaryCornerRadius ( focusVisual , new CornerRadius (
529- focusVisualCornerRadius . TopLeft + GetFocusVisualSecondaryThickness ( focusedElement ) . Left ,
530- focusVisualCornerRadius . TopRight + GetFocusVisualSecondaryThickness ( focusedElement ) . Right ,
531- focusVisualCornerRadius . BottomLeft + GetFocusVisualSecondaryThickness ( focusedElement ) . Left ,
532- focusVisualCornerRadius . BottomRight + GetFocusVisualSecondaryThickness ( focusedElement ) . Right ) ) ;
533- }
514+ ApplyCornerRadiusToFocusVisual ( focusVisual , focusedElement , focusVisualMargin ) ;
534515
535516 TransferValue ( focusedElement , focusVisual , FocusVisualPrimaryBrushProperty ) ;
536517 TransferValue ( focusedElement , focusVisual , FocusVisualPrimaryThicknessProperty ) ;
@@ -559,6 +540,39 @@ private static void OnFocusVisualIsVisibleChanged(object sender, DependencyPrope
559540 }
560541 }
561542
543+ private static void ApplyCornerRadiusToFocusVisual ( Control focusVisual , FrameworkElement focusedElement , Thickness focusVisualMargin )
544+ {
545+ var cornerRadius = GetCornerRadiusForFocusedElement ( focusedElement ) ;
546+ if ( cornerRadius is CornerRadius focusedCornerRadius && focusedCornerRadius != default )
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 != default => borderResult ,
571+ var _ when cornerRadiusTarget . GetValue ( ControlHelper . CornerRadiusProperty ) is CornerRadius controlResult => controlResult ,
572+ _ => null
573+ } ;
574+ }
575+
562576 private static void TransferValue ( DependencyObject source , DependencyObject target , DependencyProperty dp )
563577 {
564578 if ( ! source . HasDefaultValue ( dp ) )
@@ -567,10 +581,10 @@ private static void TransferValue(DependencyObject source, DependencyObject targ
567581 }
568582 }
569583
570- private static double GetIfSourceIsNonZero ( double source , double newValue ) => source switch
584+ private static double GetSumIfSourceIsNonZero ( double source , double adjustment ) => source switch
571585 {
572586 0 => 0 ,
573- _ => newValue
587+ _ => source + adjustment
574588 } ;
575589
576590 private sealed class FocusVisualAdorner : Adorner
@@ -590,37 +604,7 @@ public FocusVisualAdorner(Control focusedElement, UIElement adornedElement, Styl
590604 var focusVisualMargin = GetFocusVisualMargin ( focusedElement ) ;
591605 control . Margin = focusVisualMargin ;
592606
593- var cornerRadius = focusedElement . GetValue ( ControlHelper . CornerRadiusProperty ) ;
594- if ( cornerRadius != DependencyProperty . UnsetValue && cornerRadius is CornerRadius focusedCornerRadius &&
595- focusedCornerRadius != default )
596- {
597- var focusVisualCornerRadius = new CornerRadius (
598- GetIfSourceIsNonZero ( focusedCornerRadius . TopLeft ,
599- focusedCornerRadius . TopLeft - ( focusVisualMargin . Left + focusVisualMargin . Top ) / 2 ) ,
600- GetIfSourceIsNonZero ( focusedCornerRadius . TopRight ,
601- focusedCornerRadius . TopRight - ( focusVisualMargin . Right + focusVisualMargin . Top ) / 2 ) ,
602- GetIfSourceIsNonZero ( focusedCornerRadius . BottomLeft ,
603- focusedCornerRadius . BottomLeft - ( focusVisualMargin . Left + focusVisualMargin . Bottom ) / 2 ) ,
604- GetIfSourceIsNonZero ( focusedCornerRadius . BottomRight ,
605- focusedCornerRadius . BottomRight - ( focusVisualMargin . Right + focusVisualMargin . Bottom ) / 2 ) ) ;
606-
607- ControlHelper . SetCornerRadius ( control , focusVisualCornerRadius ) ;
608- var topLeftRadius = GetIfSourceIsNonZero ( focusedCornerRadius . TopLeft ,
609- focusVisualCornerRadius . TopLeft + GetFocusVisualSecondaryThickness ( focusedElement ) . Left ) ;
610-
611- var topRightRadius = GetIfSourceIsNonZero ( focusedCornerRadius . TopRight ,
612- focusVisualCornerRadius . TopRight + GetFocusVisualSecondaryThickness ( focusedElement ) . Right ) ;
613-
614- var bottomRightRadius = GetIfSourceIsNonZero ( focusedCornerRadius . BottomLeft ,
615- focusVisualCornerRadius . BottomLeft + GetFocusVisualSecondaryThickness ( focusedElement ) . Left ) ;
616-
617- var bottomLeftRadius = GetIfSourceIsNonZero ( focusedCornerRadius . BottomRight ,
618- focusVisualCornerRadius . BottomRight +
619- GetFocusVisualSecondaryThickness ( focusedElement ) . Right ) ;
620-
621- SetFocusVisualPrimaryCornerRadius ( control ,
622- new CornerRadius ( topLeftRadius , topRightRadius , bottomRightRadius , bottomLeftRadius ) ) ;
623- }
607+ ApplyCornerRadiusToFocusVisual ( control , focusedElement , focusVisualMargin ) ;
624608
625609 TransferValue ( focusedElement , control , FocusVisualPrimaryBrushProperty ) ;
626610 TransferValue ( focusedElement , control , FocusVisualPrimaryThicknessProperty ) ;
0 commit comments