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的写法。
                    
                
                
            
        
浙公网安备 33010602011771号