Avalonia的页面切换有点反人类,本质原理是把不同页面用UserControl组件包装实现类似于Winui3 Page的效果但是Avalonia的页面切换做的并不如Winui3那样出色.
Avalonia页面切换的问题在于 :
页面的切换是需要开发者手动去创建实例的,对于开发者来说如果页面只需要简单的实例化一下再好不过,但问题在于很多页面都存在内容缓存的需求,因此不能直接实例化一个页面,而是需要给实例化的页面提供一个全局访问点,而且开发者还要保证这个全局访问点的唯一性.这个问题可以通过单例模式解决.以下为代码示例.
1.编写一个接口文件名为IPage.cs
IPage.cs源代码
using Avalonia.Controls;
namespace Test.Interfaces;
public interface IPage
{
public static abstract UserControl GetInstance();
}
2.现在创建了一个名为ModelChat的UserControl(页面),先暂时不用管ModelChat.xaml,先修改ModelChat.cs使其符合单例模式
ModelChat.cs源代码
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Test.Views;
public partial class ModelChat : UserControl
{
public ModelChat()
{
InitializeComponent();
}
}
修改后代码
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Test.Views;
public partial class ModelChat : UserControl,IPage
{
private static ModelChat _instance;
private ModelChat()
{
InitializeComponent();
}
public static UserControl GetInstance() => (_instance == null) ? new ModelChat() : _instance;
}
假设现在有一个导航栏组件,当进行页面切换操作时.则可以避免直接实例化页面,保证了扩展性,避免堆一堆全局变量(屎山代码),避免出现耦合情况.