Improve sub navigations

This commit is contained in:
TheXamlGuy
2024-05-27 18:44:09 +01:00
parent 3f6d21a6ba
commit 3507edf37b
15 changed files with 125 additions and 24 deletions
@@ -27,6 +27,7 @@
<NavigateAction Region="Left" Route="ContentItemCollection"> <NavigateAction Region="Left" Route="ContentItemCollection">
<Parameter Key="Filter" Value="{Binding Filter}" /> <Parameter Key="Filter" Value="{Binding Filter}" />
<Parameter Key="Transition" Value="FromRight" /> <Parameter Key="Transition" Value="FromRight" />
<Parameter Key="NavigationStackEnabled" Value="{x:True}" />
</NavigateAction> </NavigateAction>
</ConditionAction> </ConditionAction>
</DataTriggerBehavior> </DataTriggerBehavior>
+4 -2
View File
@@ -105,10 +105,11 @@ public partial class App : Application
services.AddTemplate<ItemCollectionViewModel, ItemCollectionView>("ContentItemCollection"); services.AddTemplate<ItemCollectionViewModel, ItemCollectionView>("ContentItemCollection");
services.AddHandler<AggerateLockerItemViewModelHandler>(); services.AddHandler<AggerateLockerItemViewModelHandler>();
services.AddTemplate<SearchLockerActionViewModel, SearchLockerActionView>();
services.AddTemplate<LockerHeaderViewModel, LockerHeaderView>("LockerHeader"); services.AddTemplate<LockerHeaderViewModel, LockerHeaderView>("LockerHeader");
services.AddTemplate<BackActionViewModel, BackActionView>();
services.AddTemplate<CreateItemActionViewModel, CreateItemActionView>(); services.AddTemplate<CreateItemActionViewModel, CreateItemActionView>();
services.AddTemplate<SearchLockerActionViewModel, SearchLockerActionView>();
services.AddTemplate<ItemCategoryCollectionViewModel, ItemCategoryCollectionView>("LockerItemCategoryCollection"); services.AddTemplate<ItemCategoryCollectionViewModel, ItemCategoryCollectionView>("LockerItemCategoryCollection");
services.AddTemplate<ItemCategoryNavigationViewModel, ItemCategoryNavigationView>(); services.AddTemplate<ItemCategoryNavigationViewModel, ItemCategoryNavigationView>();
@@ -116,6 +117,7 @@ public partial class App : Application
services.AddTemplate<ItemNavigationViewModel, ItemNavigationView>(); services.AddTemplate<ItemNavigationViewModel, ItemNavigationView>();
services.AddTemplate<ItemViewModel, ItemView>("Item"); services.AddTemplate<ItemViewModel, ItemView>("Item");
services.AddHandler<AggerateItemViewModelHandler>(); services.AddHandler<AggerateItemViewModelHandler>();
services.AddTemplate<ItemCommandHeaderViewModel, ItemCommandHeaderView>("ItemCommandHeader"); services.AddTemplate<ItemCommandHeaderViewModel, ItemCommandHeaderView>("ItemCommandHeader");
@@ -27,6 +27,7 @@
<NavigateAction Region="Left" Route="ContentItemCollection"> <NavigateAction Region="Left" Route="ContentItemCollection">
<Parameter Key="Filter" Value="{Binding Filter}" /> <Parameter Key="Filter" Value="{Binding Filter}" />
<Parameter Key="Transition" Value="FromRight" /> <Parameter Key="Transition" Value="FromRight" />
<Parameter Key="NavigationStackEnabled" Value="{x:True}" />
</NavigateAction> </NavigateAction>
</ConditionAction> </ConditionAction>
</DataTriggerBehavior> </DataTriggerBehavior>
+42
View File
@@ -0,0 +1,42 @@
<UserControl
x:Class="Bitvault.Avalonia.BackActionView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<ResourceDictionary>
<x:Double x:Key="ButtonWidth">40</x:Double>
<x:Double x:Key="ButtonHeight">36</x:Double>
<SolidColorBrush x:Key="ButtonBackground" Color="{DynamicResource SubtleFillColorTransparent}" />
<SolidColorBrush x:Key="ButtonBackgroundPointerOver" Color="{DynamicResource SubtleFillColorSecondary}" />
<SolidColorBrush x:Key="ButtonBackgroundPressed" Color="{DynamicResource SubtleFillColorTertiary}" />
<Thickness x:Key="ButtonBorderThemeThickness">0</Thickness>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Light">
<SolidColorBrush x:Key="IconForegroundBrush" Color="#AB000000" />
</ResourceDictionary>
<ResourceDictionary x:Key="Dark">
<SolidColorBrush x:Key="IconForegroundBrush" Color="#ABFFFFFF" />
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Button
Width="{StaticResource ButtonWidth}"
Height="{StaticResource ButtonHeight}"
VerticalAlignment="Center"
Foreground="{DynamicResource IconForegroundBrush}"
ToolTip.Tip="Back">
<TextBlock
Margin="0,3,0,0"
VerticalAlignment="Center"
FontFamily="{DynamicResource FluentThemeFontFamily}"
FontSize="16"
Foreground="{DynamicResource IconForegroundBrush}"
Text="&#xE0F5;" />
<Interaction.Behaviors>
<EventTriggerBehavior EventName="Click">
<NavigateBackAction Region="Left" />
</EventTriggerBehavior>
</Interaction.Behaviors>
</Button>
</UserControl>
@@ -0,0 +1,9 @@
using Avalonia.Controls;
namespace Bitvault.Avalonia;
public partial class BackActionView : UserControl
{
public BackActionView() =>
InitializeComponent();
}
@@ -30,6 +30,7 @@
<EventTriggerBehavior EventName="Click"> <EventTriggerBehavior EventName="Click">
<NavigateAction Region="Left" Route="LockerItemCategoryCollection"> <NavigateAction Region="Left" Route="LockerItemCategoryCollection">
<Parameter Key="Transition" Value="FromRight" /> <Parameter Key="Transition" Value="FromRight" />
<Parameter Key="NavigationStackEnabled" Value="{x:True}" />
</NavigateAction> </NavigateAction>
</EventTriggerBehavior> </EventTriggerBehavior>
</Interaction.Behaviors> </Interaction.Behaviors>
@@ -4,4 +4,31 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:Bitvault" xmlns:vm="using:Bitvault"
x:DataType="vm:ItemCategoryNavigationViewModel" x:DataType="vm:ItemCategoryNavigationViewModel"
Content="{Binding Name}" /> Content="{Binding Name}"
IsSelected="{Binding Selected, Mode=TwoWay}">
<Interaction.Behaviors>
<AttachedBehaviour>
<ConditionAction>
<ConditionAction.Condition>
<ConditionalExpression ForwardChaining="And">
<ComparisonCondition LeftOperand="{Binding Selected}" RightOperand="True" />
</ConditionalExpression>
</ConditionAction.Condition>
<NavigateAction
Region="{Binding Named, StringFormat='{}{0}:Content'}"
Route="Item"
Scope="self">
<Parameter Key="Immutable" Value="{x:False}" />
</NavigateAction>
</ConditionAction>
</AttachedBehaviour>
<DataTriggerBehavior Binding="{Binding Selected}" Value="True">
<NavigateAction
Region="{Binding Named, StringFormat='{}{0}:Content'}"
Route="Item"
Scope="self">
<Parameter Key="Immutable" Value="{x:False}" />
</NavigateAction>
</DataTriggerBehavior>
</Interaction.Behaviors>
</ListBoxItem>
@@ -2,7 +2,7 @@ using Avalonia.Controls;
namespace Bitvault.Avalonia; namespace Bitvault.Avalonia;
public partial class ItemCategoryNavigationView : UserControl public partial class ItemCategoryNavigationView : ListBoxItem
{ {
public ItemCategoryNavigationView() => public ItemCategoryNavigationView() =>
InitializeComponent(); InitializeComponent();
+1 -1
View File
@@ -13,7 +13,7 @@
Grid.Row="0" Grid.Row="0"
Grid.ColumnSpan="3" Grid.ColumnSpan="3"
Height="44" Height="44"
Margin="8,0,0,0"> Margin="4,2,0,0">
<ContentControl VerticalAlignment="Center"> <ContentControl VerticalAlignment="Center">
<Interaction.Behaviors> <Interaction.Behaviors>
<AttachedBehaviour> <AttachedBehaviour>
@@ -27,6 +27,7 @@
<NavigateAction Region="Left" Route="ContentItemCollection"> <NavigateAction Region="Left" Route="ContentItemCollection">
<Parameter Key="Filter" Value="{Binding Filter}" /> <Parameter Key="Filter" Value="{Binding Filter}" />
<Parameter Key="Transition" Value="FromRight" /> <Parameter Key="Transition" Value="FromRight" />
<Parameter Key="NavigationStackEnabled" Value="{x:True}" />
</NavigateAction> </NavigateAction>
</ConditionAction> </ConditionAction>
</DataTriggerBehavior> </DataTriggerBehavior>
+20
View File
@@ -0,0 +1,20 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Toolkit.Foundation;
namespace Bitvault;
public partial class BackActionViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer) : Observable<string>(provider, factory, mediator, publisher, subscriber, disposer)
{
[ObservableProperty]
private int index = 0;
[RelayCommand]
public void Invoke() => Publisher.Publish(Notify.As(new Search(Value)),
nameof(ItemCollectionViewModel));
}
+1 -1
View File
@@ -19,7 +19,7 @@ public partial class ItemCategoryCollectionViewModel(IServiceProvider provider,
{ {
Publisher.Publish(Notify.As(Factory.Create<LockerCommandHeaderCollection>(new List<IDisposable> Publisher.Publish(Notify.As(Factory.Create<LockerCommandHeaderCollection>(new List<IDisposable>
{ {
Factory.Create<BackActionViewModel>(),
}))); })));
return base.OnActivated(); return base.OnActivated();
+13 -2
View File
@@ -9,9 +9,20 @@ public partial class ItemCategoryNavigationViewModel(IServiceProvider provider,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
string name) : NamedComponent named,
Observable(provider, factory, mediator, publisher, subscriber, disposer) string name,
bool selected = false) :
Observable(provider, factory, mediator, publisher, subscriber, disposer),
ISelectable,
IRemovable
{ {
[ObservableProperty] [ObservableProperty]
private string name = name; private string name = name;
[ObservableProperty]
private string named = $"{named}";
[ObservableProperty]
private bool selected = selected;
} }
+2 -1
View File
@@ -6,7 +6,8 @@ namespace Bitvault;
public partial class ItemCollectionViewModel : public partial class ItemCollectionViewModel :
ObservableCollection<ItemNavigationViewModel>, ObservableCollection<ItemNavigationViewModel>,
INotificationHandler<NotifyEventArgs<Filter>>, INotificationHandler<NotifyEventArgs<Filter>>,
INotificationHandler<NotifyEventArgs<Search>> INotificationHandler<NotifyEventArgs<Search>>,
IBackStack
{ {
private LockerViewModelConfiguration configuration; private LockerViewModelConfiguration configuration;
-15
View File
@@ -18,18 +18,3 @@ public partial class SearchLockerActionViewModel(IServiceProvider provider,
public void Invoke() => Publisher.Publish(Notify.As(new Search(Value)), public void Invoke() => Publisher.Publish(Notify.As(new Search(Value)),
nameof(ItemCollectionViewModel)); nameof(ItemCollectionViewModel));
} }
public partial class BackContainerActionViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer) : Observable<string>(provider, factory, mediator, publisher, subscriber, disposer)
{
[ObservableProperty]
private int index = 2;
[RelayCommand]
public void Invoke() => Publisher.Publish(Notify.As(new Search(Value)),
nameof(ItemCollectionViewModel));
}