Avalonia 关于ViewModel使用 MessageBox 不在父窗口正中。

Avalonia 关于ViewModel使用 MessageBox 不在父窗口正中。

仅记录一下。

由于 ViewModel中没有window,所以 在ViewModel中使用 MessageBox 就是原地弹窗,不会跟着窗体走。

但你不管其实也无伤大雅,但既然想到了不写一下还是有点小难受的,轻微强迫症。

既然ViewModel中没有,拿给他一个就完事了。

在window.axaml.cs 里给。

public XXWindow()
{
    InitializeComponent();
    XXWindowViewModel.OwnerWindow = this;
}

XXWindowViewModel.cs

public static Window? OwnerWindow { get; set; } 

private static async Task ShowMessageBox()
{
    await MessageBox.ShowAsync(
        owner: OwnerWindow!,
        message:"弹窗",
        title:"",
        icon: MessageBoxIcon.Error,
        button: MessageBoxButton.OK
    );
}

搞定。

当然 伟大的MVVM党岂会容忍ViewModel出现window这种邪恶的控件。

新建一个 interface IMessageCallback。

public interface IMessageCallback
{
    Task ShowMessageAsync(string title, string message);
}

在window的Code-Behind的 window.axaml.cs 继承和实现IMessageCallback。

public partial class AddJobWindow :UrsaWindow, IMessageCallback
{
    
    public XXWindow()
    {
        InitializeComponent();
        XXWindowViewModel.MessageCallback = this;
    }
    
    public async Task ShowMessageAsync(string title, string message)
    {
        await MessageBox.ShowAsync(this, message, title,button: MessageBoxButton.OK,icon:MessageBoxIcon.Error);
    }
}

XXWindowViewModel.cs

public static IMessageCallback? MessageCallback { get; set; }
private static void ShowMessageBox()
{
    MessageCallback!.ShowMessageAsync("", "MVVM以外都是邪教!!!");
}

好了。方法很多,这个仅是之一,还有什么容器注入,但我的构造函数还有其他用处,就不用这玩意了。

ps: 我用的是

new XXWindow() { DataContext = new XXWindowViewModel(xx, xx) };

这种方法,直接就可以用 XXWindowViewModel.OwnerWindow

如果是

var vm = new XXWindowViewModel(xx, xx)
new XXWindow(vm);

就是换一种而已。我用的看得舒服点。。也是Avalonia的写法。

posted @ 2025-04-28 02:02  三国哥哥  阅读(18)  评论(0)    收藏  举报