feat: add a property to show if there is modal dialog available in a host.

This commit is contained in:
rabbitism
2024-02-08 23:44:02 +08:00
parent 974afa33c5
commit 9a34ce2620
3 changed files with 108 additions and 78 deletions

View File

@@ -16,81 +16,89 @@
<Design.DataContext> <Design.DataContext>
<vm:MainViewViewModel /> <vm:MainViewViewModel />
</Design.DataContext> </Design.DataContext>
<Panel>
<Grid
Classes.Blur="{Binding #host.HasModal}"
ColumnDefinitions="Auto, *"
RowDefinitions="Auto, *">
<Grid.Styles>
<Style Selector="Grid.Blur">
<Setter Property="Effect" Value="blur(20)" />
</Style>
</Grid.Styles>
<Border
Grid.RowSpan="2"
Padding="8,4"
VerticalAlignment="Stretch"
Theme="{DynamicResource CardBorder}">
<u:NavigationMenu ItemsSource="{Binding Menus.MenuItems}" ShowCollapseButton="True">
<u:NavigationMenu.Header>
<TextBlock
Classes="H4"
Text="Ursa"
Theme="{DynamicResource TitleTextBlock}" />
</u:NavigationMenu.Header>
<u:NavigationMenu.Icon>
<Image
Width="48"
Height="48"
RenderOptions.BitmapInterpolationMode="HighQuality"
Source="../Assets/Ursa.ico" />
</u:NavigationMenu.Icon>
<u:NavigationMenu.ItemTemplate>
<converters:MenuDataTemplateSelector>
<converters:MenuDataTemplateSelector.MenuTemplate>
<DataTemplate DataType="vm:MenuItemViewModel">
<u:NavigationMenuItem
Command="{Binding ActivateCommand}"
Header="{Binding}"
ItemsSource="{Binding Children}">
<u:NavigationMenuItem.HeaderTemplate>
<DataTemplate x:DataType="vm:MenuItemViewModel">
<StackPanel Orientation="Horizontal">
<TextBlock HorizontalAlignment="Left" Text="{Binding MenuHeader}" />
<u:Badge
Margin="8,0,0,0"
HorizontalAlignment="Left"
BadgeContent="{Binding Status}"
CornerPosition="TopRight" />
</StackPanel>
<Grid ColumnDefinitions="Auto, *" RowDefinitions="Auto, *"> </DataTemplate>
<Border </u:NavigationMenuItem.HeaderTemplate>
Grid.RowSpan="2" <u:NavigationMenuItem.Icon>
Padding="8,4" <Border
VerticalAlignment="Stretch" Width="10"
Theme="{DynamicResource CardBorder}"> Height="10"
<u:NavigationMenu ItemsSource="{Binding Menus.MenuItems}" ShowCollapseButton="True"> Background="{DynamicResource SemiBlue6}"
<u:NavigationMenu.Header> CornerRadius="3" />
<TextBlock </u:NavigationMenuItem.Icon>
Classes="H4" </u:NavigationMenuItem>
Text="Ursa" </DataTemplate>
Theme="{DynamicResource TitleTextBlock}" /> </converters:MenuDataTemplateSelector.MenuTemplate>
</u:NavigationMenu.Header> <converters:MenuDataTemplateSelector.SeparatorTemplate>
<u:NavigationMenu.Icon> <DataTemplate DataType="vm:MenuItemViewModel">
<Image <u:NavigationMenuSeparator Header="{Binding MenuHeader}" />
Width="48" </DataTemplate>
Height="48" </converters:MenuDataTemplateSelector.SeparatorTemplate>
RenderOptions.BitmapInterpolationMode="HighQuality" </converters:MenuDataTemplateSelector>
Source="../Assets/Ursa.ico" /> </u:NavigationMenu.ItemTemplate>
</u:NavigationMenu.Icon> </u:NavigationMenu>
<u:NavigationMenu.ItemTemplate> </Border>
<converters:MenuDataTemplateSelector> <u:ThemeToggleButton
<converters:MenuDataTemplateSelector.MenuTemplate> Grid.Row="0"
<DataTemplate DataType="vm:MenuItemViewModel"> Grid.Column="1"
<u:NavigationMenuItem HorizontalAlignment="Right" />
Command="{Binding ActivateCommand}" <ContentControl
Header="{Binding}" Grid.Row="1"
ItemsSource="{Binding Children}"> Grid.Column="1"
<u:NavigationMenuItem.HeaderTemplate> Margin="12"
<DataTemplate x:DataType="vm:MenuItemViewModel"> Content="{Binding Content}">
<StackPanel Orientation="Horizontal"> <ContentControl.ContentTemplate>
<TextBlock HorizontalAlignment="Left" Text="{Binding MenuHeader}" /> <converters:ViewLocator />
<u:Badge </ContentControl.ContentTemplate>
Margin="8,0,0,0" </ContentControl>
HorizontalAlignment="Left" </Grid>
BadgeContent="{Binding Status}" <u:OverlayDialogHost Name="host" SnapThickness="20" />
CornerPosition="TopRight" /> </Panel>
</StackPanel>
</DataTemplate>
</u:NavigationMenuItem.HeaderTemplate>
<u:NavigationMenuItem.Icon>
<Border
Width="10"
Height="10"
Background="{DynamicResource SemiBlue6}"
CornerRadius="3" />
</u:NavigationMenuItem.Icon>
</u:NavigationMenuItem>
</DataTemplate>
</converters:MenuDataTemplateSelector.MenuTemplate>
<converters:MenuDataTemplateSelector.SeparatorTemplate>
<DataTemplate DataType="vm:MenuItemViewModel">
<u:NavigationMenuSeparator Header="{Binding MenuHeader}" />
</DataTemplate>
</converters:MenuDataTemplateSelector.SeparatorTemplate>
</converters:MenuDataTemplateSelector>
</u:NavigationMenu.ItemTemplate>
</u:NavigationMenu>
</Border>
<u:ThemeToggleButton
Grid.Row="0"
Grid.Column="1"
HorizontalAlignment="Right"/>
<ContentControl
Grid.Row="1"
Grid.Column="1"
Margin="12"
Content="{Binding Content}">
<ContentControl.ContentTemplate>
<converters:ViewLocator />
</ContentControl.ContentTemplate>
</ContentControl>
<u:OverlayDialogHost Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Grid.ColumnSpan="2" SnapThickness="20"/>
</Grid>
</UserControl> </UserControl>

