csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.8 KiB
100 lines
3.8 KiB
using System.Threading.Tasks;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Interactivity;
|
|
using Avalonia.Media;
|
|
|
|
namespace ControlCatalog.Pages
|
|
{
|
|
public partial class NavigationPageEventsPage : UserControl
|
|
{
|
|
private int _pageCount;
|
|
|
|
public NavigationPageEventsPage()
|
|
{
|
|
InitializeComponent();
|
|
Loaded += OnLoaded;
|
|
}
|
|
|
|
private async void OnLoaded(object? sender, RoutedEventArgs e)
|
|
{
|
|
DemoNav.Pushed += (s, ev) => AddLog($"Pushed → {ev.Page?.Header}");
|
|
DemoNav.Popped += (s, ev) => AddLog($"Popped ← {ev.Page?.Header}");
|
|
DemoNav.PoppedToRoot += (s, ev) => AddLog("PoppedToRoot");
|
|
DemoNav.PageInserted += (s, ev) => AddLog($"PageInserted: {ev.Page?.Header}");
|
|
DemoNav.PageRemoved += (s, ev) => AddLog($"PageRemoved: {ev.Page?.Header}");
|
|
DemoNav.ModalPushed += (s, ev) => AddLog($"ModalPushed → {ev.Modal?.Header}");
|
|
DemoNav.ModalPopped += (s, ev) => AddLog($"ModalPopped ← {ev.Modal?.Header}");
|
|
|
|
var root = NavigationDemoHelper.MakePage("Home", "Push pages and watch the event log.\nAll navigation events are captured.", 0);
|
|
SubscribePage(root);
|
|
await DemoNav.PushAsync(root, null);
|
|
}
|
|
|
|
private void SubscribePage(ContentPage page)
|
|
{
|
|
page.NavigatedTo += (s, e) => AddLog($"[{page.Header}] NavigatedTo");
|
|
page.NavigatedFrom += (s, e) => AddLog($"[{page.Header}] NavigatedFrom");
|
|
page.Navigating += args =>
|
|
{
|
|
AddLog($"[{page.Header}] Navigating");
|
|
return System.Threading.Tasks.Task.CompletedTask;
|
|
};
|
|
}
|
|
|
|
private async void OnPush(object? sender, RoutedEventArgs e)
|
|
{
|
|
_pageCount++;
|
|
var page = NavigationDemoHelper.MakePage($"Page {_pageCount}", "Navigate back to see events.", _pageCount);
|
|
SubscribePage(page);
|
|
await DemoNav.PushAsync(page);
|
|
}
|
|
|
|
private async void OnPop(object? sender, RoutedEventArgs e) => await DemoNav.PopAsync();
|
|
private async void OnPopToRoot(object? sender, RoutedEventArgs e) => await DemoNav.PopToRootAsync();
|
|
|
|
private void OnInsertPage(object? sender, RoutedEventArgs e)
|
|
{
|
|
if (DemoNav.CurrentPage == null)
|
|
return;
|
|
_pageCount++;
|
|
var page = NavigationDemoHelper.MakePage($"Inserted {_pageCount}", "Inserted below the current page.", _pageCount);
|
|
SubscribePage(page);
|
|
DemoNav.InsertPage(page, DemoNav.CurrentPage);
|
|
}
|
|
|
|
private void OnRemovePage(object? sender, RoutedEventArgs e)
|
|
{
|
|
var stack = DemoNav.NavigationStack;
|
|
if (stack.Count < 2)
|
|
return;
|
|
DemoNav.RemovePage(stack[stack.Count - 2]);
|
|
}
|
|
|
|
private async void OnPushModal(object? sender, RoutedEventArgs e)
|
|
{
|
|
_pageCount++;
|
|
var page = NavigationDemoHelper.MakePage($"Modal {_pageCount}", "Dismiss to see ModalPopped event.", _pageCount);
|
|
SubscribePage(page);
|
|
await DemoNav.PushModalAsync(page);
|
|
}
|
|
|
|
private async void OnPopModal(object? sender, RoutedEventArgs e) => await DemoNav.PopModalAsync();
|
|
|
|
private void OnClearLog(object? sender, RoutedEventArgs e)
|
|
{
|
|
LogPanel.Children.Clear();
|
|
}
|
|
|
|
private void AddLog(string message)
|
|
{
|
|
LogPanel.Children.Insert(0, new TextBlock
|
|
{
|
|
Text = message,
|
|
FontFamily = new FontFamily("Cascadia Code,Consolas,Menlo,monospace"),
|
|
FontSize = 11,
|
|
TextWrapping = TextWrapping.Wrap,
|
|
Margin = new Avalonia.Thickness(0, 1),
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|