Browse Source

ControlCatalog: improve transparent appearance (#21441)

* ControlCatalog: improve transparent appearance

* Update AvaloniaUI.DiagnosticsSupport to 2.2.1

* Make TransparentStyles AOT compatible
pull/21457/head
Julien Lebosquain 4 months ago
committed by GitHub
parent
commit
9d4c952ab0
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      Directory.Packages.props
  2. 6
      samples/ControlCatalog/MainView.xaml
  3. 22
      samples/ControlCatalog/MainView.xaml.cs
  4. 16
      samples/ControlCatalog/MainWindow.xaml
  5. 25
      samples/ControlCatalog/TransparentStyles.axaml
  6. 5
      samples/ControlCatalog/TransparentStyles.axaml.cs

2
Directory.Packages.props

@ -7,7 +7,7 @@
<PackageVersion Include="Appium.WebDriver" Version="5.2.0" /> <PackageVersion Include="Appium.WebDriver" Version="5.2.0" />
<PackageVersion Include="Avalonia.Angle.Windows.Natives" Version="2.1.27548.20260419" /> <PackageVersion Include="Avalonia.Angle.Windows.Natives" Version="2.1.27548.20260419" />
<PackageVersion Include="Avalonia.BuildServices" Version="11.3.2" /> <PackageVersion Include="Avalonia.BuildServices" Version="11.3.2" />
<PackageVersion Include="AvaloniaUI.DiagnosticsSupport" Version="2.2.0-beta3" /> <PackageVersion Include="AvaloniaUI.DiagnosticsSupport" Version="2.2.1" />
<PackageVersion Include="BenchmarkDotNet" Version="0.15.6" /> <PackageVersion Include="BenchmarkDotNet" Version="0.15.6" />
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.0" /> <PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageVersion Include="Dotnet.Bundle" Version="0.9.13" /> <PackageVersion Include="Dotnet.Bundle" Version="0.9.13" />

6
samples/ControlCatalog/MainView.xaml

@ -25,6 +25,9 @@
<ResourceDictionary> <ResourceDictionary>
<x:Double x:Key="TabbedPageTabItemHeaderFontSize">20</x:Double> <x:Double x:Key="TabbedPageTabItemHeaderFontSize">20</x:Double>
<Thickness x:Key="TabbedPageTabStripPadding">10</Thickness> <Thickness x:Key="TabbedPageTabStripPadding">10</Thickness>
<ControlTheme x:Key="{x:Type local:MainView}"
TargetType="local:MainView"
BasedOn="{StaticResource {x:Type DrawerPage}}" />
</ResourceDictionary> </ResourceDictionary>
</DrawerPage.Resources> </DrawerPage.Resources>
<DrawerPage.Styles> <DrawerPage.Styles>
@ -90,7 +93,8 @@
Header="Settings" Header="Settings"
Margin="0" Margin="0"
BorderThickness="0" BorderThickness="0"
ExpandDirection="Up"> ExpandDirection="Up"
x:Name="SettingsExpander">
<StackPanel Width="152" Spacing="8"> <StackPanel Width="152" Spacing="8">
<ComboBox x:Name="Decorations" <ComboBox x:Name="Decorations"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"

22
samples/ControlCatalog/MainView.xaml.cs

@ -12,7 +12,7 @@ namespace ControlCatalog
{ {
public partial class MainView : DrawerPage public partial class MainView : DrawerPage
{ {
private Action? _disposeTransparencySetters; private readonly TransparentStyles _transparentStyles = new();
public MainView() public MainView()
{ {
@ -25,6 +25,8 @@ namespace ControlCatalog
private const double WideBreakpoint = 1008; private const double WideBreakpoint = 1008;
private const double NarrowBreakpoint = 640; private const double NarrowBreakpoint = 640;
protected override Type StyleKeyOverride => typeof(MainView);
private void MainView_Loaded(object? sender, Avalonia.Interactivity.RoutedEventArgs e) private void MainView_Loaded(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{ {
if (DataContext == null) if (DataContext == null)
@ -120,21 +122,21 @@ namespace ControlCatalog
private void TransparencyLevels_SelectionChanged(object? sender, SelectionChangedEventArgs e) private void TransparencyLevels_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{ {
_disposeTransparencySetters?.Invoke();
if (TopLevel.GetTopLevel(this) is { } topLevel && e.AddedItems.Count > 0 && e.AddedItems[0] is WindowTransparencyLevel transparencyLevel) if (TopLevel.GetTopLevel(this) is { } topLevel && e.AddedItems.Count > 0 && e.AddedItems[0] is WindowTransparencyLevel transparencyLevel)
{ {
topLevel.TransparencyLevelHint = [transparencyLevel]; topLevel.TransparencyLevelHint = [transparencyLevel];
if (topLevel.ActualTransparencyLevel != WindowTransparencyLevel.None && if (topLevel.ActualTransparencyLevel != WindowTransparencyLevel.None &&
topLevel.ActualTransparencyLevel == transparencyLevel) transparencyLevel != WindowTransparencyLevel.None)
{
topLevel.Background = new ImmutableSolidColorBrush(Colors.Gray, 0.2);
if (!topLevel.Styles.Contains(_transparentStyles))
topLevel.Styles.Add(_transparentStyles);
}
else
{ {
var transparentBrush = new ImmutableSolidColorBrush(Colors.White, 0); topLevel.Background = null;
var semiTransparentBrush = new ImmutableSolidColorBrush(Colors.Gray, 0.2); topLevel.Styles.Remove(_transparentStyles);
_disposeTransparencySetters =
(Action)topLevel.SetValue(BackgroundProperty, transparentBrush, Avalonia.Data.BindingPriority.Style)!.Dispose +
SetValue(BackgroundProperty, semiTransparentBrush, Avalonia.Data.BindingPriority.Style)!.Dispose +
SetValue(DrawerPage.DrawerBackgroundProperty, semiTransparentBrush, Avalonia.Data.BindingPriority.Style)!.Dispose;
} }
} }
} }

16
samples/ControlCatalog/MainWindow.xaml

@ -12,7 +12,6 @@
CanResize="{Binding CanResize}" CanResize="{Binding CanResize}"
CanMinimize="{Binding CanMinimize}" CanMinimize="{Binding CanMinimize}"
CanMaximize="{Binding CanMaximize}" CanMaximize="{Binding CanMaximize}"
Background="Transparent"
x:Class="ControlCatalog.MainWindow" WindowState="{Binding WindowState, Mode=TwoWay}" x:Class="ControlCatalog.MainWindow" WindowState="{Binding WindowState, Mode=TwoWay}"
x:DataType="vm:MainWindowViewModel"> x:DataType="vm:MainWindowViewModel">
<NativeMenu.Menu> <NativeMenu.Menu>
@ -60,11 +59,20 @@
<Panel Margin="{Binding $parent[local:MainWindow].OffScreenMargin}"> <Panel Margin="{Binding $parent[local:MainWindow].OffScreenMargin}">
<local:MainView Margin="{Binding $parent[local:MainWindow].WindowDecorationMargin}" /> <local:MainView Margin="{Binding $parent[local:MainWindow].WindowDecorationMargin}" />
</Panel> </Panel>
<Border IsVisible="{Binding ExtendClientAreaEnabled}" BorderThickness="1 1 1 0" CornerRadius="4 4 0 0" BorderBrush="#55000000" Height="22" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="250 8 0 0"> <Border IsVisible="{Binding ExtendClientAreaEnabled}"
BorderThickness="1"
CornerRadius="4"
BorderBrush="#55000000"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Margin="250,0,0,0"
Height="{Binding $parent[local:MainWindow].WindowDecorationMargin.Top}">
<Border.Background> <Border.Background>
<SolidColorBrush Color="White" Opacity="0.7" /> <SolidColorBrush Color="DodgerBlue" Opacity="0.7" />
</Border.Background> </Border.Background>
<TextBlock Margin="5 5 5 0" Text="Content In Title Bar" /> <TextBlock Text="Content In Title Bar"
Margin="4"
VerticalAlignment="Center" />
</Border> </Border>
</Panel> </Panel>
</Window> </Window>

25
samples/ControlCatalog/TransparentStyles.axaml

@ -0,0 +1,25 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ControlCatalog"
x:Class="ControlCatalog.TransparentStyles">
<!-- Only used when WindowTransparencyLevel != None -->
<Styles.Resources>
<SolidColorBrush x:Key="NavigationBarBackground" Color="Transparent" />
<SolidColorBrush x:Key="TitleBarBackgroundBrush" Color="Transparent" />
<SolidColorBrush x:Key="ExpanderHeaderBackground" Color="Transparent" />
<SolidColorBrush x:Key="ExpanderHeaderBackgroundPointerOver" Color="#33808080" />
<SolidColorBrush x:Key="ExpanderHeaderBackgroundPressed" Color="#66808080" />
</Styles.Resources>
<Style Selector="local|MainView">
<Setter Property="Background" Value="Transparent" />
<Setter Property="DrawerBackground" Value="Transparent" />
<Style Selector="^ TabbedPage">
<Setter Property="Background" Value="Transparent" />
</Style>
</Style>
</Styles>

5
samples/ControlCatalog/TransparentStyles.axaml.cs

@ -0,0 +1,5 @@
using Avalonia.Styling;
namespace ControlCatalog;
public class TransparentStyles : Styles;
Loading…
Cancel
Save