diff --git a/src/Avalonia.Controls.ColorPicker/ColorView/ColorView.cs b/src/Avalonia.Controls.ColorPicker/ColorView/ColorView.cs
index 0363d9c182..96de734cc7 100644
--- a/src/Avalonia.Controls.ColorPicker/ColorView/ColorView.cs
+++ b/src/Avalonia.Controls.ColorPicker/ColorView/ColorView.cs
@@ -5,6 +5,7 @@ using Avalonia.Controls.Converters;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Primitives;
using Avalonia.Media;
+using Avalonia.Threading;
namespace Avalonia.Controls
{
@@ -12,6 +13,7 @@ namespace Avalonia.Controls
/// Presents a color for user editing using a spectrum, palette and component sliders.
///
[TemplatePart("PART_HexTextBox", typeof(TextBox))]
+ [TemplatePart("PART_TabControl", typeof(TabControl))]
public partial class ColorView : TemplatedControl
{
///
@@ -20,7 +22,8 @@ namespace Avalonia.Controls
public event EventHandler? ColorChanged;
// XAML template parts
- private TextBox? _hexTextBox;
+ private TextBox? _hexTextBox;
+ private TabControl? _tabControl;
private ObservableCollection _customPaletteColors = new ObservableCollection();
private ColorToHexConverter colorToHexConverter = new ColorToHexConverter();
@@ -31,7 +34,7 @@ namespace Avalonia.Controls
///
public ColorView() : base()
{
- this.CustomPalette = new FluentColorPalette();
+ CustomPalette = new FluentColorPalette();
}
///
@@ -66,6 +69,77 @@ namespace Avalonia.Controls
}
}
+ ///
+ /// Validates the selected subview/tab taking into account the visibility of each subview/tab
+ /// as well as the current selection.
+ ///
+ private void ValidateSelectedTab()
+ {
+ if (_tabControl != null &&
+ _tabControl.Items != null)
+ {
+ // Determine if any item is visible
+ bool isAnyItemVisible = false;
+ foreach (var item in _tabControl.Items)
+ {
+ if (item is Control control &&
+ control.IsVisible)
+ {
+ isAnyItemVisible = true;
+ break;
+ }
+ }
+
+ if (isAnyItemVisible)
+ {
+ object? selectedItem = null;
+
+ if (_tabControl.SelectedItem == null &&
+ _tabControl.ItemCount > 0)
+ {
+ // As a failsafe, forcefully select the first item
+ foreach (var item in _tabControl.Items)
+ {
+ selectedItem = item;
+ break;
+ }
+ }
+ else
+ {
+ selectedItem = _tabControl.SelectedItem;
+ }
+
+ if (selectedItem is Control selectedControl &&
+ selectedControl.IsVisible == false)
+ {
+ // Select the first visible item instead
+ foreach (var item in _tabControl.Items)
+ {
+ if (item is Control control &&
+ control.IsVisible)
+ {
+ selectedItem = item;
+ break;
+ }
+ }
+ }
+
+ _tabControl.SelectedItem = selectedItem;
+ _tabControl.IsVisible = true;
+ }
+ else
+ {
+ // Special case when all items are hidden
+ // If TabControl ever properly supports no selected item /
+ // all items hidden this can be removed
+ _tabControl.SelectedItem = null;
+ _tabControl.IsVisible = false;
+ }
+ }
+
+ return;
+ }
+
///
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{
@@ -76,6 +150,8 @@ namespace Avalonia.Controls
}
_hexTextBox = e.NameScope.Find("PART_HexTextBox");
+ _tabControl = e.NameScope.Find("PART_TabControl");
+
SetColorToHexTextBox();
if (_hexTextBox != null)
@@ -85,6 +161,7 @@ namespace Avalonia.Controls
}
base.OnApplyTemplate(e);
+ ValidateSelectedTab();
}
///
@@ -143,6 +220,18 @@ namespace Avalonia.Controls
}
}
}
+ else if (change.Property == IsColorComponentsVisibleProperty ||
+ change.Property == IsColorPaletteVisibleProperty ||
+ change.Property == IsColorSpectrumVisibleProperty)
+ {
+ // When the property changed notification is received here the visibility
+ // of individual tab items has not yet been updated though the bindings.
+ // Therefore, the validation is delayed until after bindings update.
+ Dispatcher.UIThread.Post(() =>
+ {
+ ValidateSelectedTab();
+ }, DispatcherPriority.Background);
+ }
base.OnPropertyChanged(change);
}
diff --git a/src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorView.xaml b/src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorView.xaml
index afc8682a66..420e3b2ae9 100644
--- a/src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorView.xaml
+++ b/src/Avalonia.Controls.ColorPicker/Themes/Fluent/ColorView.xaml
@@ -109,22 +109,29 @@
BorderBrush="{ThemeResource DividerStrokeColorDefaultBrush}"
BorderThickness="0,1,0,0" />-->
-
0,0,0,0
-
-
+
@@ -181,8 +188,7 @@
-
+
@@ -257,8 +263,7 @@
-
+