View File

@@ -92,7 +92,7 @@ public partial class OverlayDialogHost
Children.Add(mask); Children.Add(mask);
} }
this.Children.Add(control); this.Children.Add(control);
_layers.Add(new DialogPair(mask, control)); _layers.Add(new DialogPair(mask, control, false));
control.Measure(this.Bounds.Size); control.Measure(this.Bounds.Size);
control.Arrange(new Rect(control.DesiredSize)); control.Arrange(new Rect(control.DesiredSize));
SetToPosition(control); SetToPosition(control);
@@ -118,6 +118,11 @@ public partial class OverlayDialogHost
{ {
await _maskDisappearAnimation.RunAsync(layer.Mask); await _maskDisappearAnimation.RunAsync(layer.Mask);
Children.Remove(layer.Mask); Children.Remove(layer.Mask);
if (layer.Modal)
{
_modalCount--;
HasModal = _modalCount > 0;
}
} }
ResetZIndices(); ResetZIndices();
@@ -142,6 +147,8 @@ public partial class OverlayDialogHost
control.AddHandler(OverlayFeedbackElement.ClosedEvent, OnDialogControlClosing); control.AddHandler(OverlayFeedbackElement.ClosedEvent, OnDialogControlClosing);
control.AddHandler(DialogControlBase.LayerChangedEvent, OnDialogLayerChanged); control.AddHandler(DialogControlBase.LayerChangedEvent, OnDialogLayerChanged);
_maskAppearAnimation.RunAsync(mask); _maskAppearAnimation.RunAsync(mask);
_modalCount++;
HasModal = _modalCount > 0;
control.IsClosed = false; control.IsClosed = false;
} }

View File

@@ -24,13 +24,28 @@ public partial class OverlayDialogHost: Canvas
{ {
internal PureRectangle? Mask; internal PureRectangle? Mask;
internal OverlayFeedbackElement Element; internal OverlayFeedbackElement Element;
internal bool Modal;
public DialogPair(PureRectangle? mask, OverlayFeedbackElement element) public DialogPair(PureRectangle? mask, OverlayFeedbackElement element, bool modal = true)
{ {
Mask = mask; Mask = mask;
Element = element; Element = element;
Modal = modal;
} }
} }
private int _modalCount = 0;
public static readonly DirectProperty<OverlayDialogHost, bool> HasModalProperty = AvaloniaProperty.RegisterDirect<OverlayDialogHost, bool>(
nameof(HasModal), o => o.HasModal);
private bool _hasModal;
public bool HasModal
{
get => _hasModal;
private set => SetAndRaise(HasModalProperty, ref _hasModal, value);
}
static OverlayDialogHost() static OverlayDialogHost()
{ {