feat: add a property to show if there is modal dialog available in a host.
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user