Skip to content

Commit 293887a

Browse files
committed
improved focus visuals
radio menu items focus visuals menu items focus visuals tabitem focus visuals fix treeview focus visuals generalizing AdornerDecorator
1 parent 16aa74b commit 293887a

File tree

6 files changed

+58
-69
lines changed

6 files changed

+58
-69
lines changed

source/iNKORE.UI.WPF.Modern.Controls/Controls/Windows/RadioMenuItem/RadioMenuItem.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<Setter Property="BorderThickness" Value="{DynamicResource MenuFlyoutItemRevealBorderThickness}" />
1515
<Setter Property="Foreground" Value="{DynamicResource MenuFlyoutItemForeground}" />
1616
<Setter Property="Padding" Value="{DynamicResource MenuFlyoutItemThemePadding}" />
17+
<Setter Property="ui:ControlHelper.CornerRadius" Value="{DynamicResource ControlCornerRadius}" />
1718
<Setter Property="FontSize" Value="{DynamicResource ControlContentThemeFontSize}" />
1819
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
1920
<Setter Property="VerticalContentAlignment" Value="Center" />

source/iNKORE.UI.WPF.Modern/Controls/Helpers/FocusVisualHelper.cs

Lines changed: 37 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

source/iNKORE.UI.WPF.Modern/Themes/Controls/Button.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
<Setter Property="Template">
8282
<Setter.Value>
8383
<ControlTemplate TargetType="Button">
84-
<Grid chelper:FocusVisualHelper.IsTemplateFocusTarget="True">
84+
<Grid>
8585
<local:ElevationBorder
8686
x:Name="Background"
8787
Background="{TemplateBinding Background}"

source/iNKORE.UI.WPF.Modern/Themes/Controls/MenuItem.xaml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
Margin="{DynamicResource MenuBarItemMargin}"
5151
Background="{TemplateBinding Background}"
5252
CornerRadius="{TemplateBinding chelper:ControlHelper.CornerRadius}"
53-
chelper:FocusVisualHelper.IsTemplateFocusTarget="True"
5453
SnapsToDevicePixels="True">
5554
<Grid>
5655
<Border
@@ -87,7 +86,6 @@
8786
Margin="{DynamicResource MenuBarItemMargin}"
8887
Background="{TemplateBinding Background}"
8988
CornerRadius="{TemplateBinding chelper:ControlHelper.CornerRadius}"
90-
chelper:FocusVisualHelper.IsTemplateFocusTarget="True"
9189
SnapsToDevicePixels="True">
9290
<Grid>
9391
<Border
@@ -170,7 +168,6 @@
170168
BorderBrush="{TemplateBinding BorderBrush}"
171169
BorderThickness="{TemplateBinding BorderThickness}"
172170
CornerRadius="{TemplateBinding chelper:ControlHelper.CornerRadius}"
173-
chelper:FocusVisualHelper.IsTemplateFocusTarget="True"
174171
SnapsToDevicePixels="true">
175172
<Grid x:Name="AnimationRoot">
176173
<Grid.ColumnDefinitions>
@@ -272,7 +269,6 @@
272269
BorderBrush="{TemplateBinding BorderBrush}"
273270
BorderThickness="{TemplateBinding BorderThickness}"
274271
CornerRadius="{TemplateBinding chelper:ControlHelper.CornerRadius}"
275-
chelper:FocusVisualHelper.IsTemplateFocusTarget="True"
276272
SnapsToDevicePixels="True">
277273
<Grid x:Name="AnimationRoot">
278274
<Grid.ColumnDefinitions>

source/iNKORE.UI.WPF.Modern/Themes/Controls/ScrollViewer.xaml

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -199,14 +199,17 @@
199199
Grid.Column="0"
200200
Grid.ColumnSpan="2"
201201
Padding="{TemplateBinding Padding}">
202-
<ScrollContentPresenter
203-
x:Name="PART_ScrollContentPresenter"
204-
Margin="{TemplateBinding chelper:TextControlContentHostHelper.ContentPresenterMargin}"
205-
CanContentScroll="{TemplateBinding CanContentScroll}"
206-
CanHorizontallyScroll="False"
207-
CanVerticallyScroll="False"
208-
Content="{TemplateBinding Content}"
209-
ContentTemplate="{TemplateBinding ContentTemplate}" />
202+
203+
<AdornerDecorator>
204+
<ScrollContentPresenter
205+
x:Name="PART_ScrollContentPresenter"
206+
Margin="{TemplateBinding chelper:TextControlContentHostHelper.ContentPresenterMargin}"
207+
CanContentScroll="{TemplateBinding CanContentScroll}"
208+
CanHorizontallyScroll="False"
209+
CanVerticallyScroll="False"
210+
Content="{TemplateBinding Content}"
211+
ContentTemplate="{TemplateBinding ContentTemplate}" />
212+
</AdornerDecorator>
210213
</Border>
211214
<ScrollBar
212215
x:Name="PART_VerticalScrollBar"
@@ -238,10 +241,12 @@
238241

239242
<ControlTemplate x:Key="ScrollViewerScrollBarlessTemplate" TargetType="ScrollViewer">
240243
<Grid Background="{TemplateBinding Background}">
241-
<ScrollContentPresenter
244+
<AdornerDecorator>
245+
<ScrollContentPresenter
242246
x:Name="ScrollContentPresenter"
243247
Margin="{TemplateBinding Padding}"
244248
ContentTemplate="{TemplateBinding ContentTemplate}" />
249+
</AdornerDecorator>
245250
</Grid>
246251
</ControlTemplate>
247252

source/iNKORE.UI.WPF.Modern/Themes/Controls/TreeView.xaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@
5454
<RowDefinition />
5555
</Grid.RowDefinitions>
5656
<Border
57+
chelper:FocusVisualHelper.IsTemplateFocusTarget="True"
58+
CornerRadius="{TemplateBinding chelper:ControlHelper.CornerRadius}">
59+
<Border
5760
x:Name="ContentPresenterGrid"
5861
Margin="{DynamicResource TreeViewItemPresenterMargin}"
5962
Padding="{DynamicResource TreeViewItemPresenterPadding}"
@@ -62,8 +65,7 @@
6265
BorderBrush="{TemplateBinding BorderBrush}"
6366
BorderThickness="{TemplateBinding BorderThickness}"
6467
CornerRadius="{TemplateBinding chelper:ControlHelper.CornerRadius}"
65-
SnapsToDevicePixels="true"
66-
chelper:FocusVisualHelper.IsTemplateFocusTarget="True">
68+
SnapsToDevicePixels="true">
6769
<Grid>
6870
<Rectangle
6971
x:Name="SelectionIndicator"
@@ -166,6 +168,7 @@
166168
</Border>
167169
</Grid>
168170
</Border>
171+
</Border>
169172
<ItemsPresenter x:Name="ItemsHost" Grid.Row="1" />
170173
<VisualStateManager.VisualStateGroups>
171174
<VisualStateGroup x:Name="CommonStates">

0 commit comments

Comments
 (0)