Avalonia VM的封装 -- ViewModelBase基类

用于MVVM设计模式的ViewModel基类;

参考WPF的模式,修改为Avalonia适用的基类;

供学习使用,大家可以评论或私信我一块学习成长。

using Avalonia.Controls;
using ReactiveUI;

namespace AvaloniaClient.ViewModels;

public class ViewModelBase : ReactiveObject
{

    //程序的主命名空间
    public string UINameSapce = "";
    //类名
    public string UIElementName = "";
    public Avalonia.Controls.Control UIElement { get; set; }

    private System.Type UIType;

    /// <summary>
    /// ViewModel基类  需要传UI界面的全名(FullName)参数
    /// </summary>
    /// <param name="uiType">UI界面的类型</param>
    public ViewModelBase(System.Type uiType)
    {
        try
        {
            UIType = uiType;
            UINameSapce = uiType.Namespace;
            SetUIElement();
            UIElement.DataContext = this;
            Avalonia.Input.InputMethod.SetIsInputMethodEnabled(UIElement, false);
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// ViewModel基类,直接传入UI界面对象
    /// </summary>
    /// <param name="ui"></param>
    public ViewModelBase(Avalonia.Controls.Control ui)
    {
        try
        {
            UIType = ui.GetType();
            UINameSapce = UIType.Namespace;
            UIElementName = UIType.FullName;
            UIElement = ui;
            UIElement.Loaded += Page_Loaded;
            UIElement.Unloaded += Page_Unloaded;
            UIElement.DataContext = this;
            Avalonia.Input.InputMethod.SetIsInputMethodEnabled(UIElement, false);
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
    }

    #region 通过反射创建对应的UI元素

    /// <summary>
    /// 页面加载时触发
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected virtual void Page_Loaded(object sender, Avalonia.Interactivity.RoutedEventArgs e)
    {
    }

    /// <summary>
    /// 页面退出时触发
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected virtual void Page_Unloaded(object sender, Avalonia.Interactivity.RoutedEventArgs e)
    {
    }

    /// <summary>
    /// 根据VM名称,反射对应类型的UI实例
    /// </summary>
    public void SetUIElement()
    {
        System.Type childType = this.GetType();//获取子类的类型   
        UIElementName = this.GetType().FullName;
        UIElement = (Avalonia.Controls.Control)GetElement();
        UIElement.Loaded += Page_Loaded;
        UIElement.Unloaded += Page_Unloaded;
    }

    /// <summary>
    /// 用UI全名称(FullName)进行反射UI实例
    /// </summary>
    /// <typeparam name="E"></typeparam>
    /// <param name="UIElementFullName"></param>
    /// <returns></returns>
    public object GetElement()
    {
        if (UIType != null)
        {
            return System.Activator.CreateInstance(UIType);
        }
        else
        {
            throw new System.Exception("UIType为空");
        }
    }

    /// <summary>
    /// 根据窗口全名获取窗口类型 -对动态加载窗口不友好、已弃用
    /// </summary>
    /// <param name="fullName"></param>
    /// <returns></returns>
    public System.Type GetFormType(string fullName)
    {
        System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(UINameSapce);
        System.Type type = assembly.GetType(fullName, true, false);
        return type;
    }
    #endregion

    #region 窗体操作

    /// <summary>
    /// 显示窗口
    /// </summary>
    /// <exception cref="System.Exception"></exception>
    public void Show()
    {
        if (UIElement is Avalonia.Controls.Window)
        {
            Avalonia.Threading.Dispatcher.UIThread.Invoke(new System.Action(() =>
            {
                (UIElement as Avalonia.Controls.Window).Show();
            }));
        }
        else
        {
            throw new System.Exception("元素类型不正确");
        }
    }

    /// <summary>
    /// 模态对话框显示
    /// </summary>
    /// <returns></returns>
    /// <exception cref="System.Exception"></exception>
    public bool ShowDialog()
    {
        if (UIElement is Avalonia.Controls.Window)
        {
            var res = (UIElement as Avalonia.Controls.Window).ShowDialog<bool>((VM_MainWindow.Instance.UIElement as Window));
            res.Wait();
            return res.Result;
        }
        else
        {
            throw new System.Exception("元素类型不正确");
        }
    }

    /// <summary>
    /// 窗口关闭
    /// </summary>
    /// <exception cref="System.Exception"></exception>
    public void Close()
    {
        if (UIElement is Avalonia.Controls.Window)
        {
            Avalonia.Threading.Dispatcher.UIThread.Invoke(new System.Action(() =>
            {
                (UIElement as Avalonia.Controls.Window).Close();
            }));
        }
        else
        {
            throw new System.Exception("元素类型不正确");
        }
    }

    /// <summary>
    /// 窗口隐藏
    /// </summary>
    /// <exception cref="System.Exception"></exception>
    public void Hide()
    {
        if (UIElement is Avalonia.Controls.Window)
        {
            Avalonia.Threading.Dispatcher.UIThread.Invoke(new System.Action(() =>
            {
                (UIElement as Avalonia.Controls.Window).Hide();
            }));
        }
        else
        {
            throw new System.Exception("元素类型不正确");
        }
    }
    #endregion

    #region   异步线程

    /// <summary>
    /// 异步方法执行事件
    /// </summary>
    public void AsyncLoad(System.Action action)
    {
        System.IAsyncResult result = action.BeginInvoke((iar) =>
        {
        }, null);
    }

    /// <summary>
    /// 异步方法执行事件 带回调方法
    /// </summary>
    public void AsyncLoad(System.Action action, System.Action callback)
    {
        System.IAsyncResult result = action.BeginInvoke((iar) =>
        {
            this.DoMenthodByDispatcher(callback);
        }, null);
    }

    /// <summary>
    /// 异步方法执行事件 带参数及带回调方法
    /// </summary>
    public void AsyncLoad<T>(System.Action<T> action, T para, System.Action callback)
    {
        System.IAsyncResult result = action.BeginInvoke(para, (iar) =>
        {
            this.DoMenthodByDispatcher(callback);
        }, null);
    }

    /// <summary>
    /// 异步方法执行事件 带参数及带回调方法
    /// </summary>
    public void AsyncLoad<T, R>(System.Func<T, R> action, T para, System.Action<R> callback)
    {
        System.IAsyncResult result = action.BeginInvoke(para, (iar) =>
        {
            var res = action.EndInvoke(iar);
            this.DoMenthodByDispatcher<R>(callback, res);
        }, null);
    }

    /// <summary>
    /// 异步方法执行事件 带回调方法
    /// </summary>
    /// <typeparam name="R"></typeparam>
    /// <param name="action"></param>
    /// <param name="callback"></param>
    public void AsyncLoad<R>(System.Func<R> action, System.Action<R> callback)
    {
        System.IAsyncResult result = action.BeginInvoke((iar) =>
        {
            var res = action.EndInvoke(iar);
            this.DoMenthodByDispatcher<R>(callback, res);
        }, null);
    }

    /// <summary>
    /// 使用UI线程执行Action 带参数  默认 异步(BeginInvoke)执行
    /// </summary>
    /// <typeparam name="T">泛型参数</typeparam>
    /// <param name="action">执行的方法</param>
    /// <param name="obj">参数</param>
    /// <param name="isAsync">是否异步  true-异步 false-同步</param>
    public void DoMenthodByDispatcher<T>(System.Action<T> action, T obj, bool isAsync = true)
    {
        if (isAsync)
        {
            Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(new System.Action(() =>
            {
                action(obj);
            }));
        }
        else
        {
            Avalonia.Threading.Dispatcher.UIThread.Invoke(new System.Action(() =>
            {
                action(obj);
            }));
        }
    }

    /// <summary>
    ///使用UI线程执行Action  默认 异步(BeginInvoke)执行
    /// </summary>
    /// <param name="action"></param>
    /// <param name="isAsync">是否异步  true-异步 false-同步</param>
    public void DoMenthodByDispatcher(System.Action action, bool isAsync = true)
    {
        if (isAsync)
        {
            Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(new System.Action(() =>
            {
                action();
            }));
        }
        else
        {
            Avalonia.Threading.Dispatcher.UIThread.Invoke(new System.Action(() =>
            {
                action();
            }));
        }
    }
    #endregion

}

Avalonia是一个**跨平台的UI框架,用于创建桌面应用程序**。 以下是一些关于Avalonia的基本信息和学习资源: 1. **什么是Avalonia?**:Avalonia是一个基于WPF XAML的开源UI框架,它允许开发者使用.NET构建跨平台的桌面应用程序。Avalonia支持多种操作系统,包括Windows、Linux和macOS。 2. **准备工作**:在开始使用Avalonia之前,你需要安装相应的开发环境,并配置项目。这通常包括安装.NET SDK和Avalonia工具包。 3. **创建第一个Avalonia应用程序**:你可以通过官方文档或相关教程来创建你的第一个Avalonia应用,这将帮助你理解基本的应用程序结构和开发流程。 4. **XAML基础**:XAML是一种用于定义用户界面的语言,你可以学习如何使用XAML来创建界面布局和实现数据绑定。 5. **控件和样式**:Avalonia提供了丰富的控件库,你可以学习如何使用这些控件以及如何通过样式和模板来自定义它们的外观。 6. **MVVM模式**:MVVM(Model-View-ViewModel)是一种设计模式,用于分离应用程序的业务逻辑和界面表示。学习MVVM将有助于你构建可维护和可测试的应用程序。 7. **导航和多窗口**:了解如何在Avalonia中进行窗口导航和管理多个窗口,这对于构建复杂的桌面应用程序非常重要。 8. **打包和发布应用程序**:最后,你需要学习如何将你的Avalonia应用程序打包和发布,以便用户可以在他们的计算机上安装和使用你的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rotion_深

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